Laravel-excel: [PERTANYAAN] Gunakan file yang ada sebagai template untuk menambahkan data baru sebelum ekspor

Dibuat pada 22 Feb 2019  ·  5Komentar  ·  Sumber: Maatwebsite/Laravel-Excel

Prasyarat

Versi

  • Versi PHP: 7.2.2
  • Versi Laravel: 5.7
  • Versi paket: 3.1.0

Deskripsi

Saya mencoba mengedit file yang ada untuk digunakan sebagai template. Sekarang untuk versi ini, fungsi ini tidak dikembangkan untuk digunakan dengan mudah. Tapi saya ingin tahu apakah menggunakan fungsi di dalam plugin dan bermain dengan function resisterEvents() saya bisa melakukannya sendiri.

Saya harus mengunduh file yang ada dan memilih selembar. Tapi bukan untuk mengeditnya.

Ini kode saya:

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

Beberapa saran?

Terimakasih banyak

informasi tambahan

Saya mencoba menambahkan info dalam nilai dengan kode ini di dalam function resisterEvents() dan tidak berfungsi:

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

Dan juga untuk menambahkan data melalui function query()

question

Komentar yang paling membantu

->reopen() adalah metode internal dan harus digunakan dengan hati-hati. Anda mungkin dapat mengatasinya dengan mengirimkan new LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx')) untuk membuka kembali.

Mengedit file yang ada (template) ada di peta jalan kami (versi 3.3), tetapi tanpa tanggal rilis tertentu.

Jika Anda membutuhkannya sebagai prioritas, silakan lihat bagian Dukungan Komersial kami: https://laravel-excel.com/commercial-support .

Semua 5 komentar

Akhirnya ini berhasil untuk saya pada versi 3.1.0. Dalam versi sebenarnya 3.1.10 ini tidak berfungsi karena reopen fungsi telah berubah. Menunggu pembaruan baru dan peningkatan pengeditan file yang ada.

->reopen() adalah metode internal dan harus digunakan dengan hati-hati. Anda mungkin dapat mengatasinya dengan mengirimkan new LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx')) untuk membuka kembali.

Mengedit file yang ada (template) ada di peta jalan kami (versi 3.3), tetapi tanpa tanggal rilis tertentu.

Jika Anda membutuhkannya sebagai prioritas, silakan lihat bagian Dukungan Komersial kami: https://laravel-excel.com/commercial-support .

Terima kasih atas jawaban cepat ini.

Saya akan mencoba cara ini.

Ini bukan prioritas saat ini tetapi saya sedang menguji karena saya perlu menambahkan data ke excel yang ada dengan makro dan tabel dinamis, menambahkan data dan menghitung ulang rumus excel. Saya mencoba semua ini karena saya tahu ini tidak mudah dilakukan dengan excel yang kompleks.

Jika saya menemukan sesuatu yang baik, saya akan melaporkan Anda

Jika ada pembaruan, harap beri komentar sesegera mungkin

Halo, @MarFelix. Saya menghadapi masalah yang sama dan sekarang saya memiliki solusi yang saya gunakan. Ini dapat membantu Anda.
Saya menggali lebih dalam kode situs web Matt untuk memahami bagaimana ekspor dilakukan. Jadi ingat langkah-langkah ini yang digunakan untuk mengunduh file:

  1. Panggil Excel class lewat Export class Anda (contoh ini menggunakan metode download )
  2. Kelas Excel mengidentifikasi Writer harus digunakan dan memanggil metode export dalam Writer .
  3. Writer membuka Export (dan memanggil acara BeforeExport ), lalu mengisi lembar BARU , lalu memanggil metode write miliknya sendiri.
  4. Metode write ( Writer class) akan memanggil acara BeforeWriting dan menulis pada file untuk jenis lain selain XLSX

Jadi itulah mengapa BeforeWriting tidak berfungsi, dan jika Anda menggunakannya pada BeforeExport itu akan berhasil tetapi dalam lembar BARU .

Untuk menyiasatinya, saya menambahkan tanda pada metode untuk mendapatkan data ekspor (dalam kasus saya, FromCollection). Dengan cara ini tidak akan diproses pada langkah 2. Kemudian, pada BeforeWriting saya menandai bendera, mendapatkan lembar yang diinginkan dan memanggil metode export di atasnya.

Itulah kodenya:

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

Lihatlah metode download dan write dari Maatwebsite\Excel\Writer , itu akan sangat membantu.

Dengan informasi dan langkah-langkah ini, dimungkinkan untuk membuat solusi yang lebih kompleks.

Apakah halaman ini membantu?
3 / 5 - 1 peringkat

Masalah terkait

amine8ghandi8amine picture amine8ghandi8amine  ·  3Komentar

dr3ads picture dr3ads  ·  3Komentar

contifico picture contifico  ·  3Komentar

matthewslouismarie picture matthewslouismarie  ·  3Komentar

daraghoshea picture daraghoshea  ·  3Komentar