Leggere file Excel con PHP

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