2013-03-21 1 views
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 Setttings: Version 9,0,1,274733
издание Enterprise
Операционная система Windows 2003
OS версии 5,2CFSPREADSHEET буквенно-цифровые значения, заканчивающиеся в д

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 также отображается только номер.

+0

ли «D» персонажи на самом деле в клетках, а некоторые форматировании скрывают их или письма полностью отсутствуют? –

+0

Они полностью отсутствуют. –

+0

Отсутствуют символы D, я столкнулся с этим раньше, и единственным решением, которое я придумал, было ручное редактирование после создания таблицы. Это работало как одноразовый отчет. – Busches

ответ

3

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

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

+0

Lol, я сказал то же самое в предыдущих комментариях, но удалил его, поняв, что ссылка @ Miguel-F уже указала это. Я думал, что он опубликует это как ответ. О, хорошо ... слишком поздно :) Ты избил его! – Leigh

+0

Проклятье. Хотелось бы, чтобы я видел ссылку: мог спасти меня некоторое время R & D. –

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, чтобы предложить файл. Если я выберу Open, с IE9, Excel отобразит предупреждение о опасном содержании и предложит мне кнопку «Включить редактирование». Кроме того, любые ячейки, созданные с помощью SpreadSheetSetCellFormula(), отображают номер 0. Выбор ячейки показывает фактическое значение в поле значения excel или что-то, что вызвано. Кроме того, включение редактирования изменяет отображение на ожидаемые значения.

+0

Просто отметьте этот или другой ответ как правильный. В любом случае, не совсем мой ответ, я просто нашел его. Рад, что это сработало для вас. –

+0

Dan - Любопытно, любое изменение, если вы сначала форматируете ячейку, как текст? Вероятно, нет, я подозреваю, что CF преобразует '4d' в число до этого. Но стоит сделать снимок. – Leigh

+0

Leigh - Это может сработать. Не знаю, видели ли вы это, но в сообщении есть ссылка, на которую я ссылался на аналогичное решение. См. Ответ здесь http://stackoverflow.com/questions/3081202/how-to-format-spreadsheet-columns-using-coldfusion –

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.

0

FWIW, CF11 + представил новый атрибут типа данных для SpreadSheetSetCellValue.Использование типа «строка» сохраняет исходное значение и дает ожидаемый результат, т.е. «4D»

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