java - 使用 apache poi 读取 .xlsx 文件在 linux 机器上给出 org.apache.poi.POIXMLException

标签 java ubuntu apache-poi xlsx

我有一个应用程序可以读取 .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)

最佳答案

将评论提升为答案...

堆栈跟踪的关键部分,它解释了损坏的内容和原因,是:

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

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

如果您在增加 JVM 堆大小方面需要帮助,我建议您查看 this previous questionthis one ,它们都会告诉您所有的一切。

关于java - 使用 apache poi 读取 .xlsx 文件在 linux 机器上给出 org.apache.poi.POIXMLException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16688878/

相关文章:

java - mac中JAVA_HOME设置错误

ubuntu - 如何在命令提示符下获取 LDAP 中的事件连接?

windows - 与 Windows dir 命令相比,为什么运行 opendir、readdir、stat 这么慢?

flutter - 如何在远程服务器上运行 dart http 服务器

java - 使用 Apache POI 替换 powerpoint 中的所有文本

java - poi-ooxml-schemas-3.14 JAR 中缺少 STSheetViewType 类

java - 获取 java.lang.OutOfMemoryError : GC overhead limit exceeded while trying to reader a big excel file(. xlsx)

java - react native java.lang.RuntimeException : No server to serve request

java - 我正在使用 Authorize.net 支付网关并通过直接邮寄方法进行交易,是否可以仅验证卡信息

java - JavaDoc 预格式化文本 block 中允许使用 <sub> 和 <sup> 吗?