PHP Ejemplos

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.

Formatos de archivo compatibles phpspreadsheet
Formatos de archivo compatibles phpspreadsheet

¿Cuáles son los requisitos para usar la Librería?

  • Versión de PHP 7.1 o una más reciente.
  • Extensiones activas
    1. php_zip
    2. php_xml
    3. mb_string
    4. dom (opcional)
    5. php_gd2 (opcional)

Si desean mayor información sobre el tema, también pueden consultar el repositorio en GitHub.

GitHub – PHPOffice/PhpSpreadsheet

Nota:

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

composer install PHPOffice PhpSpreadsheet
composer install PHPOffice PhpSpreadsheet

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.

La última versión de PHPExcel, 1.8.1, se lanzó en 2015. El proyecto quedó oficialmente obsoleto en 2017 y se archivó permanentemente en 2019.
Viendo este detalle hemos implementado otra librería que está muy actualizada y funciona muy bien para manejar archivos Excel.
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.

Descarga 156 Sistemas PHP & MySQL

¿Te gusto el artículo? Puedes apoyarme invitándome un Café

Nestor Tapia

Bloggero, amante de la programación PHP, innovador y me fascina compartir información. Desde que conocí el entorno informatico y el internet me llamó la atención la programación, Por tal motivo he creado mi blog BAULPHP.COM para compartir mis experiencias con todos ustedes. ¡Gracias por leerme!.

Un comentario

  1. 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’);
    ?>

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba