Laravel-excel: [PERGUNTA] Use o arquivo existente como um modelo para anexar novos dados antes de exportar

Criado em 22 fev. 2019  ·  5Comentários  ·  Fonte: Maatwebsite/Laravel-Excel

Pré-requisitos

Versões

  • Versão PHP: 7.2
  • Versão do Laravel: 5.7
  • Versão do pacote: 3.1

Descrição

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

informação adicional

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()

question

Comentários muito úteis

->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 .

Todos 5 comentários

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:

  1. Chame Excel class passando sua Export class (este exemplo está usando o método download )
  2. A classe Excel identifica qual Writer deve ser usado e chama o método export neste Writer .
  3. O Writer abre seu Export (e chama BeforeExport evento), então preenche uma NOVA planilha, então chama seu próprio método write .
  4. O método write ( Writer class) chamará o evento BeforeWriting e gravará no arquivo para outros tipos além de XLSX

Entã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.

Esta página foi útil?
3 / 5 - 1 avaliações