以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