2010-11-21 13 views
7

sto provando a leggere alcuni file excel con phpexcel, che funziona bene finora. phpexcel è un po 'troppo intelligente e rimuove gli zeri iniziali dalle mie celle. Immagino di doverlo dire per trattare la cella come una stringa di testo, non come generale o numero. ma ho fallito. Ho persino trovato discussioni su StackOverflow su questo argomento ma le soluzioni suggerite semplicemente non funzionerebbero.formati di celle in phpexcel

di seguito è uno snippet delle cose su cui sto lavorando.

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

qualche idea? Non voglio limitarmi a leggere solo contenuti numerici, in quanto non ho alcun controllo su ciò che gli utenti caricheranno. trattare tutto come se le corde fossero perfette.

/Peder

risposta

3

Il metodo getValue() fa esattamente quello che dovrebbe fare, senza cercare di essere intelligente. Restituisce il valore effettivo memorizzato nella cella. Se quella cella contiene un numero intero, restituisce un numero intero; se la cella contiene un float, restituisce un float; se contiene una stringa, restituisce una stringa. Essere intelligenti sta restituendo quel valore come una stringa formattata (con zero iniziale se appropriato), quindi è necessario utilizzare un metodo piuttosto diverso e applicare la formattazione della cella al valore restituito.

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

o se la cella contiene una formula:

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

E per favore non utilizzare @ per cercare di eliminare gli errori. PHPExcel genera eccezioni e dovresti davvero ingannarle.

Tuttavia, per ciò che si sta facendo, si potrebbe considerare il metodo toArray() del foglio di lavoro, che restituirà un array di tutti i valori di cella nel foglio di lavoro.

+0

grazie, tutta roba buona. ma - applicato questo e cercato di analizzare un file csv, ma sembra che tutte le mie celle siano formattate come "generali". il file assomiglia a questo: http://dl.dropbox.com/u/252696/csv.csv è una limitazione del formato csv, e se è così - non sarebbe meglio se phpexcel restituisse il contenuto delle celle ? – fjallstrom

+0

Se PHPExcel restituisse semplicemente le "stringhe", avrebbe perso tutta la sua capacità di elaborare i dati dai fogli di lavoro Excel.Se stai solo provando a leggere un file CSV in un array, la tua migliore opzione sono le funzioni di gestione csv incorporate di PHP, come fgetcsv() –

+0

Se vuoi che PHPExcel tratti l'input dal file CSV come stringhe piuttosto che come numeri, allora puoi scrivere un semplice "filtro di lettura" che garantisce che tutti gli input del file vengano trattati come stringhe. –

1

C'è qualcosa di più facile di quegli Iterator. Per fare foreach È inoltre possibile utilizzare il metodo toArray, nell'esempio:

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

funzionato bene per me e sembra anche essere più veloce poi Iteratori, proprio come Mark Baker triste.

Nell'elaborazione del CVS vedo un problema principale: l'utente deve esportare il modulo dati Excel e questo processo può confondere la maggior parte di essi. Ecco perché ho cercato la soluzione per l'importazione direttamente da Excel.

Nell'uso di quegli iteratori è qualcosa di strano per me e non ci sono riuscito molto. Durante l'accesso ai dati utilizzando iteratore, restituisce pochi oggetti serializzati (da 2 a 4 nel mio caso) e ricavarne i dati è stato un incubo.

1

nessuna delle soluzioni fornite lavorato per me (importazione CSV con PHPExcel v1.7.5) ho risolto dal valore impostato legante in questo modo:

PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_StringValueBinder()); 

prima PHPExcel_IOFactory::createReader('CSV')