Laravel-excel: Excelでファイルを開くときにエラーが発生しました。 データが破損しているか、ファイル拡張子が正しくない可能性があります。

作成日 2018年05月24日  ·  15コメント  ·  ソース: Maatwebsite/Laravel-Excel

前提条件

  • [x]コードの外部で動作を再現できるため、問題はLaravelExcelに限定されます。
  • [x]問題がまだ提出されていないことを確認しました。
  • [x]この問題を修正するPRが提出されていないかどうかを確認しました。

バージョン

  • PHPバージョン:7.1
  • Laravelバージョン:5.5。*
  • パッケージバージョン:^ 3.0

説明

FromQueryメソッドからファイルをダウンロードしています....ファイルをダウンロードすると、XLSXファイルを開くと、Officeから次のエラーメッセージが表示されます。
「Excelはファイルを開くことができませんファイル形式またはファイル拡張子が無効であるためです。 ファイルが破損していないこと、およびファイル拡張子がファイルの形式と一致していることを確認してください。」

再現する手順

これが私の方法です

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

コントローラーからこう呼んでいます

//$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');

予想される行動:

データとともにダウンロードするファイル

実際の動作:

ファイルはダウンロードされますが、Excelで開くとエラーが発生します

追加情報

クエリを雄弁にテストしましたが、データを含むコレクションが返されます。

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

最も参考になるコメント

皆さんこんにちは、

私はこの実行不可能なダウンロード機能を理解するために一日を過ごします。 PHPSpreadSheetはPHPバッファを使用しているようです。 また、PHPの構成によっては、いくつかの警告またはエラーが出力に干渉する可能性があります。

使用:

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

私のために解決します。
多分それは何人かの人々を助けるべきです。

この素晴らしいライブラリをありがとう。

全てのコメント15件

また、事前に感謝します:)

特に、このラッパーを最初に書くのに時間をかけるために

それでもPhpSpreadsheetで同じ問題があるかどうかはわかりませんが、PHPExcelでは、 <?phpオープンタグの前にスペース( )があるという問題がありました。 これは、過去にこのエラーを引き起こしていたものです。

uはnanoまたはvimでエラーファイルを開くことができます。
PKの前にスペースがある場合は、次のようになります。
image
コードまたはベンダーでエラーが発生した可能性があります。 私は同じ問題に遭遇し、ベンダーフォルダの削除に対処しました。 ベンダーを再インストールした後、うまく機能します

みなさん、リードありがとうございます。

ファイルの先頭に余分な改行などがあるのは正しいと思います。 まだトレースしていませんが、CSVに切り替えると、ファイルを開くことができ、データはありますが、最初の行は空白です。

もう少し見てみると、悪い報告があります。 改行で始まり、その後にファイルを取得しました

これを閉じて、問題のより適切な説明を含む新しいものを開きます。 空白行のソースが見つかりません

私は同じ問題に遭遇しました。 私はによって修正しました

  • サーバーにファイルを保存するExcel :: store
  • return redirect(Storage :: url( "storage / {$ filename}"));
    サンプル
    `` `
    public function export(Request $ request)
    {{
    $filename = 'meal_list_'.date('YmdHis').'.xlsx';
     Excel::store(new MealExport($request), $filename, 'public');
     return redirect( Storage::url("storage/{$filename}" ));
}

皆さんこんにちは、

私はこの実行不可能なダウンロード機能を理解するために一日を過ごします。 PHPSpreadSheetはPHPバッファを使用しているようです。 また、PHPの構成によっては、いくつかの警告またはエラーが出力に干渉する可能性があります。

使用:

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

私のために解決します。
多分それは何人かの人々を助けるべきです。

この素晴らしいライブラリをありがとう。

皆さんこんにちは、

私はこの実行不可能なダウンロード機能を理解するために一日を過ごします。 PHPSpreadSheetはPHPバッファを使用しているようです。 また、PHPの構成によっては、いくつかの警告またはエラーが出力に干渉する可能性があります。

使用:

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

私のために解決します。
多分それは何人かの人々を助けるべきです。

この素晴らしいライブラリをありがとう。

THanksはその完璧な答えをたくさん

皆さんこんにちは、

この解決策:

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

動作し、破損した問題を解決します。 ただし、Xlsx / Xlsを使用したエクスポートにはまだ問題があります。
ダウンロードしたファイルは次のようになります。
image

これを修正する方法はありますか?

どうも !

皆さんこんにちは、

私はこの実行不可能なダウンロード機能を理解するために一日を過ごします。 PHPSpreadSheetはPHPバッファを使用しているようです。 また、PHPの構成によっては、いくつかの警告またはエラーが出力に干渉する可能性があります。

使用:

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

私のために解決します。
多分それは何人かの人々を助けるべきです。

この素晴らしいライブラリをありがとう。

愛してる男..あなたは私の頭を救った...

それでもPhpSpreadsheetで同じ問題があるかどうかはわかりませんが、PHPExcelでは、 <?phpオープンタグの前にスペース( )があるという問題がありました。 これは、過去にこのエラーを引き起こしていたものです。

こんにちは@patrickbrouwers
コメントをありがとう。
私のために解決します。

ajaxを使用してダウンロードしている場合は、
responseType: 'blob'をajaxリクエストに追加してください(私はaxiosを使用しています)

私のサンプルコード:

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

responseType: 'blob'がないと、ダウンロードしたファイルを開くことができません

ajaxを使用してダウンロードしている場合は、
responseType: 'blob'をajaxリクエストに追加してください(私はaxiosを使用しています)

私のサンプルコード:

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

responseType: 'blob'がないと、ダウンロードしたファイルを開くことができません

感謝!! 私の命を救ってください、私は私のエクスポートされたファイルを破壊したphpコードのどの行を見続けます..結局はaxiosです

皆さんこんにちは、

私はこの実行不可能なダウンロード機能を理解するために一日を過ごします。 PHPSpreadSheetはPHPバッファを使用しているようです。 また、PHPの構成によっては、いくつかの警告またはエラーが出力に干渉する可能性があります。

使用:

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

私のために解決します。
多分それは何人かの人々を助けるべきです。

この素晴らしいライブラリをありがとう。

@Leenzuurに感謝し@ Leenzuurの方法では、10モデルのエクスポートクラスが10ある場合、ダウンロード時に10か所で追加する必要があります。

この問題は、エクスポートに変更を加えることなく、今日私に起こり始めました。 @leenzuurコードサンプルを使用すると、何時間もの調査の後で修正されました。

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