从 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 是否仍然存在同样的问题,但是 PHPExcel 在<?php
开放标签前有空格( )有问题。 过去常常导致此错误。
你可以用 nano 或 vim 打开错误文件。
如果你在PK前看到一个空格,就像这样:
也许您的代码或供应商发生了错误。 我遇到了同样的问题并处理了 remove vendor folder 。 重新安装供应商后效果很好
大家好,谢谢带头。
我认为您在文件开头有一个额外的换行符或其他内容是正确的。 我还没有追踪它,但是当我切换到 CSV 时,我可以打开文件并且数据在那里,但第一行是空白的....
多看几眼,病了回来汇报。 我搜索了一个以换行符开头的文件,然后
我将关闭它并打开一个新的,更好地描述问题。 我找不到空行的来源
我遇到了同样的问题。 我固定的
$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 导出。
下载的文件如下所示:
知道如何解决这个问题吗?
谢谢 !
大家好,
我花了一天的时间来了解这个不可行的下载功能。 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代码示例修复了它。
最有用的评论
大家好,
我花了一天的时间来了解这个不可行的下载功能。 PHPSpreadSheet 似乎使用 PHP 缓冲区。 根据您的 PHP 配置,一些警告或错误可能会干扰输出。
使用 :
为我解决。
也许它应该帮助一些人。
感谢您提供这个很棒的图书馆。