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
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()
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:
Excel
pasando su clase Export
(este ejemplo utiliza el método download
)Excel
identifica qué Writer
debe usarse y llama al método export
en este Writer
.Writer
abre su Export
(y llama al evento BeforeExport
), luego completa una hoja NUEVA , luego llama a su propio método write
.write
( Writer
clase) llamará al evento BeforeWriting
y escribirá en el archivo para otros tipos distintos a XLSXEntonces, 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.
Comentario más útil
->reopen()
es un método interno y debe usarse con precaución. Probablemente pueda solucionarlo pasandonew 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 .