Подтвердить что ты не робот

Предупреждение "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");

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

4b9b3361

Ответ 1

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

Наконец, это сработало. Я просто добавил выход в конце моего PHP script (at конец первого фрагмента кода в вопросе). Огромное спасибо все вы за полезные советы.

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

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

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

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

    ob_start();

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

    ob_clean();

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

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

Ответ 3

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

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

Я раньше:

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

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

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

Ответ 4

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

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