cfspreadsheet alphanumeric values ending in d

让人想犯罪 __ 提交于 2020-01-03 08:59:50

问题


<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 Setttings: Version 9,0,1,274733
Edition Enterprise
Operating System Windows 2003
OS Version 5.2

Excel Version Office 2010 Version 14.0.6129.5000 (32 bit).

If you run this code on your system, do you get the same results?

More importantly, if you get the same results, do you know what to do about it?

Edit

Checking for other problematic letters:

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

The string 4F also displayed the number only.


回答1:


The issue here is that POI is interpreting the F and D as the single/double precision suffixes that Java has. See docs here.

I would say this is a bug with CF, as CFML does not have the concept of these suffixes (or indeed the notion of single or double precision floats), so it should make sure such strings get treated as strings when being passed to POI.




回答2:


Using Dan's original code to check for troublesome characters I updated it to search for characters (to use by prepending or appending to the given text) to hide this ColdFusion feature:

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 ++;
}

Turns out prepending or appending nonprintable characters chr(127) and chr(160) maintain the presentation of 4F or 4D.




回答3:


If Miguel answers, I'll mark it as correct. The purpose of this answer is to show various things that I tried and how they turned out.

<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>

Anything with SpreadsheetCellValue would display the quotes, plus the backslash I used to attempt to escape them. As indicated above, SpreadsheetSetCellFormula with triple quotes is the only way that appears to give expected results 100% of the time.

More Info In my actual application, I use cfheader/cfcontent to offer the file. If I select Open, with IE9, Excel shows a dangerous content warning and offers me a button to Enable Editing. Also, any cells created with SpreadSheetSetCellFormula() display the number 0. Selecting the cell shows the actual value in the excel value box, or whatever that's called. Also, enabling editing changes the display to the expected values.




回答4:


FWIW, CF11+ introduced a new datatype attribute for SpreadSheetSetCellValue. Using type "string" preserves the original value and produces the expected result, ie "4D"

SpreadSheetSetCellValue(WorkBook, "4D", 1, 1, "string");


来源:https://stackoverflow.com/questions/15553674/cfspreadsheet-alphanumeric-values-ending-in-d

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!