Генерираният от 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;

person sqlchild    schedule 29.05.2013    source източник
comment
Без да знаете точното съдържание на файла xlsx, е много трудно да определите от коя от няколкото милиона възможности MS Excel се оплаква... какви допълнителни функции (като автофилтри, диаграми и т.н.) използвате? Каква версия на MS Excel? Ако запишете файла на диска на сървъра, вместо да го запазите през браузъра, все още ли имате същия проблем? Все още ли се оплаква, ако използвате Excel5 Writer и запишете като .xls файл? Можете ли да качите копие на файла на уебсайта на PHPExcel за проучване?   -  person Mark Baker    schedule 29.05.2013
comment
@Mark Baker: не на сървъра файлът е правилно генериран и когато го изтегля, той се отваря успешно в excel без никакви проблеми.   -  person sqlchild    schedule 29.05.2013
comment
Това почти сигурно означава, че вашият скрипт отразява нещо в изходния поток php://, независимо дали е начален или завършващ интервал или празен ред, или празнина между ?> и <?php някъде във вашия код, или маркер на BOM; така че отворете повредения файл в текстов редактор, за да проверите, както Гордън предложи.   -  person Mark Baker    schedule 29.05.2013
comment
добре, сър, проверявам го отново   -  person sqlchild    schedule 29.05.2013
comment
господине, качвам файла на excel на уебсайта на PHPExcel, моля, проверете. би било от голяма помощ. има само две колони и два реда и премахнах всички интервали.   -  person sqlchild    schedule 29.05.2013
comment
@Mark Baker : къде да кача файла????? не можах да намеря връзката на уебсайта на 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() винаги ще бъде заобиколно решение.... някъде ще има интервал или заглавка на BOM или някакъв изходен текст, който причинява този проблем... правилното решение винаги е да се идентифицира този резултат и да се елиминира - 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.

Можете да напишете BIFF5 или BIFF8 xls файл (всички версии на Excel post 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