Trabajo con Excel en PHP: bibliotecas PhpSpreadsheet y OpenSpout

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajo con Excel en PHP: revisión de las mejores bibliotecas

El procesamiento de hojas de cálculo es una de las tareas comunes en el desarrollo web. En PHP existen varias herramientas probadas para crear, leer y editar archivos de Excel. En este artículo revisaremos dos bibliotecas clave: PhpSpreadsheet (sucesora de la popular PHPExcel) y la ligera OpenSpout, diseñada para la escritura y lectura rápida de archivos grandes.



1. Instalación mediante Composer

Ambas bibliotecas se instalan con el gestor de paquetes estándar Composer. Ejecute en la terminal en la raíz del proyecto:

# Para PhpSpreadsheet (funcionalidad completa de Excel)composer require phpoffice/phpspreadsheet

# Para OpenSpout (alto rendimiento en datos grandes)composer require openspout/openspout

Después de la instalación, incluya la autocarga al inicio del script:

require_once __DIR__ . '/vendor/autoload.php';


2. PhpSpreadsheet: creación y estilización de archivos Excel

La biblioteca admite los formatos XLSX, XLS, ODS, CSV y otros. Permite gestionar estilos, combinar celdas, insertar imágenes y fórmulas.

Ejemplo: creación de un informe simple

use PhpOffice\\PhpSpreadsheet\\Spreadsheet;use PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx;use PhpOffice\\PhpSpreadsheet\\Style\\Alignment;

$spreadsheet = new Spreadsheet();$sheet = $spreadsheet->getActiveSheet();

// Encabezados$sheet->setCellValue('A1', 'Producto');$sheet->setCellValue('B1', 'Cantidad');$sheet->setCellValue('C1', 'Precio, EUR');

// Datos$data = [ ['Portátil', 5, 45000], ['Monitor', 10, 15000], ['Teclado', 20, 2500],];$row = 2;foreach ($data as $item) { $sheet->setCellValue("A{$row}", $item[0]); $sheet->setCellValue("B{$row}", $item[1]); $sheet->setCellValue("C{$row}", $item[2]); $row++;}

// Fórmula de total$sheet->setCellValue("A{$row}", 'Total');$sheet->setCellValue("C{$row}", "=SUM(C2:C" . ($row-1) . ")");

// Estilización de encabezados$styleHeader = [ 'font' => ['bold' => true, 'size' => 12], 'alignment' => ['horizontal' => Alignment::HORIZONTAL_CENTER], 'fill' => ['fillType' => \\PhpOffice\\PhpSpreadsheet\\Style\\Fill::FILL_SOLID, 'color' => ['rgb' => 'E0E0E0']]];$sheet->getStyle('A1:C1')->applyFromArray($styleHeader);

// Autoancho de columnasforeach (range('A', 'C') as $col) { $sheet->getColumnDimension($col)->setAutoSize(true);}

// Guardado$writer = new Xlsx($spreadsheet);$writer->save('report.xlsx');echo "¡Archivo report.xlsx creado!";


Lectura de un archivo XLSX existente

use PhpOffice\\PhpSpreadsheet\\IOFactory;

$inputFileName = 'example.xlsx';$spreadsheet = IOFactory::load($inputFileName);$sheet = $spreadsheet->getActiveSheet();

$highestRow = $sheet->getHighestRow();$highestColumn = $sheet->getHighestColumn();

for ($row = 1; $row <= $highestRow; $row++) { $rowData = $sheet->rangeToArray("A{$row}:{$highestColumn}{$row}", NULL, TRUE, FALSE); echo implode(', ', $rowData[0]) . "<br>";}


3. OpenSpout: trabajo rápido con tablas grandes

OpenSpout está optimizado para escritura y lectura en flujo. No admite estilos ni fórmulas, pero es ideal para exportar miles de filas de datos (por ejemplo, descarga desde una base de datos).

Ejemplo: escritura de 10 000 filas en CSV/XLSX

use OpenSpout\\Writer\\XLSX\\Writer;use OpenSpout\\Common\\Entity\\Row;

$writer = new Writer();$writer->openToFile('big_export.xlsx');

// Encabezados$headerRow = Row::fromValues(['ID', 'Nombre', 'Email']);$writer->addRow($headerRow);

for ($i = 1; $i <= 10000; $i++) { $row = Row::fromValues([$i, "User{$i}", "user{$i}@example.com"]); $writer->addRow($row);}

$writer->close();echo "¡Exportación completada!";


Lectura de un archivo XLSX grande línea por línea

use OpenSpout\\Read                    

Recommendations