18

次のように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");

それでも同じ確認を求めます。ここで何が間違っているのですか?

4

7 に答える 7

38

ユーザーのTinyに彼自身のコメントについて質問したことによると:

最後に、それはうまくいきました。PHPスクリプトの最後(質問の最初のコードスニペットの最後)に exit を追加しました。有益なヒントを教えてくださった皆様、本当にありがとうございました。

この種の問題に関する建設的な追加のヒントを提供するには、次のようにします。

  • 良いヒントは、?>すべての PHP スクリプト ファイルで終了タグを省略できることです。そうすれば、ファイルの最後に追加の目に見えない空白を送信していないことがわかります。
  • また、不適切に構成された Web サーバーで PHP スクリプト ファイルを UTF-8 でエンコードすると、スクリプトの先頭で望ましくない数バイトが送信される可能性があります。PHP ファイルを Notepad++ で開き、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

my php : 7.4.1os: Ubuntu 18.04frameword: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;`
于 2021-04-28T03:31:56.907 に答える