Сгенерированный PHPExcel файл Excel не работает. (Формат файла или расширение неверно)

Сгенерированный PHPExcel файл Excel не работает. (Формат файла или расширение неверно)

Пример кода PHPExcel успешно выполняется на моем локальном компьютере, файл загружается на локальный компьютер и успешно открывается в Excel 2007. Но использование того же кода на моем сервере дает неверный файл для Excel, который при открытии и восстановлении открывается успешно.

Я не хочу использовать опцию Open and Repair, а только опцию Open.

Не можете найти проблему? Пожалуйста помоги.

$objPHPExcel->setActiveSheetIndex(0);

//for XLSX
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="item_list.xlsx"');
header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');

exit;

7 ответов

Решение

Файл, который вы опубликовали, имеет один пробел перед выводом PHPExcel... проверьте ваш скрипт, чтобы увидеть, где это может быть отправлено в выходной поток php://. Проверьте, что нет места перед вашим начальным <?php открывающий тег; обратите особое внимание на ?> <?php или аналогичные закрывающие / открывающие теги. А также проверьте все файлы, которые могут быть included по вашему сценарию

Добавить строку ob_end_clean(); в конце вашей программы перед строкой $objWriter->save('php://output');

Код выглядит так: // для XLSX

$objPHPExcel->setActiveSheetIndex(0);

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');


header('Content-Disposition: attachment;filename="item_list.xlsx"');

header('Cache-Control: max-age=0');


$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');

ob_end_clean();
$objWriter->save('php://output');


exit;

Проверьте наличие любых поддельных символов в файле, открыв его в текстовом редакторе. Если есть, вы, вероятно, можете выяснить, где они представлены. Пробелы или разрывы строк являются очевидными виновниками.

Кроме того, убедитесь, что нет пробелов или символов новой строки перед <?php тег или после ?> пометить в любом из ваших файлов.

xlsx Формат на самом деле представляет собой коллекцию в архиве xml файлы, поэтому если в текстовом редакторе нет видимых текстовых строк (кроме подписи PK), попробуйте распаковать их. Это может дать другие подсказки к проблеме.

Если вы работаете на платформе Windows, то там были некоторые ошибочные версии ZipArchive php_zip.dll библиотека ссылок, которая может вызвать эту ошибку. Вы можете использовать PCLZip в качестве альтернативы ZipArchive.

ЯВЛЯЕТСЯ application/vnd.ms-excel

И НЕ

application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

ПРИМЕР ДЛЯ XLS:

$objPHPExcel = new PHPExcel();

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="item_list.xlsx"');
header('Cache-Control: max-age=0');
$objWriter->save('php://output');

ПРИМЕР ДЛЯ XLSX:

$objPHPExcel = new PHPExcel();

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="item_list.xlsx"');
header('Cache-Control: max-age=0');
$objWriter->save('php://output');

Написание файла Excel - это не просто предоставление произвольному файлу расширения xlsx или xls.

Вы можете написать файл BIFF5 или BIFF8 xls (все версии Excel 95 будут читать это), или существует XML-формат Excel 2003, который может быть открыт как в Excel 2003, так и в Excel2007 (а также в Excel 2010).

Для получения более подробной информации и примеров использования Excel 2007 вы можете обратиться к странице примеров PHPExcel.

Дайте мне знать, если я могу помочь вам больше.

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

"?>" 

Обычно рекомендуется избегать использования закрывающего тега php, поскольку они также идут в выходной буфер. Использование ob_end_clean() также является хорошим вариантом.

Можно найти более подробную информацию. Почему бы опустить закрывающий тег?

Я решил свою проблему, я установил zip с помощью команды

sudo apt-get установите php7.0-zip и перезапустите сервер.sudo service apache2 restart Это работает для меня, я использовал https://github.com/PHPOffice/PhpSpreadsheet

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