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

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

Пример кода PHPExcel успешно выполняется на моем локальном ПК, файл загружается на локальный компьютер и успешно открывается в Excel 2007. Но использование того же кода на моем сервере дает неверный файл для превосходства, который, когда я ОТКРЫВАЮ И ИСПРАВЛЯЮ, затем успешно открывается.

Я не хочу использовать опцию «Открыть и восстановить», а только опцию «Открыть».

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

$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;

person sqlchild    schedule 29.05.2013    source источник
comment
Не зная точного содержимого файла xlsx, очень сложно определить, на какие из нескольких миллионов возможностей MS Excel жалуется... какие дополнительные функции (такие как автофильтры, диаграммы и т. д.) вы используете? Какая версия MS Excel? Если вы записываете файл на диск сервера, а не сохраняете через браузер, у вас остается та же проблема? Он по-прежнему жалуется, если вы используете средство записи Excel5 и сохраняете в виде файла .xls? Можете ли вы загрузить копию файла на веб-сайт PHPExcel для изучения?   -  person Mark Baker    schedule 29.05.2013
comment
@Mark Baker: нет, на сервере файл сгенерирован правильно, и когда я его загружаю, он успешно открывается в Excel без каких-либо проблем.   -  person sqlchild    schedule 29.05.2013
comment
Это почти наверняка означает, что ваш сценарий выводит что-то в поток вывода php://, будь то начальный или конечный пробел или пустая строка, или пробел между ?> и <?php где-то в вашем коде, или маркер спецификации; поэтому откройте поврежденный файл в текстовом редакторе, чтобы проверить, как предложил Гордон.   -  person Mark Baker    schedule 29.05.2013
comment
хорошо, сэр, я перепроверяю это   -  person sqlchild    schedule 29.05.2013
comment
сэр, я загружаю файл Excel на веб-сайт PHPExcel, пожалуйста, проверьте. было бы большим подспорьем. там всего два столбца и две строки, и я удалил все пробелы.   -  person sqlchild    schedule 29.05.2013
comment
@Марк Бейкер: куда мне загрузить файл ????? не удалось найти ссылку на веб-сайте PHPExcel ???   -  person sqlchild    schedule 29.05.2013
comment
phpexcel.codeplex.com/workitem/10749   -  person Mark Baker    schedule 29.05.2013
comment
@Mark Baker: Пожалуйста, найдите ссылку, сэр, phpexcel.codeplex.com/workitem/19782   -  person sqlchild    schedule 29.05.2013
comment
@Mark Baker: сэр, у вас есть ошибки в файле????   -  person sqlchild    schedule 30.05.2013
comment
давайте продолжим это обсуждение в чате   -  person sqlchild    schedule 30.05.2013


Ответы (7)


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

person Mark Baker    schedule 30.05.2013
comment
Я мог удалить столько пробелов, сколько мог, но все равно это не сработало, я не смог найти один пробел перед выводом, поэтому я нашел ob_end_clean() в сообщении на stackoverflow и использовал его, и это сработало. - person sqlchild; 04.06.2013
comment
ob_end_clean() всегда будет обходным путем.... где-то будет пробел, или заголовок спецификации, или некоторый выходной текст, который вызывает эту проблему.... правильное решение всегда состоит в том, чтобы определить этот выход и устранить его - person Mark Baker; 17.08.2015
comment
У меня была та же проблема, решенная с помощью ob_end_clean(); - person MrGreen; 18.04.2019

Добавьте строку 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;
person Govind    schedule 16.07.2015
comment
отличный. Работал и для меня. - person Shwet; 05.04.2017

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

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

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

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

person Ian Atkin    schedule 29.05.2013
comment
Я разместил свой файл excel, пожалуйста, посмотрите на него, я все еще не могу решить проблему :( - person sqlchild; 30.05.2013
comment
Мне очень помогла идея открытия с помощью редактора текстовых файлов. Я обнаружил дополнительные вкладки в начале поврежденного файла Excel. - person Keith John Hutchison; 08.03.2016

ИС 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');
person Rogerio de Moraes    schedule 10.12.2014
comment
ПРОЧИТАЙТЕ @sqlchild ФОРМАТ application/vnd.ms-excel - person Rogerio de Moraes; 10.12.2014

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

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

Более подробную информацию и примеры работы с Excel 2007 можно найти на странице примеры PHPExcel.

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

person liyakat    schedule 29.05.2013

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

"?>" 

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

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

person vivek    schedule 06.07.2016

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

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

person Suraj Kumar Maurya    schedule 30.11.2018