使用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 poi
在XSSFWorkbook 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));