Я пытаюсь отредактировать существующий файл, чтобы использовать его в качестве шаблона. Я теперь понимаю, что для этой версии эта функция не разработана для легкого использования. Но я хотел бы знать, смогу ли я сделать это сам, используя функции внутри плагина и играя с 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()
Наконец, это сработало для меня в версии 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, чтобы понять, как выполняется экспорт. Поэтому запомните следующие шаги, которые используются для загрузки файла:
Excel
class, передав ваш Export
class (в этом примере используется метод download
)Excel
определяет, какой Writer
следует использовать, и вызывает метод export
в этом Writer
.Writer
открывает ваш Export
(и вызывает событие BeforeExport
), затем заполняет НОВЫЙ лист, затем вызывает собственный метод write
.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
, это будет очень полезно.
С помощью этой информации и шагов можно было бы создать более сложный обходной путь.
Самый полезный комментарий
->reopen()
- это внутренний метод, и его следует использовать с осторожностью. Вероятно, вы можете обойти это, передавnew LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx'))
для повторного открытия.Редактирование существующих файлов (шаблонов) входит в нашу дорожную карту (версия 3.3), но без конкретной даты выпуска.
Если вам это нужно в первую очередь, посетите наш раздел коммерческой поддержки: https://laravel-excel.com/commercial-support .