首页 文章

使用apache POI将xlsx文件分页到XSSFworkbook

提问于
浏览
0

现在在我的代码中,我正在读取xlsx文件,进入XSSFWorkbook,然后最终将其写入数据库 . 但是,当xlsx文件的大小增加时,它会导致outOfMemory错误 . 我无法增加服务器大小,或将xlsx文件分成几部分 . 我尝试使用文件(而不是输入流)加载工作簿,但这也没有帮助 .

我正在寻找一种方法一次读取10k行(而不是一次读取整个文件)并迭代地写入工作簿,然后写入数据库 .

使用Apache POI有一个很好的方法吗?

1 回答

  • 1

    POI包含一个名为"eventmodel"的东西,它正是为此目的而设计的 . 它被提到in the FAQ

    SS eventmodel包是一个用于读取Excel文件而不将整个电子表格加载到内存中的API . 它确实需要用户方面的更多知识,但是将内存消耗减少了十倍以上 . 它基于AWT事件模型与SAX的结合 . 如果您需要只读访问权限,这是最好的方法 .

    但是,如果问题出在其他地方,您可能需要先仔细检查 . 看看this item

    我认为POI使用的内存过多!我能做什么?这个出现了很多,但通常原因不是你最初想的 . 所以,首先要检查的是 - 问题的根源是什么?你的档案?你的代码?你的环境?还是Apache POI? (如果你在这里,你可能认为它是Apache POI . 但是,它通常不是!一个温和的笔记本电脑,具有体面但不过多的堆大小,从一开始,通常可以读取或写入100列的文件在几秒钟内完成100,000行,包括启动JVM的时间 . Apache POI附带了一些程序和一些示例程序,可用于执行一些基本的性能检查 . 对于测试文件生成,要使用的类在示例包SSPerformanceTest中 . 使用写入类型(HSSF,XSSF或SXSSF)的参数,行数,列数以及是否应保存文件来运行SSPerformanceTest . 如果你不能在3秒内在HSSF和SXSSF中运行50,000行和50列,并且XSSF在10秒内运行(理想情况下全部3比不到那么!),那么问题在于您的环境 . 接下来,使用示例程序ToCSV尝试使用HSSF或XSSF读取文件 . 相关的是XLSX2CSV,它对.xlsx使用SAX解析 . 对您的问题文件以及由相同大小的SSPerformanceTest生成的简单文件运行此操作 . 如果这很慢,那么可能存在关于如何处理文件的Apache POI问题(POI做出一些假设,这些假设在所有文件上可能并不总是正确的) . 如果这些测试很快,那么代码中就存在任何性能问题!

相关问题