3

我看过这篇文章,但看起来确实有解决方案。无论如何,我正在使用 ColdFusion 10 生成 Excel 电子表格。但是,当我使用 SpreadsheetFormatRow() 并传入要格式化的行时,它只执行大约 3 次然后突然停止。这是一个例子......

ColdFusion 代码

<cfscript>

    rowCount = 1;
    headingRows = 4;

    // Create instance of new Spreadsheet
    excelSheet = SpreadsheetNew("ReportName",false); 

    // HEADING (IMAGE) ROW FORMAT
    formatHeadingRow = StructNew();
    formatHeadingRow.fgcolor="blue";        

    // Add rows to fill the header area (must add as many as we are spanning with the above image)
    for (x=0;x<headingRows;x++) {
        SpreadsheetAddRow(excelSheet,"TEST,TEST,TEST,TEST,TEST,TEST,TEST,TEST,TEST,TEST,TEST,TEST");
        SpreadsheetFormatRow(excelSheet,formatHeadingRow,rowCount);
        rowCount++;
    }

</cfscript>

<!--- stream it to the browser --->
<cfheader name="Content-Disposition" value="inline; filename=reportName.xls">
<cfcontent type="application/vnd.ms-excel" variable="#SpreadSheetReadBinary(excelSheet)#">

这是生成的 Excel 工作表的屏幕截图

在此处输入图像描述

为什么格式化在 X 行和单元格数后停止?如果我切换到使用 XML 格式

excelSheet = SpreadsheetNew("ReportName",true);

它工作正常。但是,我正在为我的颜色使用自定义调色板,所以我不认为切换到 XLSX 格式对我有用。当我尝试然后打电话时

palette = excelSheet.getWorkbook().getCustomPalette();

我收到一条错误消息,指出 getCustomPalette() 方法未定义。

coldfusion.runtime.java.MethodSelectionException: The getcustompalette method was not found

谁能帮我解决这个问题?谢谢!!!

甚至更好,因为它适用于 XML 格式,任何人都可以展示如何使用带有 XLSX(xml 格式)的自定义调色板的示例

4

2 回答 2

3

由于您对所有行应用完全相同的格式,因此只执行一次,而不是每行。在循环后使用SpreadsheetFormatCellRange应该可以解决问题:

SpreadsheetFormatCellRange(excelSheet
                             , formatHeadingRow
                              , startRow
                              , startCol
                              , endRow
                              , endCol ); 

怀疑这个问题与Excel 的最大样式限制有关。由于 CF 是一个黑匣子,因此很难知道它实际创建了多少样式或它们是如何应用的。但是,根据我的经验,很容易在不知情的情况下超出样式限制。特别是在使用较旧的 .xls 文件格式时,其限制要低得多。这就是为什么我建议改用较新的 .xlsx 格式

getCustomPalette() 方法未定义。

正确的。它在 XSSF 中不存在。是否有某些原因需要自定义调色板,而不是像其他线程中提到的那样仅定义自己的颜色?

于 2016-06-14T18:57:14.877 回答
3

这是我在处理来自 CF 的 xls 文件时经常看到的问题;他们似乎在一定数量的单元格后停止应用样式。我已经能够通过输出到 xlsx 来解决它。(通过这样做,我能够复制并“修复”您的问题。)

excelSheet = SpreadsheetNew("ReportName",true); 

...

<cfheader name="Content-Disposition" value="inline; filename=reportName.xlsx">
<cfcontent type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        variable="#SpreadSheetReadBinary(excelSheet)#">
于 2016-06-14T17:48:56.943 回答