Laravel-excel: 使用 Excel 打开文件时出错。 可能的数据已损坏或文件扩展名错误。

创建于 2018-05-24  ·  15评论  ·  资料来源: Maatwebsite/Laravel-Excel

先决条件

  • [ x] 能够重现代码之外的行为,该问题与 Laravel Excel 无关。
  • [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 打开时出错

附加信息

我已经用 eloquent 测试了查询,它返回一个包含数据的集合。

(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开放标签前有空格( )有问题。 过去常常导致此错误。

你可以用 nano 或 vim 打开错误文件。
如果你在PK前看到一个空格,就像这样:
image
也许您的代码或供应商发生了错误。 我遇到了同样的问题并处理了 remove vendor folder 。 重新安装供应商后效果很好

大家好,谢谢带头。

我认为您在文件开头有一个额外的换行符或其他内容是正确的。 我还没有追踪它,但是当我切换到 CSV 时,我可以打开文件并且数据在那里,但第一行是空白的....

多看几眼,病了回来汇报。 我搜索了一个以换行符开头的文件,然后

我将关闭它并打开一个新的,更好地描述问题。 我找不到空行的来源

我遇到了同样的问题。 我固定的

  • Excel::store 将文件存储在服务器上
  • return redirect( Storage::url("storage/{$filename}" ));
    样本
    ``
    公共函数导出(请求 $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');

为我解决。
也许它应该帮助一些人。

感谢您提供这个很棒的图书馆。

非常感谢它的完美答案

大家好,

这个解决方案:

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 等级