Estou tentando editar um arquivo existente para usar como modelo. Eu agora que para esta versão, esta função não foi desenvolvida para usar facilmente. Mas gostaria de saber se usando as funções dentro do plugin e brincando com o function resisterEvents()
eu poderia fazer isso sozinho.
Eu tenho que baixar um arquivo existente e selecionar uma planilha. Mas não para editá-lo.
Este é o meu código:
/**
* <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);
}
];
}
Algumas sugestões?
Muito Obrigado
Tentei adicionar informações em um valor com este código dentro de function resisterEvents()
e não funcionou:
AfterSheet::class => function(AfterSheet $event) {
$event->sheet->setCellValue('G2', 'Hello world');
}
E também para anexar dados por meio de function query()
Finalmente, isso funcionou para mim na versão 3.1.0. Na versão atual 3.1.10 isso não funciona porque a função reopen
mudou. Esperando por novas atualizações e melhorias na edição de um arquivo existente.
->reopen()
é um método interno e deve ser usado com cautela. Você provavelmente pode contornar isso passando new LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx'))
para reabrir.
A edição de arquivos existentes (modelos) está em nosso roteiro (versão 3.3), mas sem uma data de lançamento específica.
Se você precisar prioritariamente, dê uma olhada em nossa seção de Suporte Comercial: https://laravel-excel.com/commercial-support .
Obrigado por esta resposta rápida.
Vou tentar desta forma.
Isso não é uma prioridade agora, mas estou testando porque precisarei adicionar dados a um Excel existente com macros e tabelas dinâmicas, adicionando dados e recalculando fórmulas do Excel. Estou tentando tudo isso porque sei que não é fácil fazer com um Excel complexo.
Se eu descobrir algo bom, irei denunciá-lo
Em caso de atualização, por favor, comente o mais rápido possível
Olá, @MarFelix. Eu estava enfrentando o mesmo problema e agora tenho uma solução alternativa que estou usando. Isso pode te ajudar.
Pesquisei profundamente no código do Mattwebsite para entender como a exportação é feita. Portanto, lembre-se destas etapas usadas para baixar o arquivo:
Excel
class passando sua Export
class (este exemplo está usando o método download
)Excel
identifica qual Writer
deve ser usado e chama o método export
neste Writer
.Writer
abre seu Export
(e chama BeforeExport
evento), então preenche uma NOVA planilha, então chama seu próprio método write
.write
( Writer
class) chamará o evento BeforeWriting
e gravará no arquivo para outros tipos além de XLSXEntão é por isso que BeforeWriting
não funciona, e se você usá-lo em BeforeExport
ele funcionará, mas em uma nova planilha.
Para contornar o problema, adiciono um sinalizador no método para obter os dados de exportação (no meu caso, FromCollection). Desta forma, não será processado no passo 2. Então, em BeforeWriting
eu marco o sinalizador, pego a planilha desejada e chamo o método export
nela.
Esse é o 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);
},
];
}
Dê uma olhada nos métodos download
e write
de Maatwebsite\Excel\Writer
, será muito útil.
Com essas informações e etapas, seria possível criar uma solução alternativa mais complexa.
Comentários muito úteis
->reopen()
é um método interno e deve ser usado com cautela. Você provavelmente pode contornar isso passandonew LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx'))
para reabrir.A edição de arquivos existentes (modelos) está em nosso roteiro (versão 3.3), mas sem uma data de lançamento específica.
Se você precisar prioritariamente, dê uma olhada em nossa seção de Suporte Comercial: https://laravel-excel.com/commercial-support .