我正在尝试从下面的代码生成扩展名为.xlsx的excel文件。我能够很好地下载文件但是当我用excel表打开它时,我收到以下警告错误.Excel无法打开文件'dindi.xlsx',因为文件格式或文件扩展名无效。确保文件未损坏且文件扩展名与文件格式匹配。 当我用记事本打开它时,该文件出现以下错误:
注意: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);
}
答案 0 :(得分:64)
该错误只是告诉您没有要删除的缓冲区。 为了避免它,只需使用:
if (ob_get_contents()) ob_end_clean();
(检查是否有活动输出缓冲区) 或者:
if (ob_get_length()) ob_end_clean();
(检查缓冲区中是否有非空字符串) 正如@Venu所建议的那样。
你也在那里打电话ob_end_clean();
两次。这只适用于可堆叠缓冲区。从PHP手册:
此函数丢弃最顶层输出缓冲区的内容 关闭此输出缓冲。
您确定不想只使用ob_clean()吗?
答案 1 :(得分:4)
添加这段代码。 当minifyhtml处于活动状态时,会在实时网站上发生。可以连接到advagg和httprl请求。
建议的解决方法是用ob_clean()
条件包装ob_get_length()
。
if(ob_get_length() > 0) {
ob_clean();
}
答案 2 :(得分:2)
从PHP Documentation comment section,来自scoalaweb dot com的cornel:
请勿使用ob_clean()
或ob_end_clean()
清除空白区域或其他不需要的内容,并且不小心清除#34;由包含的文件生成。
包含的文件不应该首先生成不需要的内容。
如果他们这样做,那么你做错了,比如在" ?>
"之后插入空格。 (PHP文件末尾不应该有#34; ?>
")或其他不遵循basic syntax rules of PHP的错误。
答案 3 :(得分:1)
更改
ob_end_clean();
与此
if (ob_get_contents()) ob_end_clean();
答案 4 :(得分:0)
您的代码没有 ob_start ,当然没有要删除的缓冲区。