Blog personal

Esto es un ejemplo con el que pretendo explicar cómo funciona la librería de phpWord, que se puede descargar desde este punto.

Para poder hacer el ejemplo he utilizado un modelo simple de datos donde dispongo de las entidades de:

  • Cliente
  • Producto
  • Factura
  • Línea de factura

Para ejecutar el código de obtener el fichero Word he utilizado un botón (código snippet) en la VIEW de factura.

También, para facilitar el diseño de la factura he utilizado la funcionalidad de utilizar «Templates», que es muy interesante.

El código de obtención del documento Word es:

Crear documento Word
 
<?php
include_once 'PHPWord/Sample_Header.php';
$idfactura= $_SESSION['idfactura'] ; // identificación de factura a obtener
// Template processor instance creation
$template_word = __DIR__.'/PlantillaFactura.docx';
$templateProcessor = new \PhpOffice\PhpWord\TemplateProcessor($template_word);
// -------------------- ^ cabecera necesaria para las plantillas de Word ------------------
$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
$templateProcessor->setValue('NIF', $data['Nif']); 
$templateProcessor->setValue('Nombre', $data['NombreRazonSocial']);  
$templateProcessor->setValue('Direccion1', $data['Domicilio']);
$templateProcessor->setValue('Direccion2', $data['RestoDomicilio']);
$templateProcessor->setValue('Total', $data['TotalFactura']);
$FechaFactura=$data['FechaFactura'];
$sql="SELECT count(*) Lineas FROM linea_factura where factura_idfactura= $idfactura";
$resql=db_query($sql,$conn);
$data=db_fetch_array($resql);
$NumeroLineas= $data['Lineas']; // número de líneaas de factura
// Simple table
$templateProcessor->cloneRow('rowArticulo', $NumeroLineas);
$sql="SELECT Nombre, Precio, Cantidad, Valor  FROM linea_factura where factura_idfactura= $idfactura ";
$rsSql=db_query($sql,$conn);
$countLines=0;
while ($data2 = db_fetch_array($rsSql)){
            $countLines=$countLines+1;
            $templateProcessor->setValue('rowArticulo#'.$countLines, $data2['Nombre']);
            $templateProcessor->setValue('rowPrecio#'.$countLines, $data2['Precio']);
            $templateProcessor->setValue('rowCantidad#'.$countLines, $data2['Cantidad']);
            $templateProcessor->setValue('rowValor#'.$countLines, $data2['Valor']);
      }
// Date Local completed
$date = DateTime::createFromFormat('Y-m-d', $FechaFactura);
$formatter = new IntlDateFormatter('es_ES', IntlDateFormatter::LONG, IntlDateFormatter::LONG);
$formatter->setPattern("d 'de' MMMM 'de' yyyy");
$mydate = $formatter->format($date);
$templateProcessor->setValue('FechaDeHoyCompleta', $mydate);
// -------------------- v pie para salvar el nuevo documento Word ------------------
$temp_file = tempnam(sys_get_temp_dir(), 'Word');
$templateProcessor->saveAS($temp_file);
// ------------------ Operation with file result -------------------------------------------
$documento = file_get_contents($temp_file);
header("Content-Disposition: attachment; filename= factura.docx");
header('Content-Type: application/word');
echo $documento;
?>

También, en el área de adjunto dejo el ejemplo completo de formato PHPRunner 9.8 y un juego de datos básico.

Si necesitáis cuaquier dato adicional, por favor, poneros en contacto a través de email.