Crear y leer archivos Excel con PHP

Pablo

Hoy en día Microsoft Excel es uno de los gestores de planillas de cálculo mas utilizados en todo el mundo, mas allá de que Google Docs sea muy simple, gratis y online, el Excel es uno de los pilares dentro de la suite de Microsoft. Es por eso que cuando creamos una aplicación buscando ser lo mas útil para el usuario debemos contemplar la opción de permitir exportar la información para ser visualizada en Excel, para eso les voy a recomendar una clase php para generar documentos xls realmente simple.

PHP Excel Creator library es una pequeña librería que nos provee de las clases php necesarias tanto para crear como para leer ficheros Excel desde PHP sin demasiadas complicaciones, yo la conocí hace unos días gracias a Juokaz y la verdad que desde que la vengo utilizando no tengo ninguna complicación, la implementación de esta clase es sencilla, a continuación coloco el mismo ejemplo que utilice yo cuando la utilice por primera vez.

[PHP]
require (‘..path/Writer.php’);

$filename = ‘myFile.xls’;

$workbook = new Spreadsheet_Excel_Writer();
$workbook->send($filename);

// Look at documentation
$workbook->setVersion(8);
// Temporary files directory
$workbook->setTempDir(‘/tmp’);

$worksheet =& $workbook->addWorksheet(‘Items’);
$worksheet->setInputEncoding(‘UTF-8′);
$worksheet->setMargins(0.25);
$worksheet->centerHorizontally(1);

$worksheet->activate();

$format_header =& $workbook->addFormat();
$format_header->setBold();
$format_header->setSize(12);

$worksheet->write(0, 0, ‘Code’,$format_header);
$worksheet->setColumn(0, 0, 30);
$worksheet->write(0, 1, ‘Title’,$format_header);
$worksheet->setColumn(1, 1, 50);

$format_row =& $workbook->addFormat();
$format_row->setSize(12);

foreach ($items as $item)
{
$worksheet->writeString($i, 0, $item->code, $format_row);
$worksheet->writeString($i, 1, $item->title, $format_row);
}

$workbook->close();
[/PHP]

Como verán la utilización de esta clase no tiene demasiada complejidad, además con solo un valor podemos definir la versión de Excel con la que queremos generar el archivo, y de paso nos olvidamos de toda la complejidad que tiene parsear un documento de Excel a “mano”.

Otra clase que había probado hace tiempo y me pareció muy buena también es phpexcel, pero la verdad para el uso que le doy yo las dos se comportan de forma muy similar, quizás para grandes requerimientos a fin de evitar un alto consumo de recursos la ultima clase que les comento sea un poco mejor, pero esto había que confirmarlo con algunos benchmarks.

Por el momento sigo muy contento con PHP Excel Creator library :D

Pablo

Programador desde hace más de 11 años, adicto a internet, cafeinómano, fanático de la información, intento de emprendedor, trabaja de forma compulsiva solo en lo que ama. Sueña con tener una aplicación con más de 1 millón de usuarios.

Comentarios

  1. Rayban Responder

    gran articulo

  2. Pablo Responder

    @Rayban: Me alegro que te guste :D

  3. VictorArias Responder

    Excelente este artículo he visto a muchos sufriendo por encontrar una solución de este tipo y más esta tan sencilla. Mil gracias :D

  4. shadow Responder

    Hi,

    muy buen articulo, hace unos meses tuve que general archivos xls pero no encontre ninguna lib que lo hiciera de forma correcta (que funcionara por asi decirlo :P) asi que termine generando cvs :P

    Regards,
    Shadow.

  5. Pablo Responder

    @Victor: Si es complicado encontrar algo tan sencillo para generar archivos de excel, la verdad que esta bueno, gracias por el comentario!

    @Shadow: Gracias, me alegro que te sirva :D

  6. danny Responder

    disculpa no me funciona! donde puedo encontrar ducumentacion gratis!, lo copie tal cual tu ejemplo y:

    Fatal error: Call to undefined method: spreadsheet_excel_writer_worksheet->raiseerror() in C:\AppServ\www\Otro excel\excel-2.0\Worksheet.php on line 1518

    y no quiero menterme con la libreria, no se para que sirbe el dir /temp de todos modos lo cree

  7. Pablo Responder

    @danny: Que raro deberia funcionar, quizas este mal la ruta en la primer linea por lo que dices ahi require (‘..path/Writer.php’); fijate ubicarla correctamente sino puedes leer mas acerca de esta clase en http://pizzaseo.com/php-excel-creator-class espero haber podido ayudado un poco mas :)

  8. carlos Responder

    soy novato en php
    perdona mi ignorancia, cuando hice lo de las librerias si creo el archivo, pero i problema es como implementarlo para leer un archivo?
    agradezco tu respueta

  9. Erick Responder

    Saludos !

    Soy nuevo en PHP me gustaria saber si alguien tienen noción como debo empezar para crear un cotizador en linea, que por medio del area de un triangulo cotize el precio de un producto :S.

    Alguien puede darme una idea o decirme sobre un recurso.

    Gracias.

    @Pablo gracias el articulo

  10. Kike Responder

    hola Pablo, disculpa quisiera hacerte una pregunta, con esto q nos muestras puedo partir de un archivo que tengo en excel para porder mandar los datos desde php?? y si es asi el excel se muestra en pantalla o tendria q abrirlo ??? me podrias explicar mas como se desarrolla, Gracias.

  11. Eduardo Responder

    Funciona bajo PHP4 esta librería??

    Saludos estimados. :)

  12. Pablo Responder

    @Eduardo: Tendrías que probarlo, pero al menos en la documentación se pide PHP version 5.2.0 o superior así que probablemente alguna función no funcione correctamente!

    Saludos!!

  13. Eduardo Responder

    @Pablo: Correcto, tengo php4 en uno de los servidores de desarrollo de mi trabajo y no funciono, probaré con PHP5 entonces, igual necesitaba saber que versión de PHP necesitaba.

    Saludos cordiales

  14. jorge Responder

    ola me gustaria saber como mandarlo a una cierta ruta, xke al seleccionarlo me lo descarga automaticamente. gracias

  15. Eduardo Responder

    @jorge solo debes configurar el navegador en preferencias, ya que la ruta donde guardar es exclusivamente responsabilidad del usuario gestor de la descarga.

    Saludos

  16. parentesys Responder

    prueba para ver si es que los comentarios son moderados o ha habido un error al enviar la respuesta: si es lo primero, no he visto ningún mensaje de aviso de moderación, y debería existir. saludos

  17. Carolina Responder

    Hola muy buena la clase, pero quisiera saber si es posible crear un comentario en un titulo de excel con php.. y si esta clase lo permite.. De antemano muchas gracias.

  18. Roxana Responder

    Hola mira lo que pasa es que he migrado de hosting en el anterior funcionaba correctamente pero ahora que lo migr no funciona me aparece que no existe el archivo en esa ruta pero si esta!!!

  19. Eduardo Responder

    @Roxana, debes darle permisos a los archivos de escritura, cualquier duda vuelve a comentar.

    Saludos.

  20. Roxana Responder

    Como se dan los permisos de escritura?, porque tb uso librerias para exportar a pdf y funciona normal

  21. Roxana Responder

    Pero ya le di y nada :(

  22. Marlon Martinez Responder

    AQUI UNA SOLUCION PARA LEER UNA ARCHIVO XLS Y MOSTRARLO EN UNA PAGINA
    load(“Cadena_Funcional.XLS”); //reemplazar por el nombre del archivo

    /** Abriendo la hoja que contiene la informacion */
    $objPHPExcel->setActiveSheetIndex(0);
    echo ”;

    /** obteniendo el numero total de filas y columnas */
    $rows=$objPHPExcel->getActiveSheet()->getHighestRow();
    $cols=PHPExcel_Cell::columnIndexFromString($objPHPExcel->getActiveSheet()->getHighestColumn());

    /** recorriendo la hoja */
    for($i=1;$i<=$rows;$i++)
    { echo '’;
    for ($j=0;$jgetActiveSheet()->getCellByColumnAndRow($j,$i)->getValue();
    echo ”.$val.”;
    }
    echo ”;
    }
    echo ”;
    ?>

  23. Juan Tena Responder

    Esta Libreria te permite abrir un cvs y guardarlo como xls 97-2003 ? , porque es lo que yo necesitaria.

    Gracias

  24. Eduardo Responder

    Viene listo para XLS 97-03.

    Saludos.

  25. JUan Tena Responder

    Hola Eduardo, Gracias, ya lo he probado y va perfecto con algun pero, como la longitud de las celdas, el tema de los acentos etc. Pero en con un poquito de paciencia y controlando los casos que nos podemos encontrar al final se soluciona, si alguien esta interesado en el script que he hecho para convertir un cvs a excel que me lo indique y se lo mando con muchisimo gusto
    Gracias a Todos y a ti en especial.
    Un saludo
    Juan Tena

  26. Eduardo Responder

    Juan, exacto tiene algunos defectos, no errores, pero lo puedes mejorar continuamente, si encuentro estos fuentes los podría compartir ya que hace mucho tiempo hice esto y poco me acuerdo de su funcionamiento, lo unico que se, es que los deje en un sistema de gestión de horas hombre.

    Saludos.

  27. Milagros Responder

    Buenos dìas, copie el codigo tal cual pero me da el siguiente error: Warning: Invalid argument supplied for foreach() in C:\AppServ\www\Excel\pruebaExcel.php on line 33…. Necesito ayuda urgente.. Gracias

  28. Eduardo Responder

    Puedes copiar el trozo de código antes y despues de la linea 33 del archivo.

    Haber si te puedo ayudar, eso si te digo que AppServ es limitado, también puede ser por eso.

    Saludos.

  29. Milagros Responder

    Este es el codigo: send($filename);

    // Look at documentation
    $workbook->setVersion(8);
    // Temporary files directory
    $workbook->setTempDir(‘../tmp’);

    $worksheet =& $workbook->addWorksheet(‘Items’);
    $worksheet->setInputEncoding(‘UTF-8′);
    $worksheet->setMargins(0.25);
    $worksheet->centerHorizontally(1);

    $worksheet->activate();

    $format_header =& $workbook->addFormat();
    $format_header->setBold();
    $format_header->setSize(12);

    $worksheet->write(0, 0, ‘Code’,$format_header);
    $worksheet->setColumn(0, 0, 30);
    $worksheet->write(0, 1, ‘Title’,$format_header);
    $worksheet->setColumn(1, 1, 50);

    $format_row =& $workbook->addFormat();
    $format_row->setSize(12);

    foreach ($items as $item)
    {
    $worksheet->writeString($i, 0, $item->code, $format_row);
    $worksheet->writeString($i, 1, $item->title, $format_row);
    }

    $workbook->close();
    ?>
    Gracias por tu respuesta, otra pregunta este codigo solo me genera un archivo excel con una sola hoja?

  30. Eduardo Responder

    Creo que es por el AppServ, te comparto el mío es mucho mas ágil y preciso, sobre manejar hojas se puede, googlea un poco y puedes encontrar, particularmente no tengo ese código ya que donde lo hice ya no trabajo ahí. Este lo utilice con EasyPPH 5 o superior.

    cualquier cosa rootaker@gmail.com estoy un poco ocupado ahora y ver mas en detalle tendría que ser mas tarde.

    Saludos.

  31. Milagros Responder

    Muchas gracias por tu respuesta…

  32. jok3rcit0 Responder

    Hola, antes que nada muy buen post es la misma librería que yo ocupe..
    Aunque tengo una duda que no eh podido resolver espero me puedan ayudar,
    Si yo en vez de querer que cuando me genere el excel me lo abra con excel lo haga con google docs? esto es posible?

  33. goodkat Responder

    hola, estoy intentando leer un archivo cdb cambiandole la extension a xls, ya me funciono en algun momento pero ahora cambie de archivo y empezo a arrojar el siguiente mensaje The filename is not readable, alguna idea??? GRACIAS

  34. Mauro Responder

    Pablo: estoy intentado utilizar PHPExcel en YII Framework y funciona muy bien, pero el problema que tengo ahora es que necesito que el sistema automáticamente me descargue varios excels de acuerdo a los datos suministrados, lo coloco dentro de un foreach pero al necesitar descargarlo tengo que colocar las “headers” y me parece que ahi tengo el problema, porque me funciona bien con el primer items del foreach, luego me dice que no encuentra la accion. Tenes algún ejemplo al respecto? La idea es descargar a la PC del cliente varios items según seleccione. Lo manejo con el ID

  35. tomy.... Responder

    hola tengo una página y exporto los datos a excel para esto utilizaba el prado 3.1 donde me funcionaba muy bien el código he actualizado el código al prado 3.2.0 y ahí no me funciona la exportación de datos a mi archivo excel para eso utilizo el siguiente código … agradeceré mucho su ayuda …. cabe mencionar que al momento de darle la exportación solo me actualiza la página … muchas gracias

    public function spreadsheet()
    {
    if(($this->Session["resultado1"] != null or $this->Session["resultado2"] != null)or($this->Session["resultado1"] != null and $this->Session["resultado2"] != null))
    {
    $x=array(array(‘ID’,'NO. JURIS’,'Clues’,'NOMBRE UNIDAD’,'TIPO’,'NOTIFICANTE’,'DIAGNOSTICO’,'FECHA NOTIFICACION’,'TIPO DE COMPLICACION CLINICA’,'INFORMACION EPIDEMIOLOGICA COMPLEMENTARIA’,'FECHA DE INICIO DE SINTOMAS’,'PACIENTE’));
    $sheet1=array_merge($x,$this->Session["resultado1"]);

    if($this->Session["resultado2"] != null)
    {
    $x2=array(array(‘ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘),array(‘No BROTE’,'NO. JURIS’,'CLUES’,'UNIDAD NOTIFICANTE’,'TIPO’,'DIAGNOSTICO’,'LUGAR DE OCURRENCIA’,'FECHA INICIO’,'FECHA FIN’,'CASOS PROBABLES’,'CASOS CONFIRMADOS’,'HOSPITALIZADOS’,'DEFUNCIONES’));
    $sheet2=array_merge($x2,$this->Session["resultado2"]);
    $sheet1 = array_merge($sheet1,$sheet2);
    }

    $workbook = new Spreadsheet_Excel_Writer();
    $format_und =& $workbook->addFormat();
    $format_und->setBottom(2);//thick
    $format_und->setBold();
    $format_und->setColor(‘black’);
    $format_und->setFontFamily(‘Arial’);
    $format_und->setSize(8);
    $format_reg =& $workbook->addFormat();
    $format_reg->setColor(‘black’);
    $format_reg->setFontFamily(‘Arial’);
    $format_reg->setSize(8);
    {
    $rowcount = count($sheet1);
    $colcount = 10;
    $wbname=”";
    $worksheet =& $workbook->addWorksheet($wbname);
    $worksheet->setColumn(0,0, 6.14);//setColumn(startcol,endcol,float)
    $worksheet->setColumn(1,3,15.00);
    $worksheet->setColumn(4,4, 8.00);
    }
    $i = 0;
    $j = 0;
    foreach($sheet1 as $fila)
    {
    if ($i==0)
    $fmt =& $format_und;
    foreach($fila as $campo)
    {
    $worksheet->write($i, $j, $campo, $fmt);
    $j++;
    }
    $i++;
    $j = 0;
    $fmt =& $format_reg;
    }
    $workbook->send(‘reportes.xls’);
    $workbook->close();
    }
    else
    {
    $this->ClientScript->registerBeginScript(“guardado”,”alert(‘No hay datos para exportar’)”);
    }
    header(‘Refresh:5′);

    }

Realizar un comentario