Blog personal

En este ejemplo vamos a utilizar la librería de PHP PHPOffice/PhpSpreadsheet que es la evolución de PHPExcel, para obtener ficheros Excel (xlsx) totalmente personalizados.

Este artículo es continuación del anterior en donde se explicó cómo se puede utilizar PHPWord para utilizar una plantilla y crear un documento Word (docx) con los datos de una factura o albarán.

Partiendo de los mismos datos y en la misma situación dispondremos de 2 nuevos botones para obtener un fichero Excel (xlsx) o ese mismo fichero pasado a formato Acrobat PDF (pdf).

Las funciones que hace el código, disparado desde un botón de la página VIEW de facturas, es:

  • Leer la plantilla que es un fichero Excel 2007 (xlsx).
  • Recuera los datos de la Base de datos.
  • Pega los datos de identificación del cliente en la plantilla.
  • Por cada una de las líneas de factura va añadiendo nueva fila y pegando los datos de esa línea.
  • Crear el fichero Excel o en su caso, pasar ese fichero excel a fichero PDF.

El código es:

Código de creación del Excel
 
<?php
require_once __DIR__ . '/../PhpSpreadsheet/vendor/autoload.php'; 
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Shared\Date;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
//  Template processor instance creation
$reader = IOFactory::createReader('Xlsx');
$spreadsheet = $reader->load(__DIR__ . '/PlantillaFactura.xlsx');
$idfactura= $_SESSION['idfactura'] ; // identificación de factura a obtener
// Recuperar datos de factura
$sql="SELECT Nif, NombreRazonSocial, Domicilio, RestoDomicilio, FechaFactura, TotalFactura FROM factura where idfactura = $idfactura";
$resql=db_query($sql,$conn);
$data=db_fetch_array($resql);
// Variables on different parts of document
$FechaFactura=$data['FechaFactura'];
$spreadsheet->getActiveSheet()->setCellValue('D1', Date::PHPToExcel($data['FechaFactura']));
$spreadsheet->getActiveSheet()->setCellValue('B2', $data['Nif']);
$spreadsheet->getActiveSheet()->setCellValue('B3', $data['NombreRazonSocial']);
$spreadsheet->getActiveSheet()->setCellValue('B5', $data['Domicilio']);
$spreadsheet->getActiveSheet()->setCellValue('B6', $data['RestoDomicilio']);
// read lines the invoice
$sql="SELECT Nombre, Precio, Cantidad, Valor  FROM linea_factura where factura_idfactura= $idfactura ";
$rsSql=db_query($sql,$conn);
$baseRow = 10;
$r=0;
while ($data2 = db_fetch_array($rsSql)){
    $row = $baseRow + $r;
    $spreadsheet->getActiveSheet()->insertNewRowBefore($row, 1);
    $spreadsheet->getActiveSheet()->setCellValue('A' . $row, $r + 1)
        ->setCellValue('B' . $row, $data2['Nombre'])
        ->setCellValue('C' . $row, $data2['Precio'])
        ->setCellValue('D' . $row, $data2['Cantidad'])
        ->setCellValue('E' . $row, $data2['Valor']);
            $r= $r+1;
      }
$spreadsheet->getActiveSheet()->removeRow($baseRow - 1, 1);
// -------------------- v pie para salvar el nuevo documento Word ------------------
$temp_file = tempnam(sys_get_temp_dir(), 'Excel');
// Save EXCEL
$writer = new Xlsx($spreadsheet);
$writer->save($temp_file);
// Save PDF
// $writer = new \PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf($spreadsheet);
// $writer->save($temp_file);
// ------------------ Operation with file result -------------------------------------------
$documento = file_get_contents($temp_file);
unlink($temp_file);  // delete file tmp
header("Content-Disposition: attachment; filename= factura.xlsx");
header('Content-Type: application/excel');
echo $documento;
?>

Para cualquier duda al respecto contactar conmigo a través de email.