打开使用PHPExcel创建的Excel文件时,"Excel发现不可读的内容"警告

Tin*_*iny 18 php excel-2007 phpexcel

我正在尝试使用PHPExcel以下方法下载Excel文件(xlsx).

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');
Run Code Online (Sandbox Code Playgroud)

它可以工作但是当我尝试打开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");
Run Code Online (Sandbox Code Playgroud)

它仍然要求同样的确认.我在这做错了什么,拜托?

vic*_*era 38

正如质疑用户Tiny对自己的评论所说:

最后,它奏效了.我刚刚在PHP脚本的末尾添加了exit(在问题的第一个代码片段的末尾).非常感谢大家给我的有用提示.

为这类问题提供一些建设性的额外提示:

  • 一个很好的提示是,你可以省略?>所有PHP脚本文件的结束标记,这样你就知道你没有在它的末尾发送任何aditional不可见的空格.
  • 在错误配置的Web服务器上插入UTF-8上的PHP脚本文件也可以在脚本开头发送不需要的几个字节.在Notepad ++上打开PHP文件,检查它是否是UTF-8,在这种情况下,将其转换为ANSI.如果这有效,请检查您的webserver/php配置.
  • header通话之前,您可以检查标头是否已错误地发送:

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

  • 如果您无法阻止某些函数调用向浏览器发送不需要的字符串,则可以在脚本的最开头使用"擦除"所有函数:

    ob_start();

    然后,在第一次headers通话之前,使用:

    ob_clean();

    请注意,这样做会阻止您收到错误反馈.

  • 最后,正如已经说过的,如果之后没有必要执行脚本上的某些点,请致电exitdie.


小智 5

好吧,我遇到了这个问题,我的解决方案是将标题 Content-type 更改为:

header('Content-Type: application/openxmlformats-officedocument.spreadsheetml.sheet');
Run Code Online (Sandbox Code Playgroud)

我之前有:

header('Content-Type: application/vnd.ms-excel'); 
Run Code Online (Sandbox Code Playgroud)

我将格式更改为 Excel2007,我使用 Excel5 作为 excel 2003 xls 格式。

我尝试了此页面和所有其他页面上的所有解决方案,但都遇到了同样的问题,但运气不佳。所以基本上,我只是改变了我的 excel 的输出格式并解决了问题。