cfspreadsheet буквенно-цифровые значения, оканчивающиеся на d

<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
Edition Enterprise
Операционная система 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 также отображала только число.


person Dan Bracuk    schedule 21.03.2013    source источник
comment
Действительно ли символы D находятся в ячейках, и какое-то форматирование скрывает их, или буквы полностью отсутствуют?   -  person Miguel-F    schedule 21.03.2013
comment
Они полностью отсутствуют.   -  person Dan Bracuk    schedule 21.03.2013
comment
Отсутствуют символы D, я уже сталкивался с этим раньше, и единственным решением, которое я придумал, было ручное редактирование после создания электронной таблицы. Что сработало, так как это был одноразовый отчет.   -  person Busches    schedule 21.03.2013
comment
Мой отчет будет востребован. Я могу добавить точку, если последними символами являются D или F, но это немного хак.   -  person Dan Bracuk    schedule 21.03.2013
comment
Ты не единственный. Проверьте этот другой пост stackoverflow.com/questions/5346396/   -  person Miguel-F    schedule 21.03.2013
comment
(Редактировать) Упс. Я должен был прочитать всю ветку сначала. Вот что вы получаете за скимминг ;)   -  person Leigh    schedule 21.03.2013


Ответы (4)


Проблема здесь в том, что POI интерпретирует F и D как суффиксы одинарной/двойной точности, которые есть в Java. См. документы здесь.

Я бы сказал, что это ошибка CF, так как CFML не имеет концепции этих суффиксов (или даже понятия одинарной или двойной точности с плавающей запятой), поэтому он должен убедиться, что такие строки обрабатываются как строки при передаче в POI.

person Adam Cameron    schedule 22.03.2013
comment
Лол, я сказал то же самое в предыдущих комментариях, но удалил его, когда понял, что ссылка @Miguel-F уже указывала на это. Я был уверен, что он опубликует это как ответ. Ну что ж... слишком поздно :) Ты его опередил! - person Leigh; 24.03.2013
comment
Черт. Жаль, что я не видел ссылку: это сэкономило мне время на исследования и разработки. - person Adam Cameron; 24.03.2013

Используя исходный код Дэна для проверки проблемных символов, я обновил его для поиска символов (для использования путем добавления или добавления к заданному тексту), чтобы скрыть эту функцию 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.

person John Hodorowicz    schedule 11.09.2013

Если Мигель ответит, я отмечу его как правильный. Цель этого ответа - показать различные вещи, которые я пробовал, и что из этого получилось.

<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 или как там оно называется. Кроме того, включение редактирования изменяет отображение на ожидаемые значения.

person Dan Bracuk    schedule 21.03.2013
comment
Просто отметьте тот или иной ответ как правильный. В любом случае, это не совсем мой ответ, я просто нашел его. Рад, что это сработало для вас. - person Miguel-F; 21.03.2013
comment
Дэн – Просто любопытно, есть ли изменения, если вы сначала отформатируете ячейку как текст? Вероятно, нет, я подозреваю, что CF преобразует 4d в число задолго до этого. Но стоит попробовать. - person Leigh; 21.03.2013
comment
Ли – Это тоже может сработать. Не знаю, видели ли вы это, но в сообщении была ссылка, на которую я ссылался на подобное решение. См. ответ здесь stackoverflow.com /вопросы/3081202/ - person Miguel-F; 21.03.2013
comment
@Leigh, когда я добавил SpreadsheetFormatColumn(Workbook,{dataformat=text}, 2); к приведенному выше коду результаты не изменились. - person Dan Bracuk; 21.03.2013
comment
@ Miguel-F - О да, теперь я это помню. Разные версии имеют разные особенности. Так что мне было просто любопытно, имеет ли это какое-то значение в версии Дэна. (Я не могу проверить это прямо сейчас) @ Дэн - Это то, чего я боялся - я надеялся, что 9.0.1 учел формат целевой ячейки перед преобразованием значения, но, очевидно, нет. Спасибо за подтверждение. - person Leigh; 21.03.2013