当前位置: 首页 > 知识库问答 >
问题:

使用Apache poi将excel转换为XSSFWorkbook需要很长时间

董建茗
2023-03-14

我正在尝试将excel文件转换为XSSFWorkbook,我有大约7000行和大约145列。将excel文件转换为第2行的XSSFWorkbook大约需要15分钟,代码如下:-

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

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

如果没有,如何减少将excel转换为XSSFWorkbook所需的时间?

共有2个答案

靳睿
2023-03-14

要稍微提高超大文件的性能,只需将文件直接传递到工作簿而不是流。

从这个链接:

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

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

此外,使用WorkBookFactory更干净,因为它抽象了您正在使用的excel文件的类型:

Workbook workbook = WorkbookFactory.create(new File(filename));
党浩阔
2023-03-14

A<代码>*。xlsx文件是一个包含Excel数据的ZIP存档文件,其目录结构具有不同的XML文件。

例如,有

  • <代码>/xl/工作簿。xml描述工作簿的基本结构
  • <代码>/xl/工作表/工作表1。xml、xl/工作表/工作表2。xml<代码>/xl/工作表/表单N。包含工作表数据的xml—这里是行和单元格,但并非单元格中的所有数据都直接存储在那里。此外,单元格样式也不会直接存储在那里。-
  • <代码>/xl/样式。包含单元格样式的xml
  • <代码>/xl/共享字符串。xml,它包含所有工作表中单元格的所有字符串内容。这是为了避免在单元格中多次使用同一字符串时多次存储同一字符串

因此,如果您想读取*. xlsxZIP存档,您需要解压ZIP存档,然后至少解析上面提到的四个XML文件以获取XSSFWorkbook的数据。这就是apache poiXSSFWorkbook wb=new XSSFWorkbook(fileinputstream);时所做的。

因此,如果您确实需要一个XSSFWorkbook,那么这个过程是无法绕过的。如果您没有怀疑apache poi编程了显式延迟例程,那么就不可能减少此过程的时间量。

只读取比存储到工作表中的行少的行的方法可能会节省时间。但是,您的结果将是一个XSSFWorkbook,它包含所有样式和所有字符串内容,但只包含一些与这些样式和字符串数据相关的工作表数据。因此,它将导致XSSFWorkbook部分损坏。这就是为什么没有人真正考虑过这种方法。

只有当需求仅从/xl/workSheetN. xml之一读取普通的未格式化数据而不创建XSSFWorkbook时,您才需要解压ZIP存档,然后仅解析所需的/xl/workSheetN. xml/xl/share dStrings.xml以获取单元格的字符串内容。这将比上述整个过程的时间更短。

 类似资料:
  • 问题内容: 我正在使用以下代码: xlsx文件本身具有25,000行,每行包含500列的内容。在调试过程中,我看到创建XSSFWorkbook的第三行需要很长时间(1小时!)来完成此语句。 有没有更好的方法来访问原始xlsx文件的值? 问题答案: 首先,当您有文件时,不要从InputStream加载XSSFWorkbook!使用InputStream需要将所有内容缓冲到内存中,这会占用空间并占用时

  • 如果需要更多的细节,请让我知道。

  • 我使用javamail通过IMAP协议从exchage帐户读取邮件。这些邮件是纯格式的,内容是XML。 几乎所有这些邮件的大小都很短(通常小于100Kb)。然而,有时我不得不处理大型邮件(大约10Mb-15Mb)。例如,昨天我收到一封13Mb大小的电子邮件。仅仅读它就花了50多分钟。这正常吗?有没有办法提高它的性能?代码是: 花费如此长时间的方法是。我做错了什么?有什么提示吗? 非常感谢,我的英语

  • 问题内容: 如何转换 至 在Apache POI中? 环境 : JSE1.6 JBossAS 4.3.2 兴趣点3.7 问题答案: 此代码已改编自我在coderanch论坛上找到的内容

  • 此代码用于生成excel报告。有15列,如果记录数在1000左右,生成excel表需要近10-15分钟。上面的代码有什么问题吗?如何提高性能(Excel报告生成时间减少)?

  • 我想使用@RunFor(Parameterized.class)和 实际的测试数据应由业务人员通过Excel创建。 是否有一种简单/通用的方法可以将Apache POI XSSFSheet获取到指定的字符串数组集合? 如果是:有人能提供一个例子吗? 我发现了这个问题:使用Apache POI在TestNG中进行Datadriven测试---但我希望是一种3线测试;-)