В ColdFusion 9.0.1 (т. Е. Updater 1), если вы используете SpreadsheetSetCellValue (), он будет соответствовать формату, который вы ранее установили. Таким образом, чтобы заполнить столбец текстом при заполнении листа, вы можете использовать трехэтапный процесс:
- Заполните электронную таблицу, игнорируя неверно интерпретированные числовые значения.
- Отформатируйте нужный столбец как текст.
- Замените неправильное значение в каждой строке столбца на правильное значение, которое теперь будет обрабатываться как текст.
Вот пример, который вы можете скопировать в .cfm и запустить как есть (требуется CF9.0.1)
<cfscript>
// Create a 2 column, 2 row query. The first column contains numbers or possible numbers we want formatted as text in our spreadsheet
q = QueryNew( "" );
QueryAddColumn( q,"NumbersAsText","VarChar",[ 01050094071094340000,"743059E6" ] );
QueryAddColumn( q,"Text","VarChar",[ "abc","def" ] );
// Get the column names as an array so we can get at them more easily later
columns = q.getMetaData().getColumnLabels();
// Create a new spreadsheet object
sheet = SpreadSheetNew( "test" );
// specify the column we want formatted as text
forceTextColumnNumber = 1;
// Use the query column names as column headers in our sheet
SpreadSheetAddRow( sheet,q.columnList );
// Add the data: the numbers will be inserted as numeric for now
SpreadSheetAddRows( sheet,q );
// Now we format the column as text
SpreadSheetFormatColumn( sheet,{ dataformat="text" },forceTextColumnNumber );
// Having formatted the column, add the column from our query again so the values correct
while( q.next() )
{
// Skip the header row by adding one
rownumber = ( q.currentrow + 1 );
// Get the value of column at the current row in the loop
value = q[ columns[ forceTextColumnNumber ] ][ q.currentrow ];
// replace the previously added numeric value which will now be treated as text
SpreadsheetSetCellValue( sheet,value,rownumber,forceTextColumnNumber );
}
// Download the object as a file
sheetAsBinary = SpreadSheetReadBinary( sheet );
filename = "test.xls";
</cfscript>
<cfheader name="Content-Disposition" value="attachment; filename=#Chr(34)##filename##Chr(34)#">
<cfcontent type="application/msexcel" variable="#sheetAsBinary#" reset="true">
По умолчанию оба значения в первом столбце моего запроса будут обрабатываться как числа (второе - как HEX). Используя этот метод, оба сохраняют свое первоначальное значение как текст.