Laravel-excel: Kesalahan Membuka file dengan Excel. Kemungkinan data rusak atau ekstensi file buruk.

Dibuat pada 24 Mei 2018  ·  15Komentar  ·  Sumber: Maatwebsite/Laravel-Excel

Prasyarat

  • [ x] Mampu mereproduksi perilaku di luar kode Anda, masalahnya diisolasi ke Laravel Excel.
  • [x ] Memeriksa apakah masalah Anda belum diajukan.
  • [ x] Diperiksa jika tidak ada PR yang dikirimkan yang memperbaiki masalah ini.

Versi

  • Versi PHP: 7.1
  • Versi Laravel: 5.5.*
  • Versi paket: ^3.0

Keterangan

Mengunduh file dari metode FromQuery.... unduhan file, saat membuka file XLSX, menerima pesan kesalahan dari Office:
"Excel tidak dapat membuka filekarena format file atau ekstensi file tidak valid. Verifikasi bahwa file tidak rusak dan ekstensi file cocok dengan format file"

Langkah-langkah untuk Reproduksi

Inilah metode saya

namespace Modules\Profile\Exports;

use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\Exportable;
use Modules\Profile\Entities\Profile;

class ProfileExport implements FromQuery
{
    use Exportable;

    public function __construct($range)
    {
        $this->start = $range['start'];
        $this->end = $range['end'];
    }

    public function query()
    {
      return Profile::query()->where('created_at', '>=', $this->start . ' 00:00:00')
                             ->where('created_at', '<=', $this->end . ' 23:59:59')
                             ->whereHas('user.roles', function($query){
                                  $query->where('id', 2);
                             });
    }
}

Saya menyebutnya seperti ini dari pengontrol

//$request->start = '2018-01-01';
//$request->end = '2018-05-01';

$range = ['start'=>$request->start, 'end'=>$request->end];
return (new ProfileExport($range))->download($request->start . '-' . $request->end .'-pet-parent-signups.xlsx');

Perilaku yang diharapkan:

File yang akan diunduh dengan data

Perilaku sebenarnya:

File diunduh tetapi Excel memberikan kesalahan saat membukanya

informasi tambahan

Saya telah menguji kueri dengan fasih dan mengembalikan koleksi dengan data.

(https://user-images.githubusercontent.com/18451450/40511758-f61e6570-5f5d-11e8-9f37-0b594f60be59.png)

Komentar yang paling membantu

Halo semuanya,

Saya menghabiskan hari saya untuk memahami fungsi unduhan yang tidak dapat dijalankan ini. PHPSpreadSheet tampaknya menggunakan buffer PHP. Dan tergantung pada konfigurasi PHP Anda, beberapa peringatan atau kesalahan dapat mengganggu output.

Menggunakan :

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

memecahkan untuk saya.
Mungkin itu harus membantu beberapa orang.

Terima kasih untuk perpustakaan yang luar biasa ini.

Semua 15 komentar

Terima kasih juga sebelumnya :)

Terutama untuk meluangkan waktu untuk menulis bungkus ini untuk memulai

Saya tidak yakin apakah itu masih masalah yang sama dengan PhpSpreadsheet, tetapi PHPExcel memiliki masalah dengan memiliki spasi ( ) di depan <?php tag terbuka. Itu dulu menyebabkan kesalahan ini di masa lalu.

Anda dapat membuka file kesalahan dengan nano atau vim.
Jika Anda melihat spasi sebelum PK, seperti ini
image
Mungkin kesalahan terjadi pada kode atau vendor Anda. Saya menemui masalah yang sama dan berurusan dengan menghapus folder vendor. Ini berfungsi dengan baik Setelah menginstal ulang vendor

Hai semua, terima kasih atas petunjuknya.

Saya pikir Anda benar bahwa ada jeda baris tambahan atau sesuatu di awal file. Saya belum melacaknya tetapi ketika saya beralih ke CSV, saya dapat membuka file dan datanya ada tetapi baris pertama kosong ....

Akan melihat lagi, laporan sakit kembali. Saya mengambil file yang dimulai dengan jeda baris dan kemudian

Saya akan menutup ini dan membuka yang baru dengan deskripsi masalah yang lebih baik. Saya tidak dapat menemukan sumber baris kosong

saya bertemu masalah yang sama. saya perbaiki oleh

  • Excel::menyimpan untuk menyimpan file di server
  • return redirect( Penyimpanan::url("penyimpanan/{$namafile}" ));
    Sampel
    ```
    ekspor fungsi publik(Permintaan $permintaan)
    {
    $filename = 'meal_list_'.date('YmdHis').'.xlsx';
     Excel::store(new MealExport($request), $filename, 'public');
     return redirect( Storage::url("storage/{$filename}" ));
}

Halo semuanya,

Saya menghabiskan hari saya untuk memahami fungsi unduhan yang tidak dapat dijalankan ini. PHPSpreadSheet tampaknya menggunakan buffer PHP. Dan tergantung pada konfigurasi PHP Anda, beberapa peringatan atau kesalahan dapat mengganggu output.

Menggunakan :

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

memecahkan untuk saya.
Mungkin itu harus membantu beberapa orang.

Terima kasih untuk perpustakaan yang luar biasa ini.

Halo semuanya,

Saya menghabiskan hari saya untuk memahami fungsi unduhan yang tidak dapat dijalankan ini. PHPSpreadSheet tampaknya menggunakan buffer PHP. Dan tergantung pada konfigurasi PHP Anda, beberapa peringatan atau kesalahan dapat mengganggu output.

Menggunakan :

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

memecahkan untuk saya.
Mungkin itu harus membantu beberapa orang.

Terima kasih untuk perpustakaan yang luar biasa ini.

Terima kasih banyak jawaban yang sempurna

Halo semuanya,

Solusi ini:

ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

Bekerja dan memecahkan masalah korup. Tetapi masih mengalami masalah dengan ekspor menggunakan Xlsx/Xls.
File yang diunduh terlihat seperti ini:
image

Adakah ide bagaimana cara memperbaikinya?

Terima kasih !

Halo semuanya,

Saya menghabiskan hari saya untuk memahami fungsi unduhan yang tidak dapat dijalankan ini. PHPSpreadSheet tampaknya menggunakan buffer PHP. Dan tergantung pada konfigurasi PHP Anda, beberapa peringatan atau kesalahan dapat mengganggu output.

Menggunakan :

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

memecahkan untuk saya.
Mungkin itu harus membantu beberapa orang.

Terima kasih untuk perpustakaan yang luar biasa ini.

Love You man .. Anda menyelamatkan kepalaku ...

Saya tidak yakin apakah itu masih masalah yang sama dengan PhpSpreadsheet, tetapi PHPExcel memiliki masalah dengan memiliki spasi ( ) di depan <?php tag terbuka. Itu dulu menyebabkan kesalahan ini di masa lalu.

Halo @patrickbrouwers
Terima kasih atas komentar Anda.
Memecahkan untuk saya.

Jika Anda menggunakan ajax untuk mengunduh,
tolong tambahkan responseType: 'blob' ke permintaan ajax Anda (saya menggunakan axios)

Kode contoh saya:

axios.post('/path/to/export', data, {
    responseType: 'blob',
})
.then(response => {
    const filename = 'file.xlsx';
    let blob = new Blob([response.data], {
        type: 'application/octet-stream',
    });

    if (typeof window.navigator.msSaveBlob !== 'undefined') {
        // IE workaround for "HTML7007: One or more blob URLs were
        // revoked by closing the blob for which they were created.
        // These URLs will no longer resolve as the data backing
        // the URL has been freed."
        window.navigator.msSaveBlob(blob, filename);
    } else {
        let blobURL = window.URL.createObjectURL(blob);
        let tempLink = document.createElement('a');
        tempLink.style.display = 'none';
        tempLink.href = blobURL;
        tempLink.download = filename;
        tempLink.click();
        window.URL.revokeObjectURL(blobURL);
    }
})

Tanpa responseType: 'blob' , file yang diunduh tidak dapat dibuka

Jika Anda menggunakan ajax untuk mengunduh,
tolong tambahkan responseType: 'blob' ke permintaan ajax Anda (saya menggunakan axios)

Kode contoh saya:

axios.post('/path/to/export', data, {
    responseType: 'blob',
})
.then(response => {
    const filename = 'file.xlsx';
    let blob = new Blob([response.data], {
        type: 'application/octet-stream',
    });

    if (typeof window.navigator.msSaveBlob !== 'undefined') {
        // IE workaround for "HTML7007: One or more blob URLs were
        // revoked by closing the blob for which they were created.
        // These URLs will no longer resolve as the data backing
        // the URL has been freed."
        window.navigator.msSaveBlob(blob, filename);
    } else {
        let blobURL = window.URL.createObjectURL(blob);
        let tempLink = document.createElement('a');
        tempLink.style.display = 'none';
        tempLink.href = blobURL;
        tempLink.download = filename;
        tempLink.click();
        window.URL.revokeObjectURL(blobURL);
    }
})

Tanpa responseType: 'blob' , file yang diunduh tidak dapat dibuka

Terima kasih!! selamatkan hidup saya, saya terus melihat baris kode php mana yang merusak file yang saya ekspor.. ternyata adalah axios

Halo semuanya,

Saya menghabiskan hari saya untuk memahami fungsi unduhan yang tidak dapat dijalankan ini. PHPSpreadSheet tampaknya menggunakan buffer PHP. Dan tergantung pada konfigurasi PHP Anda, beberapa peringatan atau kesalahan dapat mengganggu output.

Menggunakan :

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

memecahkan untuk saya.
Mungkin itu harus membantu beberapa orang.

Terima kasih untuk perpustakaan yang luar biasa ini.

Terima kasih @Leenzuur , Anda menyelamatkan hari saya! Itu berhasil! Saya ingin tahu apakah ada yang bisa memperbaiki ini tetapi @Leenzuur , Anda tahu apa yang saya maksud, jika saya memiliki 10 kelas Ekspor untuk 10 Model, saat mengunduh, saya harus menambahkan 10 tempat.

Masalah ini mulai terjadi pada saya hari ini tanpa perubahan pada ekspor apa pun. Menggunakan sampel kode @leenzuur memperbaikinya setelah berjam-jam penelitian.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat