Laravel-excel: Ошибка при открытии файла в Excel. Возможно повреждение данных или неправильное расширение файла.

Созданный на 24 мая 2018  ·  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 выдает ошибку.

Дополнительная информация

Я проверил запрос красноречиво, и он возвращает коллекцию данных.

(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
Возможно, в вашем коде или в поставщике произошла ошибка. Я столкнулся с той же проблемой и решил удалить папку поставщика. Работает хорошо после переустановки производителя

Привет всем, спасибо за зацепку.

Я думаю, вы правы, что в начале файла есть лишний разрыв строки или что-то в этом роде. Я еще не отследил это, но когда я переключаюсь на CSV, я могу открыть файл, и данные есть, но первая строка пуста ...

Собираюсь посмотреть еще, плохо доложу. Я нашел файл, начинающийся с разрыва строки, а затем

Я собираюсь закрыть это и открыть новое с более подробным описанием проблемы. Я не могу найти источник пустой строки

я встретил ту же проблему. я исправлен

  • Excel :: store для хранения файла на сервере
  • возврат перенаправления (Storage :: url ("storage / {$ filename}"));
    образец
    `` ''
    экспорт публичной функции (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');

решает за меня.
Может быть, это должно помочь кому-то.

Спасибо за эту замечательную библиотеку.

Большое спасибо за прекрасный ответ

Всем привет,

Это решение:

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 местах.

Эта проблема начала происходить со мной сегодня, без каких-либо изменений в экспорте. Использование образца кода

Была ли эта страница полезной?
0 / 5 - 0 рейтинги