2010-06-20 15 views
5

Estoy usando SpreadsheetFormatColumns() para formatear las columnas en una hoja de cálculo en "texto", pero no sé cómo hacer esto, todos los formatos en los livedocs son para números, monedas o fechas ... ¿hay algo como¿Cómo formatear columnas de hoja de cálculo usando ColdFusion?

SpreadsheetFormatColumns (mySpreadsheet, {dataFormat = "text"}, "1-15")

por ahí? esto es realmente me molesta ...

Gracias

Respuesta

1

Según this chart uso '@' (sin comillas) para el marcador de posición.

+0

Gracias, resulta que 'texto' también es una posibilidad (el mismo resultado) pero deben llamarse DESPUÉS de llenar las filas (lo cual no tiene sentido en mi opinión) desde ahora en vez de tener '01050094071094340000' (la salida deseada) Tengo '1.050094071094339e + 18' esto parece un GRAN problema (al menos para mí) Usando un formato regular "automático", eliminará todos los ceros a la izquierda – raulriera

7

En ColdFusion 9.0.1 (es decir, el actualizador 1), si utiliza SpreadsheetSetCellValue() respetará el formato que ha configurado previamente. Así que para forzar una columna a ser texto al rellenar una hoja se puede utilizar un proceso de 3 pasos:

  1. pueblan la hoja de cálculo, haciendo caso omiso de los valores de los números incorrectamente interpretados.
  2. Formatee la columna que desea como texto.
  3. Reemplace el valor incorrecto en cada fila de la columna con el valor correcto, que ahora se tratará como texto.

He aquí un ejemplo que se puede copiar en un .cfm y ejecutar tal cual (requiere 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"> 

Por defecto, tanto de los valores de la primera columna de mi consulta sería ser tratado como números (el segundo como HEX). Usando este método ambos preservan su valor original como texto.

+1

Para un seguimiento y más detalles, vea esto publicación de blog: http://cfsimplicity.com/16/forcing-values-to-be-inserted-into-spreadsheets-as-text – CfSimplicity

+0

Buena explicación. Aunque parece extraño, el formato todavía * no * se respeta cuando se usan objetos de consulta, es decir, SpreadSheetAddRows (hoja, consulta). Hora de buscar en la base de datos de errores;) – Leigh

Cuestiones relacionadas