java - 如何读取大小 >40MB 的 XLSX 文件

标签 java out-of-memory xlsx

我正在使用 apache-POIXSSF 来读取 XLSX 文件。我遇到错误 java.lang.OutOfMemoryError: Java heap space。后来,使用 -Xmx1024m 为 java 类增加堆大小仍然重复相同的错误。

代码:

String filename = "D:\\filename.xlsx";
FileInputStream fis = null;
try {
   fis = new FileInputStream(filename);
   XSSFWorkbook workbook = new XSSFWorkbook(fis);

在上面的代码段中,执行在XSSFWorkbook处停止并抛出指定的错误。 有人可以建议更好的方法来读取大型 XLSX 文件。

最佳答案

POI 允许您以流式方式读取 excel 文件。 API 几乎是 SAX 的包装器。确保使用采用字符串的构造函数以正确的方式打开 OPC 包。否则您可能会立即耗尽内存。

OPCPackage pkg = OPCPackage.open(file.getPath());
XSSFReader reader = new XSSFReader(pkg);

现在,阅读器将允许您获取不同部分的 InputStreams。如果你想自己做 XML 解析(使用 SAX 或 StAX),你可以使用这些。但这需要非常熟悉格式。

一个更简单的选择是使用 XSSFSheetXMLHandler .这是一个读取第一张纸的示例:

StylesTable styles = reader.getStylesTable();
ReadOnlySharedStringsTable sharedStrings = new ReadOnlySharedStringsTable(pkg);
ContentHandler handler = new XSSFSheetXMLHandler(styles, sharedStrings, mySheetContentsHandler, true);

XMLReader parser = XMLReaderFactory.createXMLReader();
parser.setContentHandler(handler);
parser.parse(new InputSource(reader.getSheetsData().next()));

mySheetsContentHandler 应该是您自己的 XSSFSheetXMLHandler.SheetContentsHandler 实现.此类将输入行和单元格。

但是请注意,如果您的共享字符串表很大(如果您的大工作表中没有任何重复字符串,就会发生这种情况),这可能会适度消耗内存。如果内存仍然是个问题,我建议使用原始 XML 流(也由 XSSFReader 提供)。

关于java - 如何读取大小 >40MB 的 XLSX 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11345146/

相关文章:

java - 将一个数组的元素以相反顺序存储到另一个数组中

java - Netbeans 8.0 全新安装无法静默启动

安卓 ||位图图像的旋转

java - 线程中出现异常 "main"java.lang.OutOfMemoryError : GC overhead limit exceeded

google-sheets - 我在使用谷歌表格的查询功能时遇到问题

java - 如何使用 Spring 配置全局忽略 "null"或 json 中的空属性

java - 如何在 google api 图表的堆积柱形图中使用条形底部的注释显示轴值?

关于 FileOutputStream 的 java OutOfMemoryError?

r - 如何从 R 中将 Excel 工作表范围导出到图片

Laravel 中的 PHPexcel header