Загрузка файла с помощью метода 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, но у PHPExcel были проблемы с наличием пробелов ( ) перед открытыми тегами
<?php
. Это раньше вызывало эту ошибку.
Вы можете открыть файл с ошибкой с помощью nano или vim.
Если вы видите пробел перед PK, сделайте вот так :
Возможно, в вашем коде или в поставщике произошла ошибка. Я столкнулся с той же проблемой и решил удалить папку поставщика. Работает хорошо после переустановки производителя
Привет всем, спасибо за зацепку.
Я думаю, вы правы, что в начале файла есть лишний разрыв строки или что-то в этом роде. Я еще не отследил это, но когда я переключаюсь на 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 местах.
Эта проблема начала происходить со мной сегодня, без каких-либо изменений в экспорте. Использование образца кода
Самый полезный комментарий
Всем привет,
Я трачу свой день на то, чтобы понять эту неработающую функцию загрузки. PHPSpreadSheet, похоже, использует буфер PHP. И в зависимости от вашей конфигурации PHP некоторые предупреждения или ошибки могут мешать выводу.
С использованием :
решает за меня.
Может быть, это должно помочь кому-то.
Спасибо за эту замечательную библиотеку.