Generar Excel con PhpSpreadsheet y PHP & MySQL
Generar Excel con PhpSpreadsheet. PhpSpreadsheet es una librería muy usada en el mundo de los programadores para el manejo de EXCEL con PHP y más aún que es actualizada constantemente por sus desarrolladores. En este artículo nos enfocaremos en la instalación desde su repositorio oficial y hasta el uso con 3 ejemplos concretos.
Pasos para usar PhpSpreadsheet
- Verificar la versión de PHP 7,1 o superior
- Instalar composer
- Ejecutar composer.json
- Declarar autoload.php
¿Qué es la librería PhpSpreadsheet?
PhpSpreadsheet es una librería escrita en PHP puro y proporciona un conjunto de clases que permiten leer y escribir en diferentes formatos de archivo de hoja de cálculo, como Excel y LibreOffice Calc.
Está librería se usa para gestionar archivos Excel, Leer, crear archivos y hasta crear hojas en un archivo de Excel. Además, cuenta con una sólida y completa documentación que la pueden encontrar en su página oficial:
PHPSpreadSheet’s Documentacion.
¿Qué formatos soporta esta Librería?
Puede soportar varios tipos de formatos, aquí una lista.
¿Cuáles son los requisitos para usar la Librería?
- Versión de PHP 7.1 o una más reciente.
- Extensiones activas
- php_zip
- php_xml
- mb_string
- dom (opcional)
- php_gd2 (opcional)
Si desean mayor información sobre el tema, también pueden consultar el repositorio en GitHub.
GitHub – PHPOffice/PhpSpreadsheet
Si vas a realizar pruebas en un servidor local, puedes usar el paquete XAMPP para ayudarte, este paqute incluye la última versión de PHP u otro servidor local de tu preferencia.
¿Como instalar PhpSpreadsheet PHP?
Para instalar tienes que usar composer para instalar PhpSpreadsheet. Si no tienes instalado en tu ordenador, puedes descargarlo desde aqui.
Descargar la librería
Crea un directorio donde alojar tu proyecto local de prueba. A continuación, usa la consola de comandos para ubicarte es dicho directorio y ahí descargaremos la librería que generara una carpeta llamada vendor.
Para empezar, abrimos nuestro terminal y nos situamos en la carpeta de nuestro proyecto y ejecutamos:
composer require phpoffice/phpspreadsheet
Con esto se creará una carpeta /vendor en tu proyecto con la siguiente estructura, y luego incluir el archivo autoload.php
Estructura de archivos
Generar-excel | └─vendor | ├─ composer | └─ phpoffice | └─ phpspreadsheet
Ahora debemos declarar el fichero autoload.php y los namespaces que utilizaremos para generar los archivos Excel.
require __DIR__ . "/vendor/autoload.php";
use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
¿Cómo usar la Librería?
Si hemos realizado los pasos anteriores ya solo nos queda implementar para crear ejemplos.
Generar excel con PhpSpreadsheet: Ejemplos
A continuación, veremos ejemplos sobre el uso de esta gran librería.
A) Crear documentos y guardar en el disco
Crearemos un documento Excel, le pondremos algunas propiedades del archivo y veremos las cosas básicas.
<?php // Declaramos la libreria require __DIR__ . "/vendor/autoload.php"; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; $spread = new Spreadsheet(); $spread ->getProperties() ->setCreator("BaulPHP") ->setLastModifiedBy('Nestor Tapia') ->setTitle('Excel creado con PhpSpreadSheet') ->setSubject('Excel Demostración') ->setDescription('Excel generado como prueba') ->setKeywords('PHPSpreadsheet') ->setCategory('Categoría de prueba'); $writer = new Xlsx($spread); # Creamos el archivo y lo guardamos en el disco $writer->save('./doc_exportados/reporte_2022_01_01.xlsx'); ?>
B) Crear y descargar documento creado
Este script crea el documento y ejecuta la descarga directamente sin necesidad de guardarlo en disco del servidor.
<?php // Declaramos la librería require __DIR__ . "/vendor/autoload.php"; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; $spread = new Spreadsheet(); $spread ->getProperties() ->setCreator("Nestor Tapia") ->setLastModifiedBy('BaulPHP') ->setTitle('Excel creado con PhpSpreadSheet') ->setSubject('Excel de prueba') ->setDescription('Excel generado como demostración') ->setKeywords('PHPSpreadsheet') ->setCategory('Categoría Excel'); $fileName="Descarga_excel.xlsx"; # Crear un "escritor" $writer = new Xlsx($spread); # Le pasamos la ruta de guardado header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment; filename="'. urlencode($fileName).'"'); $writer->save('php://output'); ?>
C) Agregar contenido al archivo Excel
Cada documento Excel puede tener muchas hojas dentro. Y cada hoja tiene celdas que tienen una posición para poder identificarla (A1, B2, B3, …).
<?php // Declaramos la librería require __DIR__ . "/vendor/autoload.php"; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; $spread = new Spreadsheet(); $sheet = $spread->getActiveSheet(); $sheet->setTitle("Hoja 1"); $sheet->setCellValueByColumnAndRow(1, 1, "Valor A1"); $sheet->setCellValue("B1", "Valor celda B2"); $sheet->setCellValue("B2", "Valor celda B2"); $sheet->setCellValue("B3", "Valor celda B3"); $writer = new Xlsx($spread); $writer->save('./doc_exportados/reporte_de_excel.xlsx'); ?>
D) Crear documento desde MySQL
En ejemplos anteriores hemos apreciado la creación de documentos de Excel, tanto en guardar en disco y descargar el archivo.
<?php require_once "vendor/autoload.php"; # Nuestra base de datos require_once "db_conect.php"; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; # Obtener base de datos $con = ConexionBD(); $documento = new Spreadsheet(); $documento ->getProperties() ->setCreator("Nestor Tapia") ->setLastModifiedBy('BaulPHP') ->setTitle('Archivo generado desde MySQL') ->setDescription('Productos y proveedores exportados desde MySQL'); $hojaDeProductos = $documento->getActiveSheet(); $hojaDeProductos->setTitle("Productos"); # Encabezado de los productos $encabezado = ["Codigo", "Producto", "Precio de compra", "Precio de venta", "Existencia"]; # El último argumento es por defecto A1 $hojaDeProductos->fromArray($encabezado, null, 'A1'); $consulta = "select * from tbl_productos"; $sentencia = $con->prepare($consulta, [ PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, ]); $sentencia->execute(); # Comenzamos en la fila 2 $numeroDeFila = 2; while ($producto = $sentencia->fetchObject()) { # Obtener registros de MySQL $codigo = $producto->codigo; $productos = $producto->producto; $precio_compra = $producto->precio_compra; $precio_venta = $producto->precio_venta; $existencia = $producto->existencia; # Escribir registros en el documento $hojaDeProductos->setCellValueByColumnAndRow(1, $numeroDeFila, $codigo); $hojaDeProductos->setCellValueByColumnAndRow(2, $numeroDeFila, $productos); $hojaDeProductos->setCellValueByColumnAndRow(3, $numeroDeFila, $precio_compra); $hojaDeProductos->setCellValueByColumnAndRow(4, $numeroDeFila, $precio_venta); $hojaDeProductos->setCellValueByColumnAndRow(5, $numeroDeFila, $existencia); $numeroDeFila++; } # Ahora creamos la hoja "proveedores" $hojaDeProveedores = $documento->createSheet(); $hojaDeProveedores->setTitle("Proveedores"); # Declaramos el encabezado $encabezado = ["Nombres", "Dirección Email ", "Empresa", "Pais residencia"]; $hojaDeProveedores->fromArray($encabezado, null, 'A1'); # Obtener los proveedores de MySQL $consulta = "select * from tbl_proveedores"; $sentencia = $con->prepare($consulta, [ PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, ]); $sentencia->execute(); # Comenzamos en la 2 $numeroDeFila = 2; while ($proveedores = $sentencia->fetchObject()) { # Obtener los datos de la base de datos $nombres = $proveedores->nombres; $correo = $proveedores->correo; $empresa = $proveedores->empresa; $pais = $proveedores->pais; # Escribir en el documento $hojaDeProveedores->setCellValueByColumnAndRow(1, $numeroDeFila, $nombres); $hojaDeProveedores->setCellValueByColumnAndRow(2, $numeroDeFila, $correo); $hojaDeProveedores->setCellValueByColumnAndRow(3, $numeroDeFila, $empresa); $hojaDeProveedores->setCellValueByColumnAndRow(4, $numeroDeFila, $pais); $numeroDeFila++; } # Crear un "escritor" $writer = new Xlsx($documento); # Le pasamos la ruta de guardado $writer->save('./doc_exportados/Exportado_productos_proveedores.xlsx'); ?>
CONCLUSIÓN
En años anteriores para leer y crear documentos de Excel se usaba la librería PHPExcel. Sin embargo, hoy ya no podemos contar con esta librería porque cerró sus puertas.
Como podrás ver en los ejemplos, es bastante sencillo realizar operaciones sobre Excel.
Su implementación es muy sencilla y sus usos son variados. Además, hemos implementado un ejemplo con base de datos para exportar desde MySQL hacia Excel.
buenas, excelente todo, pero estoy intentando mandar un excel con fechas, pero no puedo, intente de todas fomas, formatos, pero nunca lo toma MYSQL, como puedo hacer para pasar una fecha de excel, y grabe en MYSQL. que formatos usar? como hacer que lo grabe en DATE?.
gracias.
Hola Nestor, excelente trabajo funciona muy bien hasta php 7.4 pero podrias probarlo para php 8, estoy teniendo problemas para hacerlo funcionar, gracias
Hola, en el ejemplo de descarga hace falta primero guardar el archivo con el nombre y luego si hacer el guardado con php output para que se genere correctamente, de tal forma que el código tendría una ligera modificación y sería asi
getProperties()
->setCreator(«Nestor Tapia»)
->setLastModifiedBy(‘BaulPHP’)
->setTitle(‘Excel creado con PhpSpreadSheet’)
->setSubject(‘Excel de prueba’)
->setDescription(‘Excel generado como demostración’)
->setKeywords(‘PHPSpreadsheet’)
->setCategory(‘Categoría Excel’);
$fileName=»Descarga_excel.xlsx»;
# Crear un «escritor»
$writer = new Xlsx($spread);
#Lo guardamos con su nombre
$writer->save($filename);
# Le pasamos la ruta de guardado
header(‘Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet’);
header(‘Content-Disposition: attachment; filename=»‘. urlencode($fileName).'»‘);
$writer->save(‘php://output’);
?>