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]."