当前位置: 首页 > 知识库问答 >
问题:

如何读取大于40MB的XLSX文件

徐鸿文
2023-03-14

我正在使用apache-poiXSSF读取XLSX文件。我收到一个错误Java.lang.OutOfMemoryError:Java堆空间。后来,对java类使用-xmx1024m增加了堆大小,仍然会重复同样的错误。

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

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

共有1个答案

鲁钱明
2023-03-14

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

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

现在,reader将允许您获取不同部分的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提供)。

 类似资料:
  • 我在用图书馆 我在努力 库,但无法将其转换为工作簿 注意:在最终结果中,我希望返回XSSFWorkbook 上面的代码会内存溢出,任何帮助都将提前感谢

  • 该编码能够读取excel文件中的小数据...但不读取excel文件中的大数据文件....如何进一步修改代码?

  • 我正在使用Java开发一个web应用程序,在这里我有一个方法可以读取。使用apache poi的xlsx文件: 该方法工作正常,但是该方法处理具有数千行记录的文件的可能性有多大,例如,大约2530万行。当处理一个大文件时,我采取以下异常: 我需要知道如何避免这种错误。例如,如果有,请读取并处理该文件。xlsx 1000至1000线,或其他解决方案。

  • 问题内容: 我需要在Java应用程序中读取Excel 2007 XLSX文件。有谁知道一个很好的API来完成这项任务? 问题答案: AFAIK还没有可用的xlsx库。但是有些旧的xls: 一个库是jxls,它内部使用已经提到的POI。 其他2个链接:处理Excel文件,用于读写Excel XLS文档文件的Java库 。

  • 问题内容: 我想使用python的Pandas库读取.xlsx文件,并将数据移植到postgreSQL表中。 到目前为止,我所能做的就是: 现在,我知道该步骤已成功执行,但是我想知道如何解析已读取的excel文件,以便可以了解excel中的数据如何映射到变量数据中的数据。 我没弄错,数据就是Dataframe对象。因此,我如何解析此dataframe对象以逐行提取每一行。 问题答案: 我通常会为每

  • 因此,我一直在使用Python3.2和OpenPyXL的iterable工作簿,如这里的“优化阅读器”示例所示。 当我尝试使用此策略读取从简单文档中提取的一个或多个文件时,就会出现问题。zip存档(手动和通过python zipfile包)。当我调用我得到“A”和我得到1,当要求打印每个单元格的值时,如下所示: 它打印A1、A2、A3、A4、A5、A6和A7中的值,而不管文件实际有多大。文件本身没