次のコードから拡張子.xlsxのExcelファイルを生成しようとしています。ファイルを非常にうまくダウンロードできますが、Excelシートで開くと、次の警告エラーが表示されます。ファイルが破損していないこと、およびファイル拡張子がファイルの形式と一致していることを確認してください。メモ帳で開いたとき、ファイルには次のエラーがありました。
注意: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);
}
このエラーは、削除するバッファがなかったことを示しています。それを回避するには、次を使用します。
_if (ob_get_contents()) ob_end_clean();
_
(アクティブな出力バッファがあるかどうかを確認します)または:
_if (ob_get_length()) ob_end_clean();
_
(バッファに空でない文字列があるかどうかを確認します)@Venuによって提案されます。
また、ob_end_clean();
を2回呼び出しています。そして、それはスタッカブルバッファでのみ機能します。 PHPマニュアルから:
この関数は、最上位の出力バッファの内容を破棄し、この出力バッファリングをオフにします。
ob_clean() だけを使用したくないのですか?
このコードを追加します。 minifyhtmlがアクティブなときにライブサイトで発生します。 advaggおよびhttprlリクエストに接続できます。
修正案は、ob_clean()
をob_get_length()
条件でラップすることです。
if(ob_get_length() > 0) {
ob_clean();
}
変化する
ob_end_clean();
これとともに
if (ob_get_contents()) ob_end_clean();
コードにはob_startがありません。もちろん、削除するバッファーはありません。
チェックアウトしてください http://php.net/manual/en/function.ob-start.php