使用Apache poi花费很长时间将excel转换为XSSFWorkbook

我试图将Excel文件转换为XSSFWorkbook,我有大约7000行和大约145列。 这需要大约15分钟将该excel文件转换为XSSFWorkbook在行号2,在我的代码如下: –

InputStream fs = new FileInputStream(filename); // (1) XSSFWorkbook wb = new XSSFWorkbook(fs); // (2) XSSFSheet sheet = wb.getSheetAt(0); 

而不是向XFFSWorkbook添加7000行,我只想在XFFSWorkbook中添加30行,而在第2行转换?

如果不是,我怎样才能减less将Excel转换为XSSFWorkbook的时间?

一个*.xlsx文件是一个ZIP文件,其中包含具有不同XML文件的目录结构中的Excel数据。

例如有

  • 描述基本工作簿结构的/xl/workbook.xml
  • /xl/worksheets/sheet1.xml ,… /xl/worksheets/sheetN.xml具有工作表数据 – 以下是行和单元格,但不是单元格中的所有数据都是直接存储在那里。 单元格样式也不直接存储在那里。 – ,
  • /xl/styles.xml包含单元格样式,
  • /xl/sharedStrings.xml其中包含所有工作表中单元格的所有string内容。 这是为了避免在单元格中多次使用该string多次存储相同的string。

所以,如果你想读取*.xlsx ZIP档案,你需要解ZIP档案,然后parsing至less上面提到的四个XML文件来获取XSSFWorkbook的数据。 这是apache poiXSSFWorkbook wb = new XSSFWorkbook(fileinputstream);

所以如果你真的需要一个XSSFWorkbook作为结果,这个过程是没有办法的。 如果你不怀疑apache poi编写了明确的延迟例程,那么就不可能减less这个过程的时间。

您的方法只是读取比存储在工作表中更less的行,可能会节省时间。 但是,你的结果将是一个XSSFWorkbook包含所有的样式和所有的string内容,但只有一些表单数据与这些样式和string数据相关。 所以这会导致XSSFWorkbook部分损坏。 这就是为什么没有人真的想到这个方法。

只有当需求只是从一个/xl/worksheets/sheetN.xml读取普通的未格式化的数据而不创buildXSSFWorkbook ,则只需要解ZIP压缩文件,然后parsing所需的/xl/worksheets/sheetN.xml/xl/sharedStrings.xml来获取单元格的string内容。 这可能比上面描述的整个过程花费更less的时间。

要在非常大的文件上稍微提高性能,只需将文件直接传递到工作簿而不是stream。

从这个链接 :

打开工作簿时,可以使用.xls HSSFWorkbook或.xlsx XSSFWorkbook,可以从File或InputStream中加载工作簿。 使用File对象可以降低内存消耗,而InputStream需要更多的内存,因为它必须缓冲整个文件。

 XSSFWorkbook wb = new XSSFWorkbook(new File (filename)); // (2) XSSFSheet sheet = wb.getSheetAt(0); 

另外,使用WorkBookFactory更为清晰,因为它可以抽象出您正在使用的Excel文件的types:

 Workbook workbook = WorkbookFactory.create(new File(filename));