excel_en_php_portada

He sacado unos minutos para dejaros este breve manual sobre cómo leer y grabar un fichero de Excel en PHP. Hemos recibido el encargo de un proyecto que utiliza una hoja de Excel como fuente de datos y, aunque ya he trabajado otras veces con ficheros .csv e incluso generado ficheros .xls utilizando PHP, nunca había necesitado leer un fichero de Excel. Os explico cómo lo he hecho.

Leer archivos. xls de Excel

Para leer el archivo de Excel he utilizado la librería phpExcelReader, bajo licencia GNU. Para ello descargamos los archivos y guardamos la carpeta «Excel» en el directorio de nuestro proyecto. En la versión que yo he descargado he tenido que hacer una pequeña «chapuza» porque dentro del archivo reader.php había un require con una ruta equivocada. La versión que he subido a Github ya está corregida y funcionando correctamente.

Veamos un pequeño ejemplo de su uso. Leemos el fichero y mostramos en forma de tabla los datos que hemos obtenido.

<?php

require_once 'Excel/reader.php';

$data = new Spreadsheet_Excel_Reader();
$data->setOutputEncoding('CP1251');
$data->read('fichero.xls');
echo("<table>");
for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
	echo("<tr>");
	for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {
		echo("<td>".$data->sheets[0]['cells'][$i][$j] ."</td>");
	}
	echo("</tr>");

}
echo("</table>");

 

A tener en cuenta

La variable $i controla las filas y la variable $j las columnas. Como generalmente los títulos de las columnas aparecen en la primera fila, si queremos obviarla tendremos que comenzar el for con $i=2 en lugar de con $i=1. De todas maneras, todo esto dependerá mucho del fichero Excel del que partamos.

En el ejemplo, para hacer referencia a un valor en concreto, por ejemplo, el almacenado en la celda B3, tendremos que utilizar

$celdaB3=$data->sheets[0]['cells'][2][3];

También cabe destacar que el objeto dispone de los campos numRowsnumCols para almacenar el número total de filas y columnas respectivamente.

Si el archivo Excel cuenta con más de una hoja de cálculo, podemos acceder a cada una de ellas variando el índice de sheets:

$celdaB3=$data->sheets[1]['cells'][2][3];//Celda B3 de la hoja 1
$celdaB3=$data->sheets[1]['cells'][2][3];//Celda B3 de la hoja 2
$celdaB3=$data->sheets[2]['cells'][2][3];//Celda B3 de la hoja 3

 

Grabar ficheros Excel en PHP

Esta es la parte fácil. Para grabar un fichero de Excel solo necesitamos mostrar los datos en una tabla y cambiar la cabecera del archivo. Como en el ejemplo anterior ya utilicé la etiqueta table para hacer echo de los datos, solo nos quedaría cambiar las cabeceras justo antes.

excelenphp

<?php

require_once 'Excel/reader.php';

$data = new Spreadsheet_Excel_Reader();
$data->setOutputEncoding('CP1251');
$data->read('fichero.xls');

//Establecemos las cabeceras para un archivo xls
header('Content-type: application/vnd.ms-excel');
		header("Content-Disposition: attachment; filename=excelenphp.xls");
		header("Pragma: no-cache");
		header("Expires: 0");

//Y mostramos los datos en forma de tabla
echo("<table>");
for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
	echo("<tr>");
	for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {
		echo("<td>".$data->sheets[0]['cells'][$i][$j] ."</td>");
	}
	echo("</tr>");

}
echo("</table>");

 

Descargas

He subido los archivos del ejemplo a Github:

https://github.com/davidmerinas/excelenphp