尝试使用POI API读取* .xlsx文件

时间:2015-11-27 11:41:16

标签: java excel apache-poi xlsx

我正在尝试读取* .xlsx文件,我在控制台中收到了很多错误。我是初学者,请注意,如果我尝试阅读* .xls文件,那我就没有问题了。

这是我使用的代码:

    public class XlsxTest {

    public static void main(String[] args) throws IOException {

        FileInputStream fis = new FileInputStream(new File("autotest2.xlsx"));
        XSSFWorkbook wb = new XSSFWorkbook(fis);
        XSSFSheet sheet = wb.getSheetAt(0);
        FormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator();

        for (Row row : sheet) {
            for (Cell cell : row) {
                switch (formulaEvaluator.evaluateInCell(cell).getCellType()) {
                case Cell.CELL_TYPE_NUMERIC:
                    System.out.println(cell.getNumericCellValue() + "\t\t");
                    break;

                case Cell.CELL_TYPE_STRING:
                    System.out.println(cell.getStringCellValue() + "\t\t");
                    break;
                }
            }

            System.out.println();
        }
    }
}

当我尝试运行时,我收到以下错误:

    Exception in thread "main" org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException
    at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:62)
    at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:465)
    at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:173)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:278)
    at XlsxTest.main(XlsxTest.java:18)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:60)
    ... 4 more
Caused by: java.lang.ExceptionInInitializerError
    at org.apache.xmlbeans.impl.schema.BuiltinSchemaTypeSystem.fillInType(BuiltinSchemaTypeSystem.java:1025)
    at org.apache.xmlbeans.impl.schema.BuiltinSchemaTypeSystem.<clinit>(BuiltinSchemaTypeSystem.java:223)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.xmlbeans.XmlBeans.getNoType(XmlBeans.java:856)
    at org.apache.xmlbeans.XmlBeans.<clinit>(XmlBeans.java:881)
    at org.openxmlformats.schemas.drawingml.x2006.main.ThemeDocument$Factory.parse(Unknown Source)
    at org.apache.poi.xssf.model.ThemesTable.<init>(ThemesTable.java:83)
    ... 9 more
Caused by: java.lang.RuntimeException: Installation Problem???  Couldn't load messages: Can't find bundle for base name org.apache.xmlbeans.impl.regex.message, locale en_US
    at org.apache.xmlbeans.impl.regex.RegexParser.setLocale(RegexParser.java:88)
    at org.apache.xmlbeans.impl.regex.RegexParser.<init>(RegexParser.java:78)
    at org.apache.xmlbeans.impl.regex.ParserForXMLSchema.<init>(ParserForXMLSchema.java:28)
    at org.apache.xmlbeans.impl.regex.RegularExpression.setPattern(RegularExpression.java:2996)
    at org.apache.xmlbeans.impl.regex.RegularExpression.setPattern(RegularExpression.java:3009)
    at org.apache.xmlbeans.impl.regex.RegularExpression.<init>(RegularExpression.java:2975)
    at org.apache.xmlbeans.impl.regex.SchemaRegularExpression.<init>(SchemaRegularExpression.java:27)
    at org.apache.xmlbeans.impl.regex.SchemaRegularExpression.<init>(SchemaRegularExpression.java:23)
    at org.apache.xmlbeans.impl.regex.SchemaRegularExpression$1.<init>(SchemaRegularExpression.java:44)
    at org.apache.xmlbeans.impl.regex.SchemaRegularExpression.buildKnownPatternMap(SchemaRegularExpression.java:43)
    at org.apache.xmlbeans.impl.regex.SchemaRegularExpression.<clinit>(SchemaRegularExpression.java:38)
    ... 19 more

任何人都可以帮我解决这个问题吗?我希望我提供了必要的信息。

谢谢!

3 个答案:

答案 0 :(得分:0)

  1. 以zip方式重命名jar文件夹,或者只需打开已加载lib的org / apache / xmlbeans / impl / regex。
  2. 查找文件message.properties(如果需要,还可以找到message_xx.properties)。
  3. 通过org / apache / xmlbeans / impl / regex路径将文件放入已使用的库中。
  4. 利润!

答案 1 :(得分:0)

在使用Apache POI时,我遇到了非常类似的异常:java.lang.ExceptionInInitializerError,由“ java.lang.RuntimeException:安装问题??????无法加载消息:找不到基本名称org的捆绑软件XMLBeans中的“ .apache.xmlbeans.impl.regex.message”。

看起来完全怪异。代码在一台机器上可以运行,但是在另一台机器上却以这种方式失败,原因不明。

经过大量调试后,我发现原因与Excel,POI或XMLBeans完全无关:我的项目位于以“!”结尾的文件夹中。。解决方案就是简单地重命名文件夹。

我想作者发生了类似的事情,确实有关Libre Office的链接文章与该问题无关。而是,链接的帖子应为以下内容:Unable to open resources in directories which end with an exclamation mark (!)

答案 2 :(得分:0)

仅在 junit 测试中出现此错误。应用程序运行得很好。所以也请检查您的情况。

为了测试,遵循 Sarck 的建议有效。 #4 有点令人困惑。所以下面是简单的过程.. 适用于 2.6 版本的 xmlbeans 库。

在失败的项目中,在 message.properties 文件夹下创建一个名为 src/test/resources/org/apache/xmlbeans/impl/regex 的文件。 (src/test/resources 是典型的 Maven 根资源文件夹)。在该文件中添加以下内容

parser.parse.1=Wrong character.
parser.parse.2=Invalid reference number.
parser.next.1=A character is required after \\.
parser.next.2='?' is not expected.  '(?:' or '(?=' or '(?!' or '(?<' or '(?#' or '(?>'?
parser.next.3='(?<=' or '(?<!' is expected.
parser.next.4=A comment is not terminated.
parser.factor.1=')' is expected.
parser.factor.2=Unexpected end of the pattern in a modifier group.
parser.factor.3=':' is expected.
parser.factor.4=Unexpected end of the pattern in a conditional group.
parser.factor.5=A back reference or an anchor or a lookahead or a lookbehind is expected in a conditional pattern.
parser.factor.6=There are more than three choices in a conditional group.
parser.atom.1=A character in U+0040-U+005f must follow \\c.
parser.atom.2=A '{' is required before a character category.
parser.atom.3=A property name is not closed by '}'.
parser.atom.4=Unexpected meta character.
parser.atom.5=Unknown property.
parser.cc.1=A POSIX character class must be closed by ':]'.
parser.cc.2=Unexpected end of the pattern in a character class.
parser.cc.3=Unknown name for a POSIX character class.
parser.cc.4='-' is invalid here.
parser.cc.5=']' is expected.
parser.cc.6='[' is invalid in a character class.  Write '\\['.
parser.cc.7=']' is invalid in a character class.  Write '\\]'.
parser.cc.8='-' is an invalid character range. Write '\\-'.
parser.ope.1='[' is expected.
parser.ope.2=')' or '-[' or '+[' or '&[' is expected.
parser.ope.3=The range end code point is less than the start code point.
parser.descape.1=Invalid Unicode hex notation.
parser.descape.2=Overflow in a hex notation.
parser.descape.3='\\x{' must be closed by '}'.
parser.descape.4=Invalid Unicode code point.
parser.descape.5=An anchor must not be here.
parser.process.1=This expression is not supported in the current option setting.
parser.quantifier.1=Invalid quantifier. A digit is expected.
parser.quantifier.2=Invalid quantifier. Invalid quantity or a '}' is missing.
parser.quantifier.3=Invalid quantifier. A digit or '}' is expected.
parser.quantifier.4=Invalid quantifier. A min quantity must be <= a max quantity.
parser.quantifier.5=Invalid quantifier. A quantity value overflow.

在同一位置将此文件复制为 message_en.properties

如果您使用的是较新版本的 xmlbeans jar,则从 Apache source - replace version in url 获取此文件的内容