7
<cfscript>
Workbook = Spreadsheetnew("Workbook");
SpreadSheetSetCellValue(WorkBook, "4D", 1, 1);
// displayed 4
SpreadSheetSetCellValue(WorkBook, "4C", 1, 2);
// displayed 4C
SpreadSheetSetCellValue(WorkBook, "4E", 1, 3);
// displayed 4E
SpreadSheetSetCellValue(WorkBook, "5C", 1, 4);
// displayed 5C
SpreadSheetSetCellValue(WorkBook, "5D", 1, 5);
// displayed 5
SpreadSheetSetCellValue(WorkBook, "4d", 1, 6);
// displayed 4
MYfile = "d:\dw\dwtest\dan\abc.xls";

</cfscript>
<cfspreadsheet action="write" filename="#MYFile#" name="Workbook"  
    sheet=1 overwrite=true>

ColdFusion 设置: 版本 9,0,1,274733
企业
操作系统 Windows 2003
操作系统版本 5.2

Excel 版本 Office 2010 版本 14.0.6129.5000(32 位)。

如果您在系统上运行此代码,您会得到相同的结果吗?

更重要的是,如果你得到相同的结果,你知道该怎么做吗?

编辑

检查其他有问题的字母:

RowNumber = 1;
for (i = 65; i <= 90; i++){
SpreadSheetSetCellValue(WorkBook, chr(i), RowNumber, 1);
SpreadSheetSetCellValue(WorkBook, "4#chr(i)#", RowNumber, 2);
RowNumber ++;
}

字符串 4F 也只显示数字。

4

4 回答 4

3

这里的问题是 POI 将 F 和 D 解释为 Java 具有的单/双精度后缀。请参阅此处的文档。

我会说这是 CF 的一个错误,因为 CFML 没有这些后缀的概念(或者实际上没有单精度或双精度浮点数的概念),所以它应该确保这些字符串在传递给 POI 时被视为字符串。

于 2013-03-22T20:09:55.313 回答
1

使用 Dan 的原始代码检查麻烦的字符,我更新了它以搜索字符(通过预先或附加到给定文本来使用)来隐藏此 ColdFusion 功能:

WorkBook = spreadsheetNew('Test', true);
RowNumber = 1;  
for (i = 1; i <= 255; i++){
    SpreadSheetSetCellValue(WorkBook, i, RowNumber, 1);

    // what character are we displaying
    SpreadSheetSetCellValue(WorkBook, chr(i), RowNumber, 2);

    // see if appending chr(i) allows 4F to display
    SpreadSheetSetCellValue(WorkBook, "4F#chr(i)#", RowNumber, 3);

    // see if appending chr(i) allows 4F to display
    SpreadSheetSetCellValue(WorkBook, "#chr(i)#4F", RowNumber, 4);
    RowNumber ++;
}

结果是前置或附加不可打印字符 chr(127) 和 chr(160) 保持 4F 或 4D 的表示。

于 2013-09-11T02:17:35.000 回答
0

如果 Miguel 回答,我会将其标记为正确。这个答案的目的是展示我尝试过的各种事情以及结果如何。

<cfoutput>
<cfscript>
Workbook = Spreadsheetnew("Workbook");
RowNumber = 1;
for (i = 1; i <= 26; i++){
ThisUpperCaseLetter = chr(i + 64);
ThisLowerCaseLetter = chr(i  + 96);
SpreadSheetSetCellValue(WorkBook, ThisUpperCaseLetter, RowNumber, 1);
SpreadSheetSetCellValue(WorkBook, "4#ThisUpperCaseLetter#", RowNumber, 2);
SpreadSheetSetCellValue(WorkBook, ThisLowerCaseLetter, RowNumber, 3);
SpreadSheetSetCellValue(WorkBook, "4#ThisLowerCaseLetter#", RowNumber, 4);
SpreadSheetSetCellValue(WorkBook, "'4#ThisLowerCaseLetter#'", RowNumber, 5);
 // SpreadSheetSetCellFormula(WorkBook, "'4#ThisLowerCaseLetter#'", RowNumber, 6);  
/*
The line above threw this error
org.apache.poi.ss.formula.FormulaParser$FormulaParseException: 
Parse error near char 0 ''' in specified formula ''4a''. 
Expected number, string, or defined name 
*/

SpreadSheetSetCellValue(WorkBook, """4#ThisLowerCaseLetter#""", RowNumber, 6);
SpreadSheetSetCellValue(WorkBook, "\'4#ThisLowerCaseLetter#\'", RowNumber, 7);
      // the next line is the only one that will achieve the desired result
SpreadSheetSetCellFormula(WorkBook, """4#ThisLowerCaseLetter#""", RowNumber, 8);
RowNumber ++;
}
MYfile = "d:\dw\dwtest\dan\abc.xls";

</cfscript>
</cfoutput>
<cfspreadsheet action="write" filename="#MYFile#" name="Workbook"  
    sheet=1 overwrite=true>

任何带有 SpreadsheetCellValue 的东西都会显示引号,加上我用来试图转义它们的反斜杠。如上所述,带有三引号的 SpreadsheetSetCellFormula 似乎是 100% 的时间给出预期结果的唯一方法。

更多信息 在我的实际应用程序中,我使用 cfheader/cfcontent 来提供文件。如果我选择打开,使用 IE9,Excel 会显示危险内容警告并为我提供启用编辑的按钮。此外,使用 SpreadSheetSetCellFormula() 创建的任何单元格都显示数字 0。选择该单元格会在 excel 值框中显示实际值,或者任何所谓的值。此外,启用编辑会将显示更改为预期值。

于 2013-03-21T18:05:22.433 回答
0

FWIW,CF11+ 为SpreadSheetSetCellValue引入了一个新的数据类型属性。使用“字符串”类型保留原始值并产生预期结果,即“4D”

SpreadSheetSetCellValue(WorkBook, "4D", 1, 1, "string");
于 2016-10-12T01:52:31.667 回答