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
エディション Enterprise
オペレーティング システム 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 も数字のみを表示しました。

4

4 に答える 4

3

ここでの問題は、POI が F と D を Java の単精度/倍精度接尾辞として解釈していることです。こちらのドキュメントを参照してください。

CFML にはこれらの接尾辞の概念 (または実際には単精度または倍精度浮動小数点数の概念) がないため、これは CF のバグであると言えます。そのため、POI に渡されるときにそのような文字列が文字列として扱われるようにする必要があります。

于 2013-03-22T20:09:55.313 に答える
1

ダンの元のコードを使用して問題のある文字をチェックし、この 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

FWIW、CF11+ はSpreadSheetSetCellValueの新しいデータ型属性を導入しました。型 "string" を使用すると、元の値が保持され、期待される結果、つまり "4D" が生成されます。

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

ミゲルが答えたら、正解としてマークします。この回答の目的は、私が試したさまざまなことと、それらがどのようになったかを示すことです。

<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 で開く] を選択すると、危険なコンテンツの警告が表示され、[編集を有効にする] ボタンが表示されます。また、SpreadSheetSetCellFormula() で作成されたセルはすべて数値 0 を表示します。セルを選択すると、実際の値が Excel の値ボックスに表示されます。また、編集を有効にすると、表示が期待値に変わります。

于 2013-03-21T18:05:22.433 に答える