ColdFusion电子表格内存问题

时间:2017-03-15 03:55:10

标签: excel coldfusion coldfusion-9 cfspreadsheet

我使用ColdFusion将相当少量的行(大约1000个)导出到Excel但是大量的列(大约300个)。它是一个多页Excel文件,其中至少有两个页面具有大量列。使用user_id | max_number 1 | 3 2 | 4 会抛出Java堆错误。更新JVM设置值没有显示任何改进。在不导致Java堆错误的情况下导出到Excel的最佳方法是什么?

编辑:我已经尝试了几种方法来解决程序中的问题。我正在使用cfsavecontent中的xml工作簿来构建多个工作表并使用cfcontent呈现结果。在这种情况下,cfcontent可能会使用大量内存,从而导致堆空间错误。

cfspreadsheet

对于第二种解决方法,我使用querynew构建内容并使用<cfsavecontent variables="REQUEST.xmlData"> <cfoutput> <xml version="1.0"?> <?mso-application progid="Excel.sheet"?> <Workbook> ...other contents </Workbook> </cfoutput> </cfsavecontent> 将最终结果转储到Excel中。对于后续工作表,我使用的是<Cfspreadsheet action="write">。最终目标是使用<cfspreadsheet action="update">为excel服务,但在这种情况下,cfspreadsheet更新将永远丢失内存错误。

如果更新jvm不是一个选项,那么您建议采用哪些其他方法来克服内存问题。

1 个答案:

答案 0 :(得分:1)

我参加聚会有点晚了...

据我所知,cfspreadsheet尝试在刷新到磁盘之前在内存中实现整个文件。使用cfsavecontent,您可以明确地做到这一点。

您熟悉构建Workbook XML,因此您的cfsavecontent方法所需的全部内容都流式传输到磁盘上。

这可以通过深入底层Java库来完成。 java.io.FileWriter可以追加到文件,而无需将整个文件保留在内存中:

var append = true;
var writer = createobject("java", "java.io.FileWriter").init(filename, append);
try {
  writer.append("<xml version=""1.0""?>\n<?mso-application progid=""Excel.sheet""?>\n<Workbook>\n");
  // Build your workbook in chunks
  // for (var row in query)
  //   writer.append(markup)
  writer.append("</Workbook>");
} finally {
  writer.close();
}

从测试中,我相信 FileWriter会定期调用flush,因此我省略了它,但是找不到任何说明这种情况的文档。我从未见过内存使用率很高,但是YMMV。