Laravel-excel: [ВОПРОС] Использовать существующий файл в качестве шаблона для добавления новых данных перед экспортом

Созданный на 22 февр. 2019  ·  5Комментарии  ·  Источник: Maatwebsite/Laravel-Excel

Предпосылки

Версии

  • Версия PHP: 7.2
  • Версия Laravel: 5.7
  • Версия пакета: 3.1

Описание

Я пытаюсь отредактировать существующий файл, чтобы использовать его в качестве шаблона. Я теперь понимаю, что для этой версии эта функция не разработана для легкого использования. Но я хотел бы знать, смогу ли я сделать это сам, используя функции внутри плагина и играя с function resisterEvents() .

Мне нужно скачать существующий файл и выбрать лист. Но не редактировать.

Это мой код:

    /**
     * <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);
            }
        ];
    }

Некоторые предложения?

Большое спасибо

Дополнительная информация

Я попытался добавить информацию в значение с помощью этого кода внутри function resisterEvents() и не работает:

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

А также для добавления данных через function query()

question

Самый полезный комментарий

->reopen() - это внутренний метод, и его следует использовать с осторожностью. Вероятно, вы можете обойти это, передав new LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx')) для повторного открытия.

Редактирование существующих файлов (шаблонов) входит в нашу дорожную карту (версия 3.3), но без конкретной даты выпуска.

Если вам это нужно в первую очередь, посетите наш раздел коммерческой поддержки: https://laravel-excel.com/commercial-support .

Все 5 Комментарий

Наконец, это сработало для меня в версии 3.1.0. В актуальной версии 3.1.10 это не работает, потому что функция reopen изменилась. Жду новых обновлений и улучшений редактирования существующего файла.

->reopen() - это внутренний метод, и его следует использовать с осторожностью. Вероятно, вы можете обойти это, передав new LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx')) для повторного открытия.

Редактирование существующих файлов (шаблонов) входит в нашу дорожную карту (версия 3.3), но без конкретной даты выпуска.

Если вам это нужно в первую очередь, посетите наш раздел коммерческой поддержки: https://laravel-excel.com/commercial-support .

Спасибо за быстрый ответ.

Я попробую так.

Сейчас это не приоритет, но я тестирую, потому что мне нужно будет добавить данные в существующий Excel с помощью макросов и динамических таблиц, добавить данные и пересчитать формулы Excel. Я пробую все это, потому что знаю, что это непросто сделать со сложным Excel.

Если я узнаю что-то хорошее, я сообщу тебе

В случае обновления, пожалуйста, прокомментируйте как можно скорее

Привет, @MarFelix. Я столкнулся с той же проблемой, и теперь у меня есть обходной путь, который я использую. Это может вам помочь.
Я покопался в коде сайта Mattwebsite, чтобы понять, как выполняется экспорт. Поэтому запомните следующие шаги, которые используются для загрузки файла:

  1. Вызовите Excel class, передав ваш Export class (в этом примере используется метод download )
  2. Класс Excel определяет, какой Writer следует использовать, и вызывает метод export в этом Writer .
  3. Writer открывает ваш Export (и вызывает событие BeforeExport ), затем заполняет НОВЫЙ лист, затем вызывает собственный метод write .
  4. Метод write ( Writer class) вызовет событие BeforeWriting и запишет в файл для других типов, кроме XLSX.

Вот почему BeforeWriting не работает, и если вы используете его на BeforeExport он будет работать, но на НОВОМ листе.

Чтобы обойти эту проблему, я добавляю флаг в метод получения данных экспорта (в моем случае FromCollection). Таким образом, это не будет выполняться на шаге 2. Затем на BeforeWriting я отмечаю флаг, получаю требуемый лист и вызываю для него метод export .

Это код:

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);
        },
    ];
}

Взгляните на методы download и write из Maatwebsite\Excel\Writer , это будет очень полезно.

С помощью этой информации и шагов можно было бы создать более сложный обходной путь.

Была ли эта страница полезной?
3 / 5 - 1 рейтинги