“Excel 发现不可读的内容”警告,打开使用 PHPExcel 制作的 Excel 文件时

2022-08-30 21:39:59

我正在尝试使用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');

它可以工作,但是当我尝试打开Excel文件时,它会在符合的对话框中要求确认。

Excel 在“测试.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");

它仍然要求相同的确认。请问我在这里做错了什么?


答案 1

正如质疑用户Tiny在他自己的评论中所说:

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

为了对这类问题给出一些建设性的补充提示:

  • 一个很好的提示是,您可以省略所有PHP脚本文件上的结束标记,这样您就知道您不会在末尾发送任何附加的不可见空格。?>
  • 此外,在错误配置的Web服务器上的UTF-8上的PHP脚本文件可能会在脚本的开头发送不需要的几个字节。在记事本++上打开PHP文件,检查它是否为UTF-8,在这种情况下,将其转换为ANSI。如果这使其有效,请检查您的Web服务器/ php配置。
  • 在调用之前,您可以检查标头是否被错误地发送:header

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

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

    ob_start();

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

    ob_clean();

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

  • 最后,如前所述,如果之后无需执行任何内容,请在脚本,调用或.exitdie


答案 2

好吧,我遇到了这个问题,我的解决方案是将标题内容类型更改为:

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

我以前有过:

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

我将格式更改为Excel2007,我使用的是Excel5的Excel 2003 xls格式。

我尝试了此页面和所有其他页面的所有解决方案,但问题不然。所以基本上,我只是改变了我的excel的输出格式,这解决了这个问题。


推荐