【发布时间】:2018-10-31 07:46:07
【问题描述】:
我正在尝试打开一个大小为 22MB 并包含 9905 行(在我看来不是那么大)的 excel 文件。
我尝试用java apache poi这样打开它:
final File f = Utils.getFileWithRespectToJar(this, filename);
final Workbook workbook = WorkbookFactory.create(f);
final Sheet sheet = workbook.getSheetAt(0);
final int maxRowLength = sheet.getLastRowNum();
几秒钟后,java 占用了大约 3.3GB 的 RAM 和 90% 的 CPU,大约一分钟后,我的 eclipse 项目崩溃了
java.lang.OutOfMemoryError: 超出 GC 开销限制
是apache poi 表现不佳还是我做错了什么?
编辑:我之前使用的是 .xlsm 文件(启用了宏的 excel 文件)。我再次将其保存为.xlsx 文件(禁用宏)并将堆大小增加到4GB。现在,在我的 Eclipse 应用程序崩溃之前,java 占用了 4GB 的 RAM (=90%) 和 90% 的 CPU 大约 15 分钟。
我正在使用 apache poi 3.16 并更新了我的 maven pom 文件以使用 4.0.0 (最新版本),但这个新版本的工作方式不同,所以我得到了很多例外,例如:
org.apache.poi.ooxml.POIXMLException: org.apache.xmlbeans.XmlOptions.setEntityExpansionLimit(I)Lorg/apache/xmlbeans/XmlOptions; 在 org.apache.poi.ooxml.POIXMLFactory.createDocumentPart(POIXMLFactory.java:66) 在 org.apache.poi.ooxml.POIXMLDocumentPart.read(POIXMLDocumentPart.java:648) 在 org.apache.poi.ooxml.POIXMLDocument.load(POIXMLDocument.java:180) 在 org.apache.poi.xssf.usermodel.XSSFWorkbook.(XSSFWorkbook.java:286) 在 org.apache.poi.xssf.usermodel.XSSFWorkbookFactory.createWorkbook(XSSFWorkbookFactory.java:83) 在 org.apache.poi.xssf.usermodel.XSSFWorkbookFactory.createWorkbook(XSSFWorkbookFactory.java:111)
引起:java.lang.NoSuchMethodError: org.apache.xmlbeans.XmlOptions.setEntityExpansionLimit(I)Lorg/apache/xmlbeans/XmlOptions; 在 org.apache.poi.ooxml.POIXMLTypeLoader.(POIXMLTypeLoader.java:43) 在 org.apache.poi.xssf.model.ThemesTable.(ThemesTable.java:86)
【问题讨论】:
-
尝试使用 Streaming API。见:stackoverflow.com/questions/33786219/…
-
从 Excel 文件打开工作簿不仅是读取文件的字节,还创建工作簿、工作表、工作表的共享字符串、单元格中的公式之间的所有关系,单元格样式,......所以这需要多少内存取决于工作簿的内部结构以及有多少这样的关系。因此,如果没有 Excel 文件,大多数情况下都无法回答此类问题。
-
乱用不同版本的apache poi不会成功。如果使用 apache poi 3.16 会导致
GC overhead limit exceeded,那么使用 apache poi 4.0.0 也会导致这种情况。更新到最新版本会很好。但是必须更新所有依赖项。不支持不同版本的混合。 -
好的,我现在更新了我使用的所有依赖项,再试一次:)
标签: java javafx apache-poi