2010-11-21 38 views
7

estoy tratando de leer algunos archivos de Excel con phpexcel, que funciona bien hasta el momento. phpexcel es un poco demasiado inteligente y elimina los ceros iniciales de mis celdas. Supongo que necesito decirle que trate la celda como una cadena de texto, no como general o como número. pero he fallado Incluso encontré hilos en stackoverflow sobre esto, pero las soluciones sugeridas simplemente no funcionarían.formatos de celda en phpexcel

a continuación es un fragmento de las cosas en las que estoy trabajando.

foreach(@$objWorksheet->getRowIterator() as $row){ 
    $cellIterator = $row->getCellIterator(); 
    $cellIterator->setIterateOnlyExistingCells(false); 
    foreach($cellIterator as $cell){ 
     #$objWorksheet->getStyle($cell->getCoordinate())->getNumberFormat()->setFormatCode('@'); 
     $cells[] = $cell->getValue(); 
    } 
} 

¿idea? No quiero limitarme solo a leer contenido numérico, ya que no tengo control sobre lo que subirán los usuarios. tratar todo como cadenas sería perfecto.

/peder

Respuesta

3

El método getValue() hace exactamente lo que debe hacer, sin tratando de ser inteligente. Devuelve el valor real almacenado en la celda. Si esa celda contiene un número entero, devuelve un número entero; si la celda contiene un flotador, devuelve un flotador; si contiene una cadena, devuelve una cadena. Ser inteligente es devolver ese valor como una cadena formateada (con ceros a la izquierda si corresponde), entonces necesita usar un método bastante diferente y aplicar el formato de celda al valor devuelto.

foreach($cellIterator as $cell){ 
    $cells[] = PHPExcel_Style_NumberFormat::toFormattedString($cell->getValue(), 
       $objPHPExcel->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode() 
    ); 
} 

o si la celda contiene una fórmula:

foreach($cellIterator as $cell){ 
    $cells[] = PHPExcel_Style_NumberFormat::toFormattedString($cell->getCalculatedValue(), 
       $objPHPExcel->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode() 
    ); 
} 

Y por favor, no use @ para tratar de eliminar los errores. PHPExcel arroja excepciones, y realmente debería querer atrapar estos.

Sin embargo, para lo que está haciendo, puede considerar el método toRay() de la hoja de cálculo, que devolverá una matriz de todos los valores de celda en la hoja de trabajo.

+0

gracias, todo lo bueno. pero - aplica esto e intentó analizar un archivo csv, pero parece que todas mis celdas están formateadas como "generales". archivo se ve así: http://dl.dropbox.com/u/252696/csv.csv es esta una limitación del formato csv, y si es así, ¿no sería mejor si phpexcel acaba de devolver el contenido de las celdas ? – fjallstrom

+0

Si PHPExcel simplemente devolviera las "cadenas", habría perdido toda su capacidad para procesar los datos de las hojas de cálculo de Excel.Si solo intenta leer un archivo CSV en una matriz, su mejor opción son las funciones integradas de manejo de csv de PHP, como fgetcsv() –

+0

. Si desea que PHPExcel trate la entrada del archivo CSV como cadenas en lugar de números, entonces puede escribir un simple "filtro de lectura" que asegure que todas las entradas del archivo se tratan como cadenas. –

1

Hay algo más fácil que esos Iteradores. Para hacer foreach También puede utilizar el método toArray, en el ejemplo:

$active_sheet = $objPHPExcel -> getActiveSheet(); 
foreach($active_sheet -> toArray() as $row_n => $row){ 
foreach($row as $cell_n => $cell){ 
    // operations here 
} 
} 

funcionó bien para mí y también parece ser más rápido que los iteradores, al igual que la marca de Baker triste.

Al procesar CVS Veo un problema principal: el usuario tiene que exportar datos de Excel y este proceso puede ser confuso para la mayoría de ellos. Es por eso que busqué solución para importar directamente desde Excel.

El uso de esos iteradores es algo extraño para mí y realmente no me metí mucho en eso. Al acceder a los datos mediante el uso de iterador, devuelve pocos (de 2 a 4 en mi caso) objetos serializados y obtener datos de ellos era una pesadilla.

1

ninguna de las soluciones proporcionadas trabajó para mí (importación CSV con PHPExcel v1.7.5) i resuelto por ligante valor establecido de esta manera:

PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_StringValueBinder()); 

antes PHPExcel_IOFactory::createReader('CSV')

Cuestiones relacionadas