Laravel-excel: [質問]既存のファイルをテンプレートとして使用して、エクスポートする前に新しいデータを追加します

作成日 2019年02月22日  ·  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あなたの合格クラスExportクラスを(この例では、使用しているdownload法)
  2. Excelクラスは、使用するWriterを識別し、このWriter exportメソッドを呼び出します。
  3. Writer Export Writer開き(そしてBeforeExportイベントを呼び出し)、新しいシートにデータを入力してから、独自のwriteメソッドを呼び出します。
  4. writeメソッド( Writerクラス)は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);
        },
    ];
}

上を見てくださいdownloadwriteの方法Maatwebsite\Excel\Writer 、それは非常に有用となります。

この情報と手順を使用すると、より複雑な回避策を作成することができます。

このページは役に立ちましたか?
3 / 5 - 1 評価