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

时间:2012-05-29 20:58:47

标签: 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');

虽然有效,但是当我尝试打开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");

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

7 个答案:

答案 0 :(得分:37)

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

  

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

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

  • 一个很好的提示是,你可以省略所有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();

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

  • 最后,正如已经说过的,如果之后没有必要执行任何操作,请致电exitdie

答案 1 :(得分:4)

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

Look at the example given here in php.net

答案 2 :(得分:4)

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

header('Content-Type: application/openxmlformats-officedocument.spreadsheetml.sheet');
我之前有过:

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

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

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

答案 3 :(得分:2)

为活动表格提供标题:

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

答案 4 :(得分: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;

答案 5 :(得分:0)

这可能有助于尝试使用laravel中的def create_model(): model = models.Sequential() model.add(Conv2D(6, 3, padding='same', data_format='channels_last', kernel_regularizer=l2(5e-4))) model.add(BatchNormalization()) model.add(LeakyReLU(alpha=0.1)) model.add(MaxPool2D()) model.add(Conv2D(8, 3, padding='same', data_format='channels_last', kernel_regularizer=l2(5e-4))) model.add(BatchNormalization()) model.add(LeakyReLU(alpha=0.1)) model.add(MaxPool2D()) model.add(Conv2D(12, 3, padding='same', data_format='channels_last', kernel_regularizer=l2(5e-4))) model.add(BatchNormalization()) model.add(LeakyReLU(alpha=0.1)) model.add(Conv2D(8, 1, padding='same', data_format='channels_last', kernel_regularizer=l2(5e-4))) model.add(BatchNormalization()) model.add(LeakyReLU(alpha=0.1)) model.add(Conv2D(12, 3, padding='same', data_format='channels_last', kernel_regularizer=l2(5e-4))) model.add(BatchNormalization()) model.add(LeakyReLU(alpha=0.1)) model.add(MaxPool2D()) model.add(Flatten()) model.add(Dense(params.grid_height * params.grid_width * params.pred_vec_len * params.num_anchors, activation='relu')) return model 路径和ajax使用laravel中的https://github.com/Maatwebsite/Laravel-Excel软件包下载excel的人

我得到了类似get之类的回复,并且内容更多

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

最终我通过在onclick事件中完成此操作

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å

答案 6 :(得分:0)

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

$objPHPExcel = new \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;`