41

以下のコードから、拡張子が .xlsx の Excel ファイルを生成しようとしています。ファイルをうまくダウンロードできましたが、Excel シートで開くと、次の警告エラーが表示されます..ファイル形式またはファイル拡張子が有効でないため、Excel はファイル 'dindi.xlsx' を開くことができません。ファイルが破損していないこと、およびファイル拡張子がファイルの形式と一致していることを確認してください。メモ帳で開くと、ファイルに次のエラーがありました。

Notice: ob_end_clean() [ref.outcontrol]: バッファの削除に失敗しました。削除するバッファがありません

以下は、私がやろうとしていることのコードです。

public function exportResults() {

        $this -> load -> database();
        $query = $this -> db -> query("
        SELECT * FROM farm LIMIT 10");
        $results = $query -> result_array();
        $objPHPExcel = new Excel();





        $objReader = PHPExcel_IOFactory::createReader('Excel2007');
        $objPHPExcel = $objReader->load('./files/farmdetails.xlsx');


        $objPHPExcel ->getActiveSheet()->setTitle('farmreport');

        $objPHPExcel -> setActiveSheetIndex(0);
        $i = 1;
        foreach ($results as $result) {

            $objPHPExcel -> getActiveSheet() -> SetCellValue('A' . $i, $result["name"]);
            $objPHPExcel -> getActiveSheet() -> SetCellValue('B' . $i, $result["dateofcontract"]);
            $objPHPExcel -> getActiveSheet() -> SetCellValue('C' . $i, $result["leasorname"]);
            $objPHPExcel -> getActiveSheet() -> SetCellValue('D' . $i, $result["acre"]);
            $objPHPExcel -> getActiveSheet() -> SetCellValue('E' . $i, $result["zone"]);

            $i++;
            echo $result["name"];
            }



        ob_end_clean();
        $filename = "dindi.xlsx";
        header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
        header("Cache-Control: no-store, no-cache, must-revalidate");
        header("Cache-Control: post-check=0, pre-check=0", false);
        header("Pragma: no-cache");
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename=' . $filename);

        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');

        ob_end_clean();

        $objWriter -> save('php://output');

        $objPHPExcel -> disconnectWorksheets();
        unset($objPHPExcel);



    }
4

5 に答える 5

82

このエラーは、削除するバッファがなかったことを示しているだけです。それを避けるには、次を使用します。

if (ob_get_contents()) ob_end_clean();

(アクティブな出力バッファがあるかどうかを確認します) または:

if (ob_get_length()) ob_end_clean();

(バッファに空でない文字列があるかどうかを確認します) @Venu で提案されています。

ob_end_clean();また、あなたはそこに2回電話しています。そして、それはスタック可能なバッファでのみ機能します。PHPマニュアルから:

この関数は、一番上の出力バッファの内容を破棄し、 この出力バッファリングをオフにします。

ob_clean()だけを使用したくないのですか?

于 2013-01-27T16:00:24.543 に答える
3

PHP ドキュメントのコメント セクションから、scoalaweb dot com のコーネルの功績によるものです。

インクルードされたファイルによって「誤って」生成された空白やその他の不要なコンテンツを使用しob_clean()たり、消去したりしないでください。ob_end_clean()

インクルードされたファイルは、そもそも不要なコンテンツを生成するべきではありません。

?>その場合、" " の後に空白を挿入したり (PHP ファイルの末尾に " " があってはなりません)、または PHP の基本的な構文規則に?>従わないその他のエラーなど、何か問題があります。

于 2013-12-31T14:09:00.780 に答える
2

変化する

ob_end_clean();

これとともに

if (ob_get_contents()) ob_end_clean();
于 2019-08-30T11:05:13.750 に答える