ColdFusion电子表格内存问题

DG3*_*DG3 7 coldfusion excel coldfusion-9 cfspreadsheet

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

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

<cfsavecontent variables="REQUEST.xmlData">
<cfoutput>
<xml version="1.0"?>
<?mso-application progid="Excel.sheet"?>
<Workbook>
   ...other contents
</Workbook>
</cfoutput>
</cfsavecontent>
Run Code Online (Sandbox Code Playgroud)

对于第二种解决方法,我使用querynew来构建内容并使用在Excel中转​​储最终结果<Cfspreadsheet action="write">.对于后续的工作表,我正在使用<cfspreadsheet action="update">.最终目标是使用excel <cflocation url="excelPath">,但在这种情况下,cfspreadsheet更新将永远丢失内存错误.

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

小智 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();
}
Run Code Online (Sandbox Code Playgroud)

从测试来看,我相信 FileWriter会定期调用flush,所以我省略了它,但我找不到任何说明这种情况的文档。我从来没有见过内存使用率变得很高,但是 YMMV。