Laravel-excel: [PREGUNTA] Use el archivo existente como plantilla para agregar nuevos datos antes de exportar

Creado en 22 feb. 2019  ·  5Comentarios  ·  Fuente: Maatwebsite/Laravel-Excel

Prerrequisitos

Versiones

  • Versión de PHP: 7.2
  • Versión de Laravel: 5.7
  • Versión del paquete: 3.1

Descripción

Estoy intentando editar un archivo existente para usarlo como plantilla. Ahora que para esta versión, esta función no está desarrollada para usarla fácilmente. Pero me gustaría saber si usando las funciones dentro del complemento y jugando con function resisterEvents() podría hacerlo yo mismo.

Tengo que descargar un archivo existente y seleccionar una hoja. Pero no para editarlo.

Este es mi codigo:

    /**
     * <strong i="16">@return</strong> array
     */
    public function registerEvents(): array
    {
        return [
            BeforeWriting::class  => function(BeforeWriting $event) {
                $event->writer->reopen(storage_path('app/public/files/mytemplate.xlsx'),Excel::XLSX);
                $event->writer->getSheetByIndex(0);
                return $event->getWriter()->getSheetByIndex(0);
            }
        ];
    }

¿Algunas sugerencias?

Muchas gracias

Información Adicional

Intenté agregar información en un valor con este código dentro de function resisterEvents() y no funciona:

AfterSheet::class => function(AfterSheet $event) {
       $event->sheet->setCellValue('G2', 'Hello world');
}

Y también para agregar datos a través de function query()

question

Comentario más útil

->reopen() es un método interno y debe usarse con precaución. Probablemente pueda solucionarlo pasando new LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx')) para reabrir.

La edición de archivos existentes (plantillas) está en nuestra hoja de ruta (versión 3.3), pero sin una fecha de lanzamiento específica.

Si lo necesita con prioridad, consulte nuestra sección de Soporte comercial: https://laravel-excel.com/commercial-support .

Todos 5 comentarios

Finalmente esto funcionó para mí en la versión 3.1.0. En la versión actual 3.1.10 esto no funciona porque la función reopen ha cambiado. Esperando nuevas actualizaciones y mejoras para editar un archivo existente.

->reopen() es un método interno y debe usarse con precaución. Probablemente pueda solucionarlo pasando new LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx')) para reabrir.

La edición de archivos existentes (plantillas) está en nuestra hoja de ruta (versión 3.3), pero sin una fecha de lanzamiento específica.

Si lo necesita con prioridad, consulte nuestra sección de Soporte comercial: https://laravel-excel.com/commercial-support .

Gracias por esta rápida respuesta.

Lo intentaré de esta manera.

Esto no es una prioridad en este momento, pero estoy probando porque necesitaré agregar datos a un Excel existente con macros y tablas dinámicas, agregando datos y recalculando fórmulas de Excel. Estoy intentando todo esto porque sé que no es fácil de hacer con un Excel complejo.

Si averiguo algo bueno te reportaré

En caso de una actualización, por favor comente lo antes posible.

Hola, @MarFelix. Estaba enfrentando el mismo problema y ahora tengo una solución que estoy usando. Esto puede ayudarte.
Profundicé en el código de Mattwebsite para comprender cómo se realiza la exportación. Así que recuerde estos pasos que se utilizan para descargar el archivo:

  1. Llame a la clase Excel pasando su clase Export (este ejemplo utiliza el método download )
  2. La clase Excel identifica qué Writer debe usarse y llama al método export en este Writer .
  3. El Writer abre su Export (y llama al evento BeforeExport ), luego completa una hoja NUEVA , luego llama a su propio método write .
  4. El método write ( Writer clase) llamará al evento BeforeWriting y escribirá en el archivo para otros tipos distintos a XLSX

Entonces, es por eso que BeforeWriting no funcionan, y si lo usas en BeforeExport funcionará pero en una hoja NUEVA .

Para solucionarlo, agrego una marca en el método para obtener los datos de exportación (en mi caso, FromCollection). De esta manera no se procesará en el paso 2. Luego, en BeforeWriting marco la bandera, obtengo la hoja deseada y llamo al método export en ella.

Ese es el código:

public function collection()
{
    if ($this->calledByEvent) { // flag
        return $this->myCollectionToExport;
    }

    return collect([]);
}

public function registerEvents(): array
{
    return [
        BeforeWriting::class => function(BeforeWriting $event) {
            $templateFile = new LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx'));
            $event->writer->reopen($templateFile, Excel::XLSX);
            $event->writer->getSheetByIndex(0);

            $this->calledByEvent = true; // set the flag
            $event->writer->getSheetByIndex(0)->export($event->getConcernable()); // call the export on the first sheet

            return $event->getWriter()->getSheetByIndex(0);
        },
    ];
}

Eche un vistazo a los métodos download y write de Maatwebsite\Excel\Writer , será muy útil.

Con esta información y pasos, sería posible crear una solución alternativa más compleja.

¿Fue útil esta página
3 / 5 - 1 calificaciones