我正在尝试将 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 poi
在 XSSFWorkbook 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/