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

时间:2016-02-08 05:44:03

标签: java apache-poi

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

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

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

1 个答案:

答案 0 :(得分:1)

POI包含称为" eventmodel"这是专为此目的而设计的。它提到了in the FAQ

  

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

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

  
      
  1. 我认为POI使用的内存太多了!我能做什么?   这个出现了很多,但通常原因并不是你最初的想法。因此,首先要检查的是 - 问题的根源是什么?你的档案?你的代码?你的环境?还是Apache POI?
  2.         

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