Cristalab

Abrir y leer archivos Excel con PHP

Por: gersonm + 07.05.2007

En este tip explicaré cómo leer un archivo de Excel (.xls) con PHP. Básicamente hay una librería libre llamada PHP-ExcelReader que lo hace.

Es bien simple de usar:

Paso 1.

Descargar el ZIP de aquí

Paso 2.

Descomprimir en una carpeta del servidor (entiéndase del servidor Apache)

Paso 3.

El ZIP incluye un ejemplo práctico, así que sólo bastará con echarlo un vistazo porque no es mucho lo que hay que hacer para entenderlo, aquí lo muestro:

Paso 3.1.

Incluir la librería

Código :

require_once 'Excel/reader.php';

Paso 3.2.

Crear una instancia de la clase

Código :

$data = new Spreadsheet_Excel_Reader();

Paso 3.3.

Definir codificación

Código :

$data->setOutputEncoding('CP1251');

Paso 3.4.

Leer el archivo XLS

Código :

$data->read('jxlrwtest.xls');

Paso 3.5.

La siguiente línea debería ser opcional porque inician el reporte de errores con el valor por defecto del php.ini. Si no entienden, no importa.

Código :

error_reporting(E_ALL ^ E_NOTICE);

Paso 3.6.

Leer los campos. Acá si vamos con ejemplos prácticos basados en el xls que viene de ejemplo.

Paso 3.6.1.

Leer la primera celda de la primera pestaña, o sea, la celda A1, esa que dice Java Excel API Modify Test

Código :

echo $data->sheets[0]['cells'][1][1];

Con esto ya es evidente que los índices de las celdas comienzan en 1.

Paso 3.6.2.

Leer la celda A3: Labels

Código :

echo $data->sheets[0]['cells'][3][1];

Acá se nota que el orden de coordenadas es [fila][columna].

Paso 3.6.3.

Recorrer todas las pestañas

Código :

foreach($data->sheets as $x => $y){
   echo "$x = $y<br>";
}

Esto hará que la variable $y se muestre como Array, así que viene lo sgte.

Paso 3.6.4.

Leer el nombre de cada pestaña

Código :

foreach($data->sheets as $x => $y){
   echo "$x = {$data->boundsheets[$x]['name']}<br>";
}


Bien, creo que con eso bastará para lo básico, igual el ejemplo viene con más ejemplos.

No hace falta advertir sobre la lectura de las fechas. Para que sean parceadas correctamente será necesario que la celda en Excel tenga formato de Fecha, porque si no es así es posible que esta sea distorsionada, a veces por 1 día, a veces por unos cuantos años.

Etiquetas php

Comentarios | Enviar un comentario
esto tiene buena pinta
¿luego el excel se convierte en una matriz multidimensional?

muy practico gracias por el dato Guiño
Por: Inyaka
esta libreria lee los archivos de excel 2007?
Por: daniel_blog
Buen tip gersonm miau
Por: XKlibur
Yo encontré otro truco si lo que queremos es sólamente ESCRIBIR un EXCEL desde PHP y no leerlo.

Simplemente genera un resultado en HTML, dibujando una tabla HTML como lo harías normalmente, puedes meterle en la misma página etiquetas de CSS embebido:

<style>
.miestilo{}
</style>

<table class="miestilo"><tr><td>mitabla</td></tr></table>

Podemos hacer una página web con los datos en nuestra tabla desde PHP, y luego enviarlo, indicando en las cabeceras que es un archivo XLS

header("Content-Type: application/vnd.ms-excel");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("content-disposition: attachment;filename=mifichero.xls");

Tanto Excel como OpenOffice lo abrirán sin problemas, incluso podemos insertar fórmulas directamente en los campos de la tabla y se ejecutarán luego en Excel Muy Feliz
Por: SeViR_blog
Talvez se pueda extender el tutorial con un ejemplo en concreto: generar un reporte, cargar datosa una base, etc.
Por: Osvaldo Osorio_blog
Resuelto, cambia Read por Write, otras cositas y listo.
Por: MH_blog
Me fuinciona todo bien hasta que intento subirlo al server donde me aparece

Notice: Undefined index: in /usr/export/www/hosting/pablogoogle/bd/licitaciones/biblioteca/oleread.inc on line 138

Gracias por su ayuda
Por: Marcos_blog
Cuando ya se tiene un archivo en excel, y se nesesita llenar algunas celdas unicamente. Se puede hacer con este utilitario, o con cual utilitario se podra hacer. Algunas celdas del archivo en excel estan protejidas y tambien se tienen algunas macros.
Por: Jorge Olaya_blog
Hola, funciona bien, pero tengo un problema el archivo en excel que tengo tiene datos con acentos, entonces ahi es donde tengo problemas alguien me puede ayudar?, gracias.
Por: Luis_blog
hola quisiera saber porque no puedo correr el codigo q puso Xklibur
me marca este error

Warning: Cannot modify header information - headers already sent by

me dijeron que corrigiera mi servidor apache pero pues no se en q parte si alguien puede ayudarme se lo agradeceria mucho.
Por: azaelc_blog
perdon el codigo fue puesto por SeViR. sorry.
Por: azaelc_blog
el archivo oleread.inc hay que renombrarlo a oleread.pxp
Por: e$cRI_blog
oleread.php perdon!
Por: e$cRI_blog_blog
y dentro del reader.php modificar el require por este otro.....

require_once 'oleread.php';

y funciona como la seda! Muy Feliz
Por: e$cRi_blog
Es verdad utilice la herramienta y no puedo leer volcales acentuadas, ni "ñ" o "Ñ", saben como puedo solucionar el problema??
Por: David_blog
Hola saben me aparece este error


Fatal error: Maximum execution time of 60 seconds exceeded in C:\Archivos de programa\xampp\htdocs\phpExcelReader\Excel\oleread.php on line 172

y arriba donde dicen cambiar Read por Write pueden especificar donde hay que cambiarlo

se graadece su ayuda
Por: Sergio_blog
hola, a mi tambien me corre el programa... pero tengo una duda, si tengo un archivo en excel que tiene mas de una hoja, como hago para q el programa lea cada hoja... Sonrisa
Por: Cintya
Sergio_blog: a mi me ocurre lo mismo pero es porque ni siquiera puedo abrir el excel. Me he creado un excel tonto y si que me lo abre. Algo debe tener ese excel.

Saludos
Por: ChT_blog
hola,

si por casualidad el servidor no abre los ejemplos, es por que el archivo 'jxlrwtest.xls' no se puede leer.

lo que hice fue abrir un nuevo archivo en excel, escribirle datos y probar.

para probar, guardar el archivo con un nombre, y colocar ese nombre en reader.php
Por: jeusu_blog
hola me aparece este error:
Fatal error: Maximum execution time of 60 seconds exceeded in opt\htdocs\oleread.php on line 23.

decian que modificando el php.ini por mas tiempo, pero detodos modos me aperece la misma leyenda. porfavor ayuda no se que mas moverle. gracias!
Por: lili_blog
Hola, soy nuevo usando PHP.

Tengo un problema con la libreria. Cuando cargo el ejemplo me da un error.


Warning: main(Spreadsheet/Excel/Reader/OLERead.php) [function.main]: failed to open stream: No such file or directory in /var/www/html/iago_excel/Excel/reader.php on line 31

Fatal error: main() [function.require]: Failed opening required 'Spreadsheet/Excel/Reader/OLERead.php' (include_path='.:/usr/share/pear') in /var/www/html/iago_excel/Excel/reader.php on line 31

¿Alguién sabe como puedo solucionarlo?

Gracias.
Iago
Por: Iago _blog
mhh
Por: hhhh_blog
Hola a todos,

Los que tienen un problema sobre un error en cuanto a que se ha superado el tiempo de espera 'Maximum execution time', eso lo pueden solucionar aumentándo el mismo con la función "void set_time_limit ( int segundos )".
<br/>
El que le dicen que la cabecera ya se ha enviado es porque ha realizado algún "echo" o algun comando que ha empezado a generar el documento HTML final y hay alguna función que requiere que no se haya empezado a utilizar. Cambia el orden en que realizas tus acciones.<br/>
Saludos<br/>



<a href="http://www.portal-seo.com">http://www.portal-seo.com</a>
Por: Portal-SEO_blog
Muy bueno el producto. Lo he utilizado con muchas planillas, con muchas cualidades distintas y todo funciona muy bien. Como trabajo en linux, sólo tuve que cambiar el nombre a los archivos (olereader.php a OLEReader.php)
Por: Guille_blog
hola, tengo problemas para bajar el archvio .zip...
Por: Yigly_blog
Para Cintya,

Para ver cada hoja existente recores el array $data->boundsheets y llamas el nombre de cada hoja así $data->boundsheets[$h]['name'] donde $h inicia en 0 e indica la primera hoja de excel. Este mismo indice lo utilizas en el array $data->sheets[$h]['cells'][$x][$y] colocando la misma variable $h y así lees cada hoja con su fila ($x) y columna ($y)
Por: Ronaldud_blog
Hola, soy nuevo usando PHP.

Tengo un problema con la libreria. Cuando cargo el ejemplo me da un error.


Warning: main(Spreadsheet/Excel/Reader/OLERead.php) [function.main]: failed to open stream: No such file or directory in /var/www/html/iago_excel/Excel/reader.php on line 31

Fatal error: main() [function.require]: Failed opening required 'Spreadsheet/Excel/Reader/OLERead.php' (include_path='.:/usr/share/pear') in /var/www/html/iago_excel/Excel/reader.php on line 31

¿Alguién sabe como puedo solucionarlo?

Gracias.
Iago
Por: Iago _blog

//--------------------------------

A Mi Me pasa Lo Mismo q' la cita q' puse arriba, alguien sabe q' es lo q' pasa, ha uso win xp, de antemano gracias Sonrisa
Por: Vate_blog
hola, el codigo me funciona perfecto en mi servidor (el mismo pc), pero cuando lo subo al servidor remoto donde tengo mi pagina web, no funciona, muestra la pagina en blanco y no hace nada, como que se queda pegado en el reader.php (probé poniendo echo en varias partes y deja de imprimir al llamar al archivo reader.php)
Agradezco cualquier ayuda!!!
Por: JJ_blog
funciona bien, pero como hago para que me respete el formato del archivo excel.
Por: novato06
tengo un problema con el excelreader, en mi computadora me lee los archivos sin ningun problema, al momento de subirlo me y abrir un archivo de excel de otra computadora me dice que no se puede leer... estuve jugando con este problema y me tope que solo abre los archivos si estos se encuentran en el servidor... o sea si abro en c:\tt.xls, si este archivo no se encuentra en el servidor me muestra el error y si lo pongo en la misma ubicaciòn este es leido, alguien ha tenido ese problema, esto es de novatos creo... espero que puedan ayudar.. de antemano muchas gracias....
Por: clach
hola a todos les explico lo que quiero hacer:
yo tengo un archivo excel con una macro para hacer inventario de una farmacia en una empresa, yo obtengo los datos de los archivos que estan en la red de esta empresa.
lo que quiero es hacer una pagina que tenga un menu y al escoger inventario se ejecute mi macro de excel.
Como puedo hacer eso???

ES DE URGENCIAAAAA
Por: johanna_blog
cualquier sugerencia para resolver mi problema por fa escribanme a jleon@uio.ups.edu.ec
Por: johanna_blog
hola, soy nuevo en esto, en el manejo de esta libreria, esta muy bien pero me tope con un error que hasta el momento no lo he podido resolver, este es:

si el dato de una celda hace referencia a otra, por ejemplo supongamos que estamos en la celda B1 y queremos que esta tome el valor de lo que hay en la celda A1, hacemos esto:


=A1

todo bien, pero al momento de hacer referencia o extraer el dato desde php con la libreria sale en blanco, y si pongo que muestre el valor de A1 si lo hace, ¿cual es la solución? ¿es imposible extraer datos de X celdas si estas se autollenan con alguna formula? ¿el contenido de la celda debe de ser llenado manualmente?

es que tengo un documento de 10 hojas en excel que la mayor parte son formulas que se autocalculan, como le hago, ayuda profavor...!


gracias.
Por: FRANCISCO DANIEL_blog
Usé esta funcionalidad en un sistema. Fue sumamente útil pero AVISO - WARNING me dio un grave problema. Una celda tipo fecha me cambia el dato (porque internamente una fecha es un número) me pone un día más y eso me trajo graves inconvenientes con un cliente.
Por: Victor enlaze_cl_blog
que tal,lo encontre de casualida para mi tarea, espero que siempre tengas informacion.asi... =)
Por: ingrid vane*_blog
me agrada tu script pero lo ideal al exportar a un archivo excel es usar un array
en el que tu puedas modificar que campos de la base de datos incluir en el archivo de excel, y no todos de un jalon.
Por: Tona_blog
Bueno yo tenia el mismo problema de tiempo excedido, asi que lo que pasaba era que no podia abrir el archivo de excel, por lo cual lo borre puse cualquier otro archivo (el que les interese controlar por ejemplo) y lo renombre como el anterior (jxlrwtest.xls)

Así funciona todo perfecto Guiño
Por: Isaac_blog
Hola Alguien sabe como puedo grabar directamente un Excel en alguna carpeta

lo que debo hacer es generar 3 o mas archivos excel al mismo tiempo y debenquedar guardados en una carpeta predefinida de manera automatica
Por: Claudio_blog
a mi tambien me sale este error, alguien ya lo ha solucionado???

Warning: main(Spreadsheet/Excel/Reader/OLERead.php) [function.main]: failed to open stream: No such file or directory in /var/www/html/iago_excel/Excel/reader.php on line 31

Fatal error: main() [function.require]: Failed opening required 'Spreadsheet/Excel/Reader/OLERead.php' (include_path='.:/usr/share/pear') in /var/www/html/iago_excel/Excel/reader.php on line 31
Por: trucutrucu_blog
porqué no me deja modificar un dato en una celda de excell
Por: angeles_blog
Como ago para que la misma alineacion de mi tabla que tengo dentro de mi código php se vea igual cuando lo genero en excel.

Les agradesco su ayuda urgente
Por: ambar_blog
Para alinear los datos dentro de una tabla en php se utiliza align="center" valign="middle" para que quede exactamente en el centro de la celda la pregunta es:
¿Por que cuando se genera el archivo en excel la alineación cambia? ¿a caso la sentencia es distinta?

Les agradesco su pronta respuesta ¡Saludos!
Por: ambar_blog
Hola quisiera saber si lo que se lee de las celdas sale en alguna codificacion especifica y como podria convertirla?, ya que necesito buscar una cadena de texto en el archivo de excel comparandola otra y no puedo lograrlo. Gracias.
Por: bet_blog
Como hago para que cuando jale una celda la libreria me jale con un formato que se configure en la misma libreria por ejemplo en el excel tengo una celda con formato numero de 3 decimales cuando lo jalo con la libreria me jala con 8 decimales veo que la libreria lo ha reformateado, he probado con un nuemro como 2.456 sin darle formato en excell pero cuando lo jalo con la libreria se muestra 2.4558998, en que parte de la libreria se configura los decimales por que es independiente del formato que le das en el excell.
gracias
Por: luis rojas_blog
Épale! no sé si el muchacho que tenía el problema con los acentos lo solucionó, yo tenía el mismo problema, primero me dí cuenta de que tenía un error en el HTML donde estaba imprimiendo lo que leía del archivo excel, la codificación del HTML estaba mal, la cambié de UTF-8 a iso-8859-1 que es la codificación latina, si no me equivoco y con respecto al código de PHP, $data->setOutputEncoding("iso-8859-1"); para la codificación de salida de los datos, espero que sirva de algo.
Por: Henry_blog
para los que tienen el problema:

Warning: main(Spreadsheet/Excel/Reader/OLERead.php) [function.main]: failed to open stream: No such file or directory

solucion:
en el archivo reader.php (la clase) la linea 31:
require_once 'Spreadsheet/Excel/Reader/OLERead.php';

Reeamplazarla por
require_once 'oleread.php';

Luego renombrar el archivo oleread.inc por oleread.php

si lea aparece el problema del tiempo excedido como dijo uno de los posteadores cambien el excel de ejemplo y va a funcionar de 10.
Por: pixual_blog
Con respecto a los acentos, también pueden usar la funcion de php: utf8_encode() y utf8_decode() al momento de imprimir en pantalla.....no importando la codificación de la pagina, esto funciona.

espero que les sirva
Por: Nabiot_blog
Gracias, creo que es lo que ando buscando.
Mu claro breve.
Por: Cristian_blog
Calidad de libreria, el archivo del ejemplo tiene un error pero lo cambias y corre perfecto
Por: Armando Iglesias_blog
Hola buenas noches estoy revisando en las librerias para leer un excel desde php pero en realidad me da un error al correr el ejemplo
Warning: require_once(Spreadsheet/Excel/Reader/OLERead.php) [function.require-once]: failed to open stream: No such file or directory in C:\wamp\www\Excel\reader.php on line 31

Fatal error: require_once() [function.require]: Failed opening required 'Spreadsheet/Excel/Reader/OLERead.php' (include_path='.;C:\php5\pear') in C:\wamp\www\Excel\reader.php on line 31}}



no tengo la mas minima idea deberia estar ese archivo OLERead.php pero no esta
Por: juan_blog
Hola mi consulta es como se puede hacer que en ves de leer celda por celda, lea un rango determinado de celdas????????

Saludos
Por: FERQOS_blog
Si alguien me puede ayuda. Quiero enviar un email con la funcion mail de php, pero quiero que en este mail se visualize una pagina html, el asunto esta que no puede definir la estructura de la pagina en el script de php ya que esta estara cambiando muy frecuentemente
Por: oschar-blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.