Почему мой файл Excel не открывается с помощью PHP?

Мне нужно сделать экспорт данных в файл Excel, я думал это так просто :)

Я использую библиотеку PhpSpreadsheet (https://github.com/PHPOffice/PhpSpreadsheet)

Я пытаюсь использовать образцы PhpSpreadsheet и делать простые вещи:

  1. создать таблицу Xlsx
  2. Сохранить на жестком диске
  3. Открыть в браузере для скачивания

Есть мой код:

require_once $this->config->application->libraryDir . 'PhpSpreadsheet-master/vendor/autoload.php';

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Hello World !');

$writer = new Xlsx($spreadsheet);
$fileName = 'export/hello_world.xlsx';
$writer->save($fileName);

// header('Location: '.$fileName);
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename = "'.$fileName.'"');
header('Cache-Control: max-age=0');
$writer->save('php://output');

Результат: файл был создан в папке «Экспорт», я могу открыть его с помощью Windows. Но когда файл загружается в папку загрузок по умолчанию, я не могу его открыть. У меня есть эта ошибка: Excel обнаружил нечитаемое содержимое

У вас есть идея, почему эта проблема?

Может быть, есть какая-то разница в этих двух файлах? Я бы сравнил размер этих файлов в байтах как самый простой способ.

Gallyamov 16.07.2019 16:31

@Gallyamov это тот же файл ... я не понимаю

user1450740 16.07.2019 16:36

Можно ли использовать header('Content-Type: application/vnd.ms-excel'); вместо своего? И попробуйте сначала удалить $writer->save($fileName); (только для теста)

Gallyamov 16.07.2019 16:46

если я удалю $writer->save($fileName); невозможно будет открыть несуществующий файл

user1450740 16.07.2019 16:49

Попробуйте exitпогуглить после $writer->.save('php://output')?

Reed 16.07.2019 16:54

Перед тем, как header(...)s, попробуйте exiting убедиться, что выхода нет.

Reed 16.07.2019 16:55

И поскольку вы знаете, что $writer->save($fileName) работает, вы можете попробовать вместо того, чтобы звонить $writer->save('php://output'), вы можете сделать $writer->save($fileName); header(...); echo file_get_contents($fileName); Пробовать разные типы контента тоже может быть полезно.

Reed 16.07.2019 16:58

@Reed работает с exit(); .... Спасибо

user1450740 16.07.2019 17:05

@ user1450740, я разместил свои комментарии в качестве ответа, так как один из них сделал это. Рад, что вы смогли заставить его работать

Reed 16.07.2019 17:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
9
1 205
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте exitпогуглить после $writer->.save('php://output'). Для устранения неполадок перед header(...) попробуйте exiting, чтобы убедиться, что выход отсутствует.

И поскольку вы знаете, что $writer->save($fileName) работает, вы можете попробовать вместо того, чтобы звонить $writer->save('php://output'), вы можете сделать $writer->save($fileName); header(...); echo file_get_contents($fileName); Пробовать разные типы контента тоже может быть полезно.

Другие вопросы по теме