以d结尾的cfspreadsheet字母数字值

<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:dwdwtestdanabc.xls";

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

ColdFusion建立:版本9,0,1,274733
版企业版
操作系统Windows 2003
OS版本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也只显示数字。


这里的问题是,POI将F和D解释为Java所具有的单精度/双精度后缀。 在此处查看文档。

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


使用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的显示。


如果米格尔回答,我会将其标记为正确。 这个答案的目的是展示我尝试过的各种事物以及它们如何变成现实。

<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:dwdwtestdanabc.xls";

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

任何使用SpreadsheetCellValue的都会显示引号,加上我用来试图转义它们的反斜杠。 如上所述,使用三引号的SpreadsheetSetCellFormula是唯一可以在100%的时间内实现预期结果的方法。

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

链接地址: http://www.djcxy.com/p/70179.html

上一篇: cfspreadsheet alphanumeric values ending in d

下一篇: Should C++ namespace aliasing be used in header files?