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

标签 java excel apache-poi performance-testing fileinputstream

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

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

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

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

最佳答案

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

例如有

  • /xl/workbook.xml 描述基本工作簿结构,
  • /xl/worksheets/sheet1.xml/xl/worksheets/sheet2.xml、... /xl/worksheets/sheetN.xml 包含工作表数据 - 以下是行 并且单元格但并非单元格内的所有数据都直接存储 那里。此外,单元格样式并不直接存储在那里。 - ,
  • /xl/styles.xml 其中包含单元格样式,
  • /xl/sharedStrings.xml 其中包含单元格的所有字符串内容 所有床单。这是为了避免多次存储相同的字符串 如果此字符串在单元格中多次使用,则为 times。

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

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

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

仅当要求仅从 /xl/worksheets/sheetN.xml 之一读取纯未格式化数据时创建 XSSFWorkbook,那么您只需要解压 ZIP 存档,然后仅解析所需的 /xl/worksheets/sheetN.xml/xl/sharedStrings.xml 从中获取单元格的字符串内容。与上述整个过程相比,这将在更短的时间内完成。

关于java - 使用 Apache poi 将 excel 转换为 XSSFWorkbook 需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46131692/

相关文章:

vba - 使用唯一名称保存生成的 Word 文件 (mailmerge)

Excel:基于一列值和另一列类别创建列

java - Apache POI - 将数字作为整数

java - Hibernate + MySQL - 如何获得不可猜测的生成 ID?

java - Tomcat上出现奇怪的jdbcReam异常

java - java中如何从文件中读取一行

vba - 加快删除重复项

java - Grails 项目 : Gorm or JPA/Hibernate annotations for legacy db mapping?

java - Apache POI 奇怪的数字格式

Java Apache POI : create excel with cell values auto typed