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

我正在使用apache-POI XSSF来读取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); 

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

POI允许您以流方式读取Excel文件。 API几乎是SAX的包装器。 确保使用带有String的构造函数以正确的方式打开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提供)。