我们有一个预先创建了花式图表和交叉引用工作表公式的Excel文件,其中还包含宏。源数据应该被复制粘贴到一个工作表中,而工作簿的其余部分则从预先存在的连接中自动填充。请注意:我真的不关心阅读/修改此工作簿中的其他工作表,我只需要保存每次将原始数据复制粘贴到此工作簿的数据工作表中所需的痛苦。
我正在使用Apache POI并尝试从这个“模板”Excel文件创建XSSFWorkbook实例。然而,构建此对象需要很长时间(在许多运行中保持一致的近一分钟)。Excel文件本身只有约400KB,不是一个大文件。我使用jconsole进行了分析,似乎它既没有受到CPU的限制,也没有受到堆的限制-它只使用了约90MB的堆内存(我已经使用2GB的承诺堆启动了它)和大约52%的CPU。
实际上,将原始数据填充到数据工作表中并将最终更新的文件写出只需要非常短的时间(大约3-4秒)。以下是我的启动代码:
我曾考虑只加载一次TEMPLATE_WORKBOOK,然后重复使用同一个句柄来为每个后续请求编写新数据 - 我在我的主类中使用了sleep和while循环来模拟。但是显然我不能这样做,我得到了一个异常信息 "Exception in thread "main" org.apache.xmlbeans.impl.values.XmlValueDisconnectedException"。TEMPLATE_WORKBOOK对象不可重用。
我看到有基于事件的API,但在深入研究它之前,我想知道是否遗漏了什么!再次强调,内存/CPU并不是问题,我们有足够多的堆空间。我正在尝试缩短时间。
附言:我尝试过这里的提示:XSSFWorkbook takes a lot of time to load - 但对启动时间没有帮助。
我正在使用Apache POI并尝试从这个“模板”Excel文件创建XSSFWorkbook实例。然而,构建此对象需要很长时间(在许多运行中保持一致的近一分钟)。Excel文件本身只有约400KB,不是一个大文件。我使用jconsole进行了分析,似乎它既没有受到CPU的限制,也没有受到堆的限制-它只使用了约90MB的堆内存(我已经使用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,然后重复使用同一个句柄来为每个后续请求编写新数据 - 我在我的主类中使用了sleep和while循环来模拟。但是显然我不能这样做,我得到了一个异常信息 "Exception in thread "main" org.apache.xmlbeans.impl.values.XmlValueDisconnectedException"。TEMPLATE_WORKBOOK对象不可重用。
我看到有基于事件的API,但在深入研究它之前,我想知道是否遗漏了什么!再次强调,内存/CPU并不是问题,我们有足够多的堆空间。我正在尝试缩短时间。
附言:我尝试过这里的提示:XSSFWorkbook takes a lot of time to load - 但对启动时间没有帮助。