Предупреждение «Excel нашел нечитаемый контент» при открытии файлов Excel, сделанных с помощью PHPExcel

Я пытаюсь загрузить файлы Excel (xlsx) с помощью PHPExcel следующим образом.

 require_once("../../phpExcel/Classes/PHPExcel.php"); require_once("../../phpExcel/Classes/PHPExcel/IOFactory.php"); $objPHPExcel = new PHPExcel(); $objPHPExcel->getProperties()->setCreator("Tiny") ->setLastModifiedBy("Tiny") ->setTitle("Office 2007 XLSX Test Document") ->setSubject("Office 2007 XLSX Test Document") ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes."); $objPHPExcel->setActiveSheetIndex(0); $sheet=$objPHPExcel->getActiveSheet(); $sheet->setCellValue('A1', 'Hello'); $sheet->setCellValue('B2', 'world!'); $sheet->setCellValue('C1', 'Hello'); $sheet->setCellValue('D2', 'world!'); header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="test.xlsx"'); header('Cache-Control: max-age=0'); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save('php://output'); 

Он работает, но когда я пытаюсь открыть файл Excel, он запрашивает подтверждение в диалоговом окне соответствия.

Excel нашел нечитаемый контент в 'test.xlsx'. Вы хотите восстановить содержание этой книги? Если вы доверяете источнику этой книги, нажмите «Да».

Я также попытался изменить заголовок следующим образом

 header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download");; header("Content-Disposition: attachment;filename=test.xlsx"); header("Content-Transfer-Encoding: binary"); 

Он все еще требует такого же подтверждения. Что я делаю неправильно здесь, пожалуйста?

Как рассказал опрос пользователя Tiny на свой комментарий:

Наконец, это сработало. Я просто добавил выход в конце моего PHP-скрипта (в конце первого фрагмента кода в вопросе). Большое спасибо всем вам за то, что вы дали мне полезные советы.

Чтобы дать некоторые конструктивные дополнительные советы по этим проблемам:

  • Хорошим советом является то, что вы можете опустить закрывающий тег ?> На все ваши файлы скриптов PHP, таким образом, вы знаете, что вы не отправляете какие-либо дополнительные невидимые пробелы в конце его.
  • Также подписание файлов сценариев PHP на UTF-8 на неправильно настроенном веб-сервере может отправить нежелательные пары байтов в начале скрипта. Откройте файл PHP на Notepad ++, проверьте, является ли он UTF-8, и в этом случае преобразуйте его в ANSI. Если это заставило его работать, проверьте конфигурацию webserver / php.
  • Перед вызовом header вы можете проверить, были ли отправлены ошибочно отправленные заголовки:

    if ( headers_sent() ) die("**Error: headers sent");

  • Если вы не можете предотвратить, что какой-либо вызов функции отправляет нежелательные строки в браузер, вы можете «стереть» все это, используя в самом начале вашего скрипта:

    ob_start();

    и затем, перед первым вызовом headers , используйте:

    ob_clean();

    Будьте осторожны, так как это позволит вам получить обратную связь с ошибками.

  • И, наконец, как уже было сказано, если ничто не должно быть выполнено после некоторого момента на скрипте, вызовите exit или die .

Эта ошибка также может быть вызвана службой файла без заголовков Content-Length.

Посмотрите пример, приведенный здесь, на php.net

Ну, у меня была эта проблема, мое решение меняло заголовок Content-type на:

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

У меня было до:

 header('Content-Type: application/vnd.ms-excel'); 

и я изменил формат на Excel2007, я использовал Excel5 для формата excel 2003 xls.

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

Дайте активному листу название:

 $sheet->setTitle('Some title string here');