Перейти к содержимому

  • Форум доступен только для чтения


Проблема с header. Ошибка при открытии Excel созданного с помощью PHPExcel


Сообщений в теме: 12

#1 headerhelp2015

    Пользователь

  • Пользователи
  • PipPip
  • 27 сообщений
Репутация: 0

Отправлено 06 Апрель 2013 - 07:45

Здравствуйте.
У меня проблема. Если вставить в конце страницы заголовки
header(«Content-Type:application/vnd.ms-excel»);
header(«Content-Disposition:attachment;filename=’simple.xls’»);

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

а сама страница открывается в Excel с кучей тегов и notice вместо формы прайса .
Подскажите как убрать эту ошибку, а то получается как будто я сохраняю не файл.xls , а саму страницу php (
Вот код:
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="stat.xls"');
header('Cache-Control: max-age=0');
$objWriter->save('php://output');
//$objWriter->save(str_replace('.php', '.xls','stat.xls'));

Помогите пожалуйста решить данную проблему.

#2 Meits

    Продвинутый пользователь

  • Администраторы
  • 3 119 сообщений
Репутация: 285

Отправлено 06 Апрель 2013 - 19:17

Здравствуйте!
Попробуйте, закоментировать отправку заголовков - то есть все вызовы функйии header, а также строку $objWriter->save('php://output');. То есть у Вас должно получиться так:
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
//header('Content-Type: application/vnd.ms-excel');
//header('Content-Disposition: attachment;filename="stat.xls"');
//header('Cache-Control: max-age=0');
//$objWriter->save('php://output');
//$objWriter->save(str_replace('.php', '.xls','stat.xls'));
И (после обновления страницы) посмотрите нет ли каких либо ошибок на экране.

Если ошибок нет то верните все изменения назад и попробуйте заменить строку:
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
на
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');


#3 headerhelp2015

    Пользователь

  • Пользователи
  • PipPip
  • 27 сообщений
Репутация: 0

Отправлено 07 Апрель 2013 - 07:29

 Meits (06 Апрель 2013 - 19:17) писал:

Здравствуйте! Попробуйте, закоментировать отправку заголовков - то есть все вызовы функйии header, а также строку $objWriter->save('php://output');. То есть у Вас должно получиться так:
 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); //header('Content-Type: application/vnd.ms-excel'); //header('Content-Disposition: attachment;filename="stat.xls"'); //header('Cache-Control: max-age=0'); //$objWriter->save('php://output'); //$objWriter->save(str_replace('.php', '.xls','stat.xls')); 
И (после обновления страницы) посмотрите нет ли каких либо ошибок на экране. Если ошибок нет то верните все изменения назад и попробуйте заменить строку:
 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); 
на
 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 
Попробовал. В уроке по созданию прайса листа добавил строку date_default_timezone_set('Европа/Город'); и только после этого сохранилось без ошибок.
А вот моя собственная статистика выдает ошибки на отсутствующие файлы CSS и почему то после того, как я убрал ошибки со страницы, то сохранились все input html как на самой странице, хотя я записывал из input число в Excel.
Если убрать Header и вставить SAVE, то сохраняется на сервер без ошибок и формируется нормальная статистика в Excel'e, правда приходится формировать ссылку для скачивания, что не очень удобно для пользователя.

Большое вам спасибо за ответ. Теперь у меня появилась надежда, что я все таки смогу реализовать сохранение в Excel в своем проекте с возможностью выбора "куда сохранять" пользователю :)/>

#4 Meits

    Продвинутый пользователь

  • Администраторы
  • 3 119 сообщений
Репутация: 285

Отправлено 07 Апрель 2013 - 07:39

 headerhelp2015 (07 Апрель 2013 - 07:29) писал:

Большое вам спасибо за ответ. Теперь у меня появилась надежда, что я все таки смогу реализовать сохранение в Excel в своем проекте с возможностью выбора "куда сохранять" пользователю :)/>
Пожалуйста!

#5 eche

    Новичок

  • Пользователи
  • Pip
  • 2 сообщений
Репутация: 0

Отправлено 09 Июнь 2013 - 13:35

Добрый день! у меня возникла аналогичная проблема. Использую phpexcel. Создаю файл эксель если делать формат xls, то перед открытием файла эксель выдает сообщение что расширение файла не соответствует его типу, нажимаю ок, но внутри файла вижу кракозябры(Кирилица не используется , скрипт в utf-8, бд utf-8). Пробую выгрузить в формате xlsx файл не открывается ошибка такая же как и в данной теме : Не удается открыть файл т.к. формат или расширение являются недопустимыми.Пробовал закоментировать header , ошибок не выдает, качал свежий phpexcel, эффекта нет. Упростил код до минимуима, а затем и вовсе заменил свой код, на код из примера phpexcel
error_reporting(E_ALL);
date_default_timezone_set('Europe/London');
	    $phpExcelPath = Yii::getPathOfAlias('application.extensions.PhpExcel.Classes');
	    include($phpExcelPath . DIRECTORY_SEPARATOR . 'PHPExcel.php');

// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
// Set properties
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw")
    ->setLastModifiedBy("Maarten Balliauw")
    ->setTitle("Office 2007 XLSX Test Document")
    ->setSubject("Office 2007 XLSX Test Document")
    ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
    ->setKeywords("office 2007 openxml php")
    ->setCategory("Test result file");

// Add some data
$objPHPExcel->setActiveSheetIndex(0)
    ->setCellValue('A1', 'Hello')
    ->setCellValue('B2', 'world!')
    ->setCellValue('C1', 'Hello')
    ->setCellValue('D2', 'world!');
// Miscellaneous glyphs, UTF-8
$objPHPExcel->setActiveSheetIndex(0)
    ->setCellValue('A4', 'Miscellaneous glyphs')
    ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç');
// Rename sheet
$objPHPExcel->getActiveSheet()->setTitle('Simple');

// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);

// Redirect output to a client’s web browser (Excel2007)
	    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
	    header('Content-Disposition: attachment;filename="01simple.xlsx"');
	    header('Cache-Control: max-age=0');
	   // var_dump(headers_list());
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');
exit;

Но эффекта нет. Примечательно,что эта ошибка появилась после переезда с локалхост на сервер. Может быть дело в настройках php/nginx? Подскажите, пожалуйста, куда копать. php 5.3.10, nginx 1.1.19 права на директорию с phpexcel 777.

#6 eche

    Новичок

  • Пользователи
  • Pip
  • 2 сообщений
Репутация: 0

Отправлено 09 Июнь 2013 - 14:46

Вопрос снимается.мне помог
ob_end_clean()


#7 Билли

    Продвинутый пользователь

  • Клиенты WebForMySelf
  • PipPipPip
  • 123 сообщений
  • ГородМосква
Репутация: 3

Отправлено 26 Июнь 2014 - 12:27

Здравствуйте!
Проблема такая же как и у предыдущих ораторов.Выводится сообщение о несоответствии расширения файла,при открытии внутри кракозябры и ни намёка на какие либо структурированные данные из БД.Но проблема такая только на сервере где находится мой сайт. На Денвере всё работает отлично, даже получилось создать прайс лист из нескольких листов. В конце концов я даже закинул на свой сайт файлы с вашего урока, только поменяв настройки в соответствующих файлах, результат такой же (т.е. никакой).Способы решения приведённые выше мне не помогли,правда про < ob_end_clean() > я не совсем понял. Не могли бы вы помочь разобраться в чём тут может быть дело? Посмотреть прайс (точнее то, что вместо него выводится) можно по адресу linefrost.ru/price
Прикрепляю архив с файлами,но как я уже писал правок там минимум,взял файлы из Вашего урока. Если необходимо, готов скинуть в личку доступ к файлам сайта по FTP и вообще к настройкам сервера, правда очень нужен прайс лист.
P.S.Папку Classes из архива я удалил, ограничение на отправку не пропускает.

Прикрепленные файлы

  • Прикрепленный файл  price.zip   2,29К   3 Количество загрузок:


#8 Meits

    Продвинутый пользователь

  • Администраторы
  • 3 119 сообщений
Репутация: 285

Отправлено 26 Июнь 2014 - 18:32

Здравствуйте!
Странно что на сервер не работает, если работает на денвере. Возможно проблема в настройках сервера.
Давайте так: на сервере в начале попробуйте вместо готового прайслиста - просто создать документ Excell и вывести в нем хотя бы одну строку - неважно какую. То есть Вы проверите генерацию документа Excell. Далее попробуйте отобразить данные из базы данных - не все, а только одну строку из произвольной таблицы (и желательно как на русском так и на английском языке) - опять же протестируем соединение с БД.

#9 Билли

    Продвинутый пользователь

  • Клиенты WebForMySelf
  • PipPipPip
  • 123 сообщений
  • ГородМосква
Репутация: 3

Отправлено 26 Июнь 2014 - 19:34

 Meits (26 Июнь 2014 - 18:32) писал:

Давайте так: на сервере в начале попробуйте вместо готового прайслиста - просто создать документ Excell и вывести в нем хотя бы одну строку - неважно какую. То есть Вы проверите генерацию документа Excell.
Попробовал начать с начала и создать чистый документ Excel без вывода в него данных из БД, в ответ кракозябры и т.п. Все файлы в кодировке UTF-8. Массив данных из БД выводится нормально, без кракозябров, проверял функцией print_r. Я так понимаю не генерируется Excel документ?

#10 Билли

    Продвинутый пользователь

  • Клиенты WebForMySelf
  • PipPipPip
  • 123 сообщений
  • ГородМосква
Репутация: 3

Отправлено 27 Июнь 2014 - 02:13

 Билли (26 Июнь 2014 - 19:34) писал:

Попробовал начать с начала и создать чистый документ Excel без вывода в него данных из БД, в ответ кракозябры и т.п. Все файлы в кодировке UTF-8. Массив данных из БД выводится нормально, без кракозябров, проверял функцией print_r. Я так понимаю не генерируется Excel документ?
В добавок а к предыдущему..Не совсем правильно описал вывод пустого листа.Лист выводится,вот только с нечитаемыми символами. Я тут вот,что сделал..Скачал версию phpexcel 1.8.0 и настроил на Excel 2007. Всё то же самое, что я и раньше описывал, но с помощью хитрых манипуляций мне удалось прочитать, что же выводится кракозябрами на пустом листе.Вот эта ошибка:
Fatal error: Uncaught exception 'PHPExcel_Writer_Exception' with message 'Could not close zip file php://output.' in /var/vvvvvv/r0059628/data/wvvw/linefrost.ru/price/Classes/PHPExcel/Writer/Excel2007.php:399
Stack trace:
#0 /var/wwvv/r0059628/data/vwwv/linefrost.ru/price/index.php(32): PHPExcel_Writer_Excel2007->save('php://output')
#1 {main}
thrown in /var/www/r0059628/data/www/linefrost.ru/price/Classes/PHPExcel/Writer/Excel2007.php on line 399
По моему такая же ошибка выводилась когда я пытался сгенерировать документ в Excel 2003 в версии библиотеки из вашего урока.

#11 Meits

    Продвинутый пользователь

  • Администраторы
  • 3 119 сообщений
Репутация: 285

Отправлено 27 Июнь 2014 - 08:03

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

#12 Билли

    Продвинутый пользователь

  • Клиенты WebForMySelf
  • PipPipPip
  • 123 сообщений
  • ГородМосква
Репутация: 3

Отправлено 27 Июнь 2014 - 11:57

Ребята, я проблему решил, но каким то чудным способом.Я в корневую папку с файлами сайта добавил ещё один пустой каталог www и в него уже залил файлы генератора прайса. Путь к прайсу получился вот такой: www.linefrost.ru/www/price. На Денвере путь был как обычно:localhost/linefrost.ru/price/ и всё замечательно работало.Теперь всё работает и на удалённом сервере, даже как я и писал, выводятся несколько сгенерированных листов книги Excel. Не могу сказать, что я руководствовался какими то научными знаниями, как то по наитию вышло такое решение :). Интересно, почему так? В любом случае, спасибо Вам за урок и поддержку на форуме, пришлось поломать голову, а это всегда полезно!

#13 Meits

    Продвинутый пользователь

  • Администраторы
  • 3 119 сообщений
Репутация: 285

Отправлено 27 Июнь 2014 - 19:12

Очень интересно, даже затрудняюсь ответить почему так. Первый раз встречаюсь с подобным решение проблемы. В любом случае - сами решили проблему - главное результат.





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных

Все права защищены © 2022