PHPExcel – Lee y escribe Excel’s con PHP

PHPExcel

PHPExcel

Quizás para algunos PHPExcel es archiconocido, pero les voy a contar (lo poco que se) sobre esta librería para trabajar con hojas de cálculos en PHP.

La semana pasado en el trabajo me encontré con un inconveniente. En un principio, existía un modulo que desarrollé el cual permitía ingresar ciertos datos al sistema mediante un Excel predefinido por mi. Se descarga desde el sistema y es llenado por el usuario para luego ser subido y procesado ingresando todo como si fuese ingresado desde la página directamente (imagen que suben un post a un blog desde una hoja de calculos, indicando lo mismo que se pide al publicar vía web, lo suben y listo). Era cosa de comodidad para los usuarios que muchas veces se manejan más en Excel que en un sistema desarrollado en una plataforma web. El inconveniente fue que el Excel que yo tenía, ahora debía tener ciertas opciones. El GRAN pero de todo esto, era que esas opciones eran rescatadas desde una base de datos. Osea, tenía dos opciones: actualizaba el Excel yo mismo cada vez que se ingrese una opción o realizaba una hoja de cálculos dinámica, que al ser descargada se conectara con la base de datos, rescatara las opciones y las escribiera en la hoja de cálculos. Opté por la segunda opción.

En un principio no lo vi tan complicado. Ya sabia trabajar con Excel desde PHP, podía leer y escribir sin problemas. Pero todo, absolutamente todo se me complicó. En un principio me dije “Bueno, si se puede leer y escribir, se podrá abrir un archivo desde PHP y modificarlo para luego ser guardado”… pero no. La única opción de hacer eso era mediante Componentes COM para comunicarme con Excel desde PHP. Era mucho enredo, a parte de que necesitaba que el servidor sea Windows y tuviese Excel instalado, cosa que no es así.

Intenté genera un Excel desde PHP y ahí ingresar las opciones desde la base de datos, pero me di cuenta que tampoco era posible. Necesitaba hacer el uso de formulas, suma de valores entre pestañas (hojas) y usar una validación de datos del tipo lista para las opciones que debía ingresar. Era mucho pedir.

Fue ahí de tanto y tanto buscar soluciones a mis necesidades que me topé con PHPExcel… nuevamente. Sí, porque hace un tiempo atrás (1 año) también me topé con el buscando soluciones algunos problemas con Excel en PHP. Estúpidamente no le di bola. Pero siempre hay una segunda oportunidad para todo.

PHPExcel tenía todo, pero completamente todo lo que necesitaba. Fue amor a segunda vista. Conocí otras librerías parecidas, en el sentido que permitían hacer cosas como escribir formulas, pero PHPExcel esta a otro nivel. Logre modificar un Excel, que era justo lo que necesitaba. Osea, sinceramente no es modificar, si no que en la practita realmente lo que hice es utilizar un Excel como plantilla y escribir sobre el. Leo, copio y pego. Tal cual.

Creadores de PHPExcel

Creadores de PHPExcel

Luego de “pegar” mi plantilla escribo sobre ella a mi antojo. Lo increíble de PHPExcel es que pudo leer y copiar mi plantilla Excel sin perder casi ningún formato de diseño y de valores (bordes, colores, formulas, nombre de formulas, nombre de rangos, validación de datos, etc). Osea, no lee el valor visible, si no que ve realmente como se compone ese valor. Que lo forma.

Luego de jugar un poco con la librería, leer la documentación (EXCELENTE documentación) y pedir ayuda en los foros logré hacer lo que necesitaba: ingrese la lista de opciones, obteniendo los datos desde una base datos. Todo quedó en una lista desplegable que se muestra al hacer clic en la celda. De este modo no permite ingresar otro valor que no sea el que aparece en la lista (validación de datos).

A continuación algunas características:

  • Setear meta data (autor, titulo, descripción, …)
  • Agregar mas hojas de cálculo (pestañas)
  • Agregar valores y formular a celdas individuales
  • Combina celdas
  • Proteger rango de celdas con contraseña
  • Poder establecer alto y ancho de celdas
  • Poder establecer diseño a celdas (fuente, borde, fondo, …)
  • Soporte para fijar celdas
  • Poder agrupar celdas/columnas
  • Insertar o borrar celdas/columnas
  • Asignar nombre a un rango
  • Soporte para referencias entre pestañas
  • Agregar imágenes (con la posibilidad de cambiar su estilo: sombra, posición, ..)
  • Agregar comentarios a una celda
  • Setear opciones de impresión
  • Opciones de salida en distintos formatos
    • Excel 2007
    • BIFF8 (Excel 97 y superior)
    • CSV
    • HTML
    • PDF
    • PHPExcel Serialized Spreadsheet (formato propio de PHPExcel)
  • Opciones de lectura en distintos formatos
    • Excel 2007
    • BIFF5 (Excel 5.0 / Excel 95), BIFF8 (Excel 97 osuperior)
    • PHPExcel Serialized Spreadsheet
    • CSV (Comma Separated Values)

Lo bueno (y realmente bueno) es que viene con muchísimos ejemplos con las cosas que puedes hacer con PHPExcel. No sólo viene con ejemplos, si no que también con una completísima documentación de sus clases y funciones. Aparte de todo esto la comunidad que hay detrás de todo esto es buenísima. Hay un constante feedback de los usuarios y el desarrollo es constante. Yo tuve ciertos problemas, postee en el foro y la respuesta no se hizo esperar de un mismo desarrollador que en 15 minutos solucionó mi problema.

Leer un archivo Excel:

<?php
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadDataOnly(true);

$objPHPExcel = $objReader->load("test.xlsx");
$objWorksheet = $objPHPExcel->getActiveSheet();

echo '<table>' . "\n";
foreach ($objWorksheet->getRowIterator() as $row) {
echo '<tr>' . "\n";

$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(false); // This loops all cells,
// even if it is not set.
// By default, only cells
// that are set will be
// iterated.
foreach ($cellIterator as $cell) {
echo '<td>' . $cell->getValue() . '</td>' . "\n";
}

echo '</tr>' . "\n";
}
echo '</table>' . "\n";

Como usar una hoja de calculo como plantilla para crear otra

<?php

// Camino a los include
set_include_path(get_include_path() . PATH_SEPARATOR . '../Classes/');</p>
// PHPExcel
require_once 'PHPExcel.php';</p>
// PHPExcel_IOFactory
include 'PHPExcel/IOFactory.php';</p>
// Creamos un objeto PHPExcel
$objPHPExcel = new PHPExcel();</p>
// Leemos un archivo Excel 2007
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objPHPExcel = $objReader->load("Archivo.xlsx");</p>
// Indicamos que se pare en la hoja uno del libro
$objPHPExcel->setActiveSheetIndex(0);</p>
//Escribimos en la hoja en la celda B1
$objPHPExcel->getActiveSheet()->SetCellValue('B2', 'Hola mundo');</p>
// Color rojo al texto
$objPHPExcel->getActiveSheet()->getStyle('B2')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED);
// Texto alineado a la derecha
$objPHPExcel->getActiveSheet()->getStyle('B2')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
// Damos un borde a la celda
$objPHPExcel->getActiveSheet()->getStyle('B2')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK);
$objPHPExcel->getActiveSheet()->getStyle('B2')->getBorders()->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK);
$objPHPExcel->getActiveSheet()->getStyle('B2')->getBorders()->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK);</p>
//Guardamos el archivo en formato Excel 2007
//Si queremos trabajar con Excel 2003, basta cambiar el 'Excel2007' por 'Excel5' y el nombre del archivo de salida cambiar su formato por '.xls'
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save("Archivo_salida.xlsx");

Todos estos ejemplos los saqué de la misma documentación. Por lo que ustedes mismos encontrarán todo lo necesario ahí.

Actualmente se encuentra en  su versión 1.6.7 y la puedes descargar desde aquí.

Sitio Oficial: http://phpexcel.codeplex.com

Excel 2007
Anuncios

26 comments

  1. Hola, he tratado de iniciar con un ejemplo basico pero me dice que no tengo habilitado el manejo de archivos zip. Buscando en la red encontre que solo habia que quitar los comentarios del php.ini y listo pero aun me genera el error.
    Me podria indicar como habilitar el zip para trabajar archivos de excel 2007.
    gracias

    Me gusta

  2. Disculpa intente ejecutar el ejemplo con una plantilla que tengo ya diseñada pero no funciono me saco este error, bueno inicialmente con menos memoria busque y me sa
    aumente la meoria pero siguio saliendo el error, sabes a que se debe? o que tengo que hacer para solucionarlo

    Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 1008 bytes) in C:\AppServ\www\Classes\PHPExcel\Cell.php on line 996

    Me gusta

  3. La clase PHPExcel es muy buena, yo la utilice para desarrollar una aplicación que exporta un archivo Excel a una base de datos MySQL, por si alguien la necesita se llama DEAME3p y la pueden bajar desde el sitio Web.

    Saludos
    Y realmente muy buena la Clase PHPExcel

    Me gusta

  4. una consulta donde debe estar guardado el archivo que deseas utilizar como plantilla, porque me sale el siguiente error, por cierto estoy trabajandolo en codeigniter:

    Fatal error: Uncaught exception ‘Exception’ with message ‘Could not open Actas.xlsx for reading! File does not exist.’ in C:\wamp\www\sistema_colegio_2040\system\application\libraries\PHPExcel\Reader\Excel2007.php:301 Stack trace: #0 C:\wamp\www\sistema_colegio_2040\system\application\controllers\cValidar.php(649): PHPExcel_Reader_Excel2007->load(‘Actas.xlsx’) #1 [internal function]: cValidar->genera_excel(‘2011’, ‘AU000002’) #2 C:\wamp\www\sistema_colegio_2040\system\codeigniter\CodeIgniter.php(236): call_user_func_array(Array, Array) #3 C:\wamp\www\sistema_colegio_2040\index.php(115): require_once(‘C:\wamp\www\sis…’) #4 {main} thrown in C:\wamp\www\sistema_colegio_2040\system\application\libraries\PHPExcel\Reader\Excel2007.php on line 301

    Me gusta

    1. Combinando Celdas: Para combinar celdas existe merge, función que toma el rango de celdas que se le pasen y las une (pero no las centra como normalmente lo hace el editor de excel):
      $objPHPExcel->getActiveSheet()->mergeCells(‘A1:H1);

      Me gusta

  5. Hola tengo un plantilla en excel y ahi a partir de los datos existentes se crean gráficas estadísticas, con PhpExcel ya puedo generar un archivo similar a la plantilla pero los gráficos no los veo……….. por qué, como hago q las gráficas cambien segun se modifican los datos???

    Y cada que cierro el documento creado me pide si deseo guardar los datos, a pesar de q aparentemente no he hecho ningun cambio…

    Me gusta

  6. Hola… Disculpa Estoy Empezando a utilizar php… y me gustaria utilizar esta libreria ya que tengo que crear un pdf el cual recibe datos de mysql hata ahi todo bien ahora el problema es utilizar esta libreria PHPExcel para abrir el archivo excel.. me gusataria probar los ejemplos solo que me marca el siguiente error
    14:44:46 Create new PHPExcel object 14:44:46 Set properties 14:44:46 Add some data 14:44:46 Rename sheet 14:44:46 Write to Excel2007 format
    Fatal error: Class ‘ZipArchive’ not found in C:\AppServ\www\1.6.7\Classes\PHPExcel\Writer\Excel2007.php on line 285

    No se ingles por lo cual se me dificualta leer la documentacion… si sabes la respuesta a mi problema me gustaria me ayudaras.. Gracias.

    Me gusta

  7. Tu informacion me parece bastante util la verdad es la libreria que andaba buscando, pero tengo una gran pregunta que he buscado y me comenta que no se puede hacer la situacion es la siguiente: tener una platilla con formulas, datos, estilo, etc., y solo poder modificar un dato en una celda determinada y que no borre toda la informacion si no que solo actualice la celda indicada.
    saludos y gracias.

    Me gusta

  8. Lo primero es darte las gracias por compartir esa información y por el blog.
    Con el código actual no se pueden copiar gráficas, tienes alguno con el que se pueda copiar una plantilla de excel en la cual exista una gráfica. Gracias de antemano ^^

    Me gusta

    1. @ekidmaru la verdad esta entrada la escribí hace muuuucho tiempo y la dejé de utilizar y sólo hice más o menos lo que comenté. Te recomiendo mirar la documentación para más información.

      Saludos.

      Me gusta

  9. hola, como podria hacer para duplicar la ultima hoja del documento y pegar la misma hoja en el mismo documento para editarla y añadir mas cosas?? phpexcel me dice que no puede añadir hojas con el mismo nombre

    Me gusta

  10. Buenas es muy util la libreria la estoy utilizando con el framework cakephp y lo hace bn, queria hacer una pregunta para saber si pueden ayudarme con esto, quiero actualizar los datos que yo ya ingrese masivamente a mi base de datos como lo puedo hacer por medio de phpexcel, espero me hayan entendido y me puedan ayudar gracias

    Me gusta

    1. La verdad es que no utilizo esta librería hace mucho tiempo, pero sería cosa de leer el Excel y hacer la unión de esos datos con los que tienes en la DB. Si en el Excel puedes tener el ID de cada dato que tienes en la DB para ser la unión ideal, de lo contrario, tendrías que averiguar algún dato que no cambie nunca y sea único para poder hacer la unión. Saludos.

      Me gusta

  11. hola:

    Alguien sabe que funcion usar para que el texto no sobresalga del ancho de la columna

    la columna tiene un ancho fijo,

    $colB = 14;
    $objPHPExcel->getActiveSheet()->getColumnDimension(‘B’)->setWidth($colB + 1);

    A B

    | Codigo | Formato |

    | 0001 | Aqui el texto quiero que se quede dentro del ancho de la columna y no sobresalga.

    Gracias por la respuesta.

    Me gusta

  12. Hola muy buen dia tengo una duda quiero conocer el valor en una posición determinada como por ejemplo el valor que se encuentra en (nombre de la hoja, fila y columna) hoja 1, A, 1

    Me gusta

Deja un comentario (puedes utilizar Markdown)

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s