【发布时间】: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