18

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

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

4

7 回答 7

38

正如在用户 Tiny 自己的评论中提问时所说:

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

就此类问题提供一些建设性的附加提示:

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

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

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

    ob_start();

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

    ob_clean();

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

  • 最后,如前所述,如果在脚本上的某个点之后不需要执行任何操作,请调用exitor die

于 2012-05-30T13:40:20.143 回答
5

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

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

我以前有:

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

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

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

于 2016-02-11T16:58:11.260 回答
4

此错误也可以通过提供没有 Content-Length 标头的文件来触发。

查看 php.net 中给出的示例

于 2015-05-15T17:35:59.513 回答
2

给活动工作表一个标题:

$sheet->setTitle('Some title string here');
于 2015-11-30T13:18:31.487 回答
0

我把只是退出;后

PHPExcel_IOFactory::createWriter($phpExcelObject, 'Excel2007')->save("php://output");

它对我有用:)

   $file_name .= "_".\Carbon\Carbon::now()->format('d_m_Y_H_i').'.xlsx';

    // Prepare To Download
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment;filename='.$file_name);
    header('Cache-Control: max-age=0');
    header('Pragma: public');
    PHPExcel_IOFactory::createWriter($phpExcelObject, 'Excel2007')->save("php://output");
    exit;
于 2018-09-27T08:53:15.313 回答
0

这可能对尝试使用laravel中的https://github.com/Maatwebsite/Laravel-Excelget包和 ajax 路由下载 excel 的人有所帮助

我得到了类似PK ¾@G’D²X ð [Content_Types].xml­”MNÃ0…÷œ"ò%nY „švAa •(0ö¤±êØ–gúw{&i‰@ÕnbEö{ßøyìÑdÛ¸l mð¥‘×ÁX¿(ÅÛü)¿’òF¹à¡;@1_滘±Øc)j¢x/%ê…Eˆày¦ ©QÄ¿i!£ÒKµ y3ÜJ<§œZ1½0?YÙL%zV cäÖIb7؇û‰ìa/lÙ¥P1:«qáríÍjªÊj0A¯–Íuë""íàÙ(Œ ”Á€WìMä)Tjå和更多内容的回应

我尝试了许多解决方案但失败了

最后我通过在 onclick 事件中这样做来实现

$(document).on('click','#elementId',function(e){
  e.preventDefault();
  window.location.assign('your action url'+'?param='+ param_data);
}
于 2020-04-22T14:45:43.900 回答
0

我的 php : 7.4.1os: Ubuntu 18.04frameword:Yii2.0.37
我也有这个问题,我的解决方案是
我使用exitob_clean()

$objPHPExcel = 新的 \PHPExcel();

    $objPHPExcel->getProperties()->setCreator("Murodjon Abduvohidov")
        ->setLastModifiedBy("Murodjon Abduvohidov");
    $objPHPExcel->getActiveSheet()->getPageSetup()-> setOrientation(\PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE)
        ->setPaperSize(\PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4);
    $objPHPExcel->getActiveSheet()->getSheetView()->setZoomScale(70);
    $objPHPExcel->getActiveSheet()->getSheetView()->setZoomScaleNormal(82);
    $objPHPExcel->getActiveSheet()->getSheetView()->setView(\PHPExcel_Worksheet_SheetView::SHEETVIEW_PAGE_BREAK_PREVIEW);
    $objPHPExcel->getActiveSheet()->getPageSetup()->setScale(63);
    $objPHPExcel->getActiveSheet()->getPageMargins()->setTop(0.4);
    $objPHPExcel->getActiveSheet()->getPageMargins()->setRight(0.4);
    $objPHPExcel->getActiveSheet()->getPageMargins()->setLeft(0.4);
    $objPHPExcel->getActiveSheet()->getPageMargins()->setBottom(0.4);
    $objPHPExcel->getDefaultStyle()->getFont()->setName('Arial');
    $objPHPExcel->getDefaultStyle()->getFont()->setSize(10); $objPHPExcel->getActiveSheet()->getCell('A2')->setValue('salom');
    $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');ob_clean();
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment;filename="abdulqodir.xlsx"');
    header('Cache-Control: max-age=0');
    header('Cache-Control: max-age=1');
    header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
    header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');        header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
    header('Pragma: public'); // HTTP/1.0
    $objWriter->save("php://output");exit;`
于 2021-04-28T03:31:56.907 回答