【问题标题】:Reading .xlsx file using apache poi gives org.apache.poi.POIXMLException on linux machine使用 apache poi 读取 .xlsx 文件会在 linux 机器上给出 org.apache.poi.POIXMLException
【发布时间】:2016-10-25 17:29:55
【问题描述】:

我有一个读取 .xlsx 文件并向用户显示内容的应用程序。该应用程序在 Windows 环境下运行良好。

我在 ubuntu 服务器上的 tomcat6 上部署了这个 web 应用程序的 .war 文件。我还在服务器上复制了 .xlsx 文件。

代码中文件的路径是正确的。

但是行

FileInputStream file = new FileInputStream(new File(FileName));
XSSFWorkbook workbook = new XSSFWorkbook(file);

报错

java.lang.reflect.InvocationTargetException
org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException
org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:62)
org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:403)
org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:155)
org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:207)
com.qm.action.GetProjectNames.execute(GetProjectNames.java:107)

我已检查变量 FileName 是否包含服务器上文件的正确路径和文件名(/usr/local/Metrics/MetricFiles/FY2013_Q2_GIT_Review_Metrics_by_LSS-GC.xlsx)

由于 ubunut 服务器是一个虚拟机,我使用 WinSCP 复制了 .xlsx 文件。文件的大小也是正确的。

为什么linux平台会出现这个错误?

添加额外的异常跟踪

Caused by: java.lang.reflect.InvocationTargetException at 
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at 
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at 
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at 
java.lang.reflect.Constructor.newInstance(Constructor.java:525) at 
org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:60) ... 68 more 
Caused by: java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOfRange(Arrays.java:2694) at java.lang.String.<init>(String.java:203) at 
org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseCdataLiteral(PiccoloLexer.java:3027) at 
org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseQuotedTagValue(PiccoloLexer.java:2936) at 
org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseAttributesNS(PiccoloLexer.java:1754) at 
org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseOpenTagNS(PiccoloLexer.java:1521) at 
org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseTagNS(PiccoloLexer.java:1362) at 
org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.yylex(PiccoloLexer.java:4678) at 
org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yylex(Piccolo.java:1290) at 
org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yyparse(Piccolo.java:1400) at 
org.apache.xmlbeans.impl.piccolo.xml.Piccolo.parse(Piccolo.java:714) at 
org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3439) at 
org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1270) at 
org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1257) at 
org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345) at 
org.openxmlformats.schemas.spreadsheetml.x2006.main.StyleSheetDocument$Factory.parse(Unknown Source) at 
org.apache.poi.xssf.model.StylesTable.readFrom(StylesTable.java:121) at 
org.apache.poi.xssf.model.StylesTable.<init>(StylesTable.java:92) at 
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at 
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at 
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at 
java.lang.reflect.Constructor.newInstance(Constructor.java:525) at 
org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:60) at 
org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:403) at 
org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:155) at 
org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:207) at 
com.qm.action.GetProjectNames.execute(GetProjectNames.java:107) at 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at 
java.lang.reflect.Method.invoke(Method.java:601) at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452)

【问题讨论】:

  • 这似乎是例外中无聊的一半......剩下的部分是什么? (由部分引起的会告诉你真正的问题)
  • 这个 Apache POI API 对 .xls 文件运行良好,但 .xlsx 文件似乎有问题,我在读取 .xlsx 但能够读取 .xls 文件时遇到了类似的异常
  • @Satya .. Apache POI 对我来说适用于 Windows 平台上的 .xlsx 文件。您是否在所有平台上都使用 apache poi 遇到了这个异常?
  • @Gagravarr 。我添加了额外的异常跟踪。它表明内存不足异常。我正在阅读的文件大约为 1MB。读取这种大小的文件是否也会产生 java 堆空间错误?
  • 您是否尝试增加堆大小?如果你没有给 Java 足够的内存,这是正常的解决方法......

标签: java ubuntu apache-poi xlsx


【解决方案1】:

提升对答案的评论...

堆栈跟踪的关键部分是:

Caused by: java.lang.OutOfMemoryError: Java heap space at 
java.util.Arrays.copyOfRange(Arrays.java:2694)

这告诉我们 Java 没有分配足够的内存来存储处理文件所需的所有数据

如果您在增加 JVM 堆大小方面需要帮助,我建议您查看 this previous questionthis one,它们都可以帮助您完成所有操作。

【讨论】:

    【解决方案2】:

    读取 .xlsx 文件时我也遇到了同样的异常

    org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException
    Caused By :java.lang.NoSuchMethodError: org.apache.xmlbeans.XmlBeans.typeSystemForClassLoadern
    

    然后我已经删除了我的旧 xmlbeans-2.0.jar 并放置了包含此方法的最新 xmlbeans-2.3.0.jar,现在已解决

    【讨论】:

    • 这正是我的问题,虽然我的错误略有不同(不是内存不足,而是 InvocationTargetException)。删除旧的 xmlbeans 对我有用。
    【解决方案3】:

    我在项目中插入了org.apache.xmlbeans。它有帮助。

    【讨论】:

      【解决方案4】:

      像其他人一样回答: 添加此依赖项:

      <dependency>
          <groupId>org.apache.xmlbeans</groupId>
          <artifactId>xmlbeans</artifactId>
          <version>2.6.0</version>
      </dependency>
      

      之后就可以使用了。

      其实 poi-ooxml 需要 poi 和 poi-ooxml-schemas 但 poi-ooxml-schemas 需要 xmlbeans

      您可以在此页面查看这些先决条件 https://poi.apache.org/overview.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多