Ho dovuto leggere alcune celle di un file xls, creato con excel, e visualizzarle in una pagina web.
Ho trovato questa guida semplice e ho terminato la ricerca di altre soluzioni, perciò, non so se ve ne siano altre ma questa ha fatto al caso mio.
Innanzitutto è necessaria una classe, ExcelReader.
Però il file "Excel/reader.php" però contiene un errore:
occorre modificare
require_once 'Spreadsheet/Excel/Reader/OLERead.php';
in
require_once 'oleread.inc';
Se il file non dovesse più esistere, o se volete direttamente lo zip corretto, offro io come sempre: ExcelReader.
Una volta scaricata ed estratta la classe, troveremo i file "reader.php" e "oleread.inc" dentro la directory "excel" che includeremo nel listato PHP.
Cominciamo!
Per inizializzare la classe:
$data->read('file_excel.xls');
una volta impostato il nome del file da leggere, facciamo un ciclo per ogni riga e colonna:
$data->sheets[0]['numRows']; $data->sheets[0]['numCols'];
le due righe sopra rappresentano rispettivamente il numero di righe e colonne contenute nel file excel.
Per prelevare il valore di una singola cella invece basta usare il comando:
$data->sheets[0]['cells'][$i][$j];
dove $i è la riga e $j è la colonna.
Questo è l'esempio di listato PHP completo per mostrare in una tabella i dati contenuti in un file excel chiamato "file_excel.xls":
<?php // Test CVS require_once 'excel/Excel/reader.php'; // ExcelFile($filename, $encoding); $data = new Spreadsheet_Excel_Reader(); // Set output Encoding. $data->setOutputEncoding('CP1251'); /*** * if you want you can change 'iconv' to mb_convert_encoding: * $data->setUTFEncoder('mb'); * **/ /*** * By default rows & cols indeces start with 1 * For change initial index use: * $data->setRowColOffset(0); * **/ /*** * Some function for formatting output. * $data->setDefaultFormat('%.2f'); * setDefaultFormat - set format for columns with unknown formatting * * $data->setColumnFormat(4, '%.3f'); * setColumnFormat - set format for column (apply only to number fields) * **/ $data->read('excel/prova.xls'); /* $data->sheets[0]['numRows'] - count rows $data->sheets[0]['numCols'] - count columns $data->sheets[0]['cells'][$i][$j] - data from $i-row $j-column $data->sheets[0]['cellsInfo'][$i][$j] - extended info about cell $data->sheets[0]['cellsInfo'][$i][$j]['type'] = "date" | "number" | "unknown" if 'type' == "unknown" - use 'raw' value, because cell contain value with format '0.00'; $data->sheets[0]['cellsInfo'][$i][$j]['raw'] = value if cell without format $data->sheets[0]['cellsInfo'][$i][$j]['colspan'] $data->sheets[0]['cellsInfo'][$i][$j]['rowspan'] */ error_reporting(E_ALL ^ E_NOTICE); $sheets=1; echo "Lettura totale del file:"; echo "<table border=\"1\" cellpadding=\"2\" cellspacing=\"2\">"; for ($i = 1; $i <= $data->sheets[$sheets]['numRows']; $i++) { echo " <tr> "; for ($j = 1; $j <= $data->sheets[$sheets]['numCols']; $j++) { // if($data->sheets[$sheets]['cells'][$i][$j]!="") {echo " <td>".$data->sheets[$sheets]['cells'][$i][$j]."</td> ";} } echo " </tr> "; } echo "</table>"; //print_r($data); //print_r($data->formatRecords); ?>
Per leggere invece le singole celle, anche di fogli diversi:
echo "Lettura celle singole:"; echo "<BR/><BR/>"; echo "Foglio 1 Cella 1,1: ".$data->sheets[0]['cells'][1][1]."; echo "<BR/>"; echo "Foglio 2 Cella 6,1: ".$data->sheets[1]['cells'][6][1]."