Я пытаюсь загрузить файлы 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, таким образом, вы знаете, что вы не отправляете какие-либо дополнительные невидимые пробелы в конце его. Перед вызовом 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');