Performance 读取xlsx文件时,XSSF工作簿和WorkbookFactory速度较慢

Performance 读取xlsx文件时,XSSF工作簿和WorkbookFactory速度较慢,performance,apache-poi,xlsx,xssf,Performance,Apache Poi,Xlsx,Xssf,我看到开发人员在几年前就遇到了这个问题。我研究过许多论坛和官方POI文件。尽管如此,我还没有找到答案。 所以问题是。。我尝试了以下两个片段: Workbook wb = WorkbookFactory.create(new File("spreadsheet.xlsx")); 及 这两种方法都需要大约5-6分钟(如果应用程序没有耗尽内存)来处理一个简单且相当小的电子表格.xlsx文件(200KB) 我需要做什么来解决这个问题?(我正在使用ApachePOI3.9) 该过程在以下位置需要很长时间

我看到开发人员在几年前就遇到了这个问题。我研究过许多论坛和官方POI文件。尽管如此,我还没有找到答案。 所以问题是。。我尝试了以下两个片段:

Workbook wb = WorkbookFactory.create(new File("spreadsheet.xlsx"));

这两种方法都需要大约5-6分钟(如果应用程序没有耗尽内存)来处理一个简单且相当小的电子表格.xlsx文件(200KB)

我需要做什么来解决这个问题?(我正在使用ApachePOI3.9)

该过程在以下位置需要很长时间:

public class XSSFSheet extends POIXMLDocumentPart implements Sheet{
...
protected void read(InputStream is) throws IOException {
    try {
      -->>> worksheet = WorksheetDocument.Factory.parse(is).getWorksheet();
    } catch (XmlException e){
        throw new POIXMLException(e);
    }
}
...

我无法进一步调试。VisualVM也说了同样的话

可能影响加载时间的一个因素是,数据已粘贴到工作表中,以便使用的范围包括每一行,即使用工作表时。usedrange rows count返回>1000000行。。不知道这是怎么发生的,但我发现我需要执行一个中间步骤,在加载工作簿之前,我使用一些vba脚本“清理”了它。工作簿大约有20页,每页约5000行,每一行由业务的不同部门填写,加载需要相当长的时间(可能4分钟),但在这种情况下,这是可以接受的。在我添加清洗阶段之前,它运行了30多分钟,这是不可接受的


用户运行我所指的进程,但按两个按钮。第一个打扫,第二个打扫。第一个进程使用Runtime.getruntime.exec触发,并创建一个空文本文件,除非测试文件在那里,否则第二个进程将不会运行。

我刚刚在我的机器上尝试了一个305kb.xlsx文件,它有几百mb的Java堆,POI在一秒钟内就打开了它!我只能建议你仔细检查你是否真的在运行你认为是的ApachePOI版本,然后使用探查器查看时间的去向Tanks Gagravarr。我已经将堆大小增加到512mb。我有大约25000行数据,每行有20列(只需在每个单元格中使用111列)。这需要相当长的时间。在实际情况下,我将拥有50K+行数据。我在几秒钟内打开了
xlsx
文件,其中包含超过30k行和100+列。我不知道你怎么会这么慢。我建议您尝试使用评测,看看是什么原因导致它如此缓慢。在我的计算机上,使用SSPerformanceTest,我可以在3秒内生成一个25k行20列的.xls文件,在7秒内生成一个.xlsx文件。然后,我使用ToCSV使用HSSF或XSSF将其读入并生成一个CSV,使用.xls需要4秒,使用.xlsx需要9秒。因此,问题似乎仍然在您这边,而不是Apache POI!xlsx的生成速度相当快。这只是我在阅读上遇到的问题。我在两个不同的盒子上试过,结果都一样。所以我想确保你们都使用了我上面发布的代码片段来阅读这些文件!
/*****************************/
public class XSSFSheet extends POIXMLDocumentPart implements Sheet{
...
protected void read(InputStream is) throws IOException {
    try {
      -->>> worksheet = WorksheetDocument.Factory.parse(is).getWorksheet();
    } catch (XmlException e){
        throw new POIXMLException(e);
    }
}
...