【问题标题】:How to Edit existing large excel file with SXSSF Streaming api如何使用 SXSSF Streaming api 编辑现有的大型 excel 文件
【发布时间】:2020-02-18 09:02:04
【问题描述】:

我有一个包含 400,000 行的大型 .xlsx excel 表。我想在这个现有的工作簿中读写。

当我尝试使用 Apache poi 在 java 中读取它时,使用以下代码:

FileInputStream fileInputStream = new FileInputStream(new File(excelPath));
Workbook wb = new XSSFWorkbook(fileInputStream);

此代码的第二行占用了高达 5GB 的 RAM。

Apache POI 提供了一个 SXSSF Streaming API 来处理大型 Excel 文件。

http://poi.apache.org/components/spreadsheet/how-to.html#sxssf

现在,当我使用没有任何参数的构造函数实例化 SXSSF 工作簿时,它会创建新的工作簿并且不会保留工作簿的现有数据。 SXSSF 工作簿的其他构造函数采用 XSSF 工作簿的实例。问题开始出现在这里。当我为我的 excel 文件创建 XSSF 工作簿实例时,RAM 变高并抛出 OUTOFMEMORY 异常。

有没有办法对现有的超过 400,000 行的大型 Excel 工作簿进行读写操作。

【问题讨论】:

  • SXSSF 仅供写作。根本不允许阅读/编辑。最多您可以实例化SXSSFWorkbook 并附加数据,但不能编辑现有数据。我有一个应用程序可以读取和编辑最大 14MB 的 excel 文件。尽管我需要添加这些命令行参数-Xms4g -Xmx12g 才能使其正常工作。 Apache poi 使​​用非常多的 RAM 来读取文件
  • 另请阅读以下答案:stackoverflow.com/questions/46146161/…stackoverflow.com/questions/55929312/… 来决定您应该使用 new XSSFWorkbook(new File("file_path")) 还是 new XSSFWorkbook(new FileInputStream(new File(excelPath)))
  • 大家感谢您的宝贵建议。有没有其他方法可以以资源高效的方式编辑现有工作簿
  • 您的文件有多大(以 MB 为单位)?通常 400k 行应该不是问题,除非你也有最大数量的列
  • @XtremeBaumer 实际上是 18 mb excel 文件

标签: java apache-poi


【解决方案1】:

查看POI的“Overview”页面底部。它有这张表:

电子表格 API 功能总结

最后一列显示SXSSF只能写文件,不能读文件。

要读取文件,流式传输,第三列显示需要使用 XSSF eventmodel

因此,要修改文件,流式传输,以免占用大量内存,您需要使用一个 API 读取并使用另一个 API 写入新文件。

【讨论】:

  • I want to read and write in this existing workbook 听起来他想编辑现有内容。这将需要 usermodel 而不是 eventmodel
  • @XtremeBaumer OP 要求 streaming 解决方案,因为文件对于 usermodel 来说太大。如果您正在流式传输,则必须从旧文件创建新文件,不能就地编辑。
  • 啊,你的意思是从源文件复制到一个新文件。那不是很清楚。虽然将所有内容从一个工作簿复制到另一个工作簿是一项相当艰巨的工作,但不一定可行(我试过了)。最后,增加应用程序的最大可用 RAM 可能更方便。
  • 实际上新创建的工作簿不包含旧工作簿的数据,直到我在 sxssf 构造函数中给出旧工作簿的实例。
  • 然而,将所有内容从一个工作簿复制到另一个工作簿时可能会遇到问题。甚至可能不需要将旧工作簿的实例传递给新的SXSSFWorkbook
猜你喜欢
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多