对于.xlsm工作簿来说,构建XSSFWorkbook非常慢

时间:2012-08-23 12:24:17

标签: java apache-poi

我们有一个excel文件,它是使用花式图表和交叉引用表单的公式预先创建的。它还包含宏。源数据应该被复制粘贴到一个工作表中,其余的工作簿从预先存在的布线中填充。

注意:我真的不在乎阅读/修改此工作簿中的其他工作表,我只需要将每次复制粘贴原始数据的麻烦保存到此工作簿中的此数据表中

我正在使用Apache POI并尝试从此“模板”excel文件创建XSSFWorkbook实例。但是,要构建此对象需要很长时间(在多次运行中始终保持差不多一分钟)。 excel文件本身只有大约400KB,而不是一个大文件。我使用jconsole来描述它,看起来它不受CPU或堆的限制 - 它只使用大约90 MB的堆内存(我已经启动了2GB承诺堆)和大约52%的CPU。

实际使用原始数据填充数据表并将最终更新的文件写出(大约3-4秒)需要很短的时间。这是我的启动代码:

public static void startup() throws FileNotFoundException, IOException {
    long start = System.nanoTime();
    System.out.println("Started...");
    TEMPLATE_WORKBOOK = new XSSFWorkbook(new FileInputStream(new File(TEMPLATE)));
    long end = (System.nanoTime() - start) / NANOS;
    System.out.println("It took " + end + " seconds..");
}

我想过加载一次这个TEMPLATE_WORKBOOK,然后重复使用相同的句柄为每个后续请求写入新数据 - 我在我的主类中用睡眠和永远模拟它。但我显然不能这样做,我得到一个异常“线程中的异常”主“org.apache.xmlbeans.impl.values.XmlValueDisconnectedException”。 TEMPLATE_WORKBOOK对象不可重用。

我确实看到有一个基于事件的API,但在我进入之前,我想看看我是否在这里遗漏了一些东西!同样,内存/ CPU在这里不是问题,我们有足够的堆来备用。我正在努力缩短时间。

P.S:我在这里尝试了一些提示:XSSFWorkbook takes a lot of time to load - 他们没有帮助启动时间。

1 个答案:

答案 0 :(得分:1)

我认为你对自己想做的事情处境不利。我遇到了同样的问题(见here),遗憾的是你的情况没有解决方案。

即使您希望在数据表中找到合适的内容,唯一可行的方法是将文件打开为XSSFWorkbook,即使在基于事件的API中也是如此。

无法从File,InputStream或OPCPackage构造SXSSFWorkbook。您只能从头开始构建它或从XSSFWorkbook构建它。

唯一真正 aweful 时间消耗可能的解决方案(我不知道是否可能)是尝试使用读取解析器输入数据,这意味着您应该自己将excel文件解析为xml。

我们的最终解决方案是等待我们解决问题的方法。

很抱歉,您无法得到您想要的答案。