Не удалось удалить буфер. Нет буфера для удаления
Я пытаюсь создать файл excel с расширением .xlsx из приведенного ниже кода. Я могу загрузить файл очень хорошо, но когда я его открываю с помощью листа 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);
}
Ответы
Ответ 1
Эта ошибка просто говорит вам, что буфер не удалялся.
Чтобы избежать этого, просто используйте:
if (ob_get_contents()) ob_end_clean();
(проверьте, есть ли активный выходной буфер)
или:
if (ob_get_length()) ob_end_clean();
(проверяет, есть ли в буфере непустая строка)
как предложил @Venu.
также вы вызываете ob_end_clean();
два раза там. И это работает только со стеклизуемыми буферами. Из руководства PHP:
Эта функция отбрасывает содержимое самого верхнего выходного буфера и отключает эту буферизацию вывода.
Вы уверены, что не хотите использовать ob_clean()?
Ответ 2
Добавьте этот кусок кода. Происходит на живом сайте, когда minifyhtml активен. Может быть подключен к запросам advagg и httprl.
Предлагаемое исправление заключается в ob_clean()
с ob_get_length()
.
if(ob_get_length() > 0) {
ob_clean();
}
Ответ 3
Из Раздел комментариев к документации по PHP, кредит на cornel at scoalaweb dot com:
Не используйте ob_clean()
или ob_end_clean()
для очистки белого пробела или другого нежелательного содержимого, "случайно" генерируемого включенными файлами.
Вложенные файлы не должны генерировать нежелательный контент в первую очередь.
Если это так, вы делаете что-то не так, как вставка пробела после "?>
" (не должно быть "?>
" в конце файлов PHP) или других ошибок, которые не следуют основные правила синтаксиса PHP.
Ответ 4
Ваш код не имеет ob_start, конечно, нет буфера для удаления.
Пожалуйста, проверьте http://php.net/manual/en/function.ob-start.php
Ответ 5
Буферизация вывода позволяет вам сохранять выходные данные PHP (в основном генерируемые echo) в памяти (т.е. В буфере) вместо немедленной передачи в браузер или терминал. Что полезно для решения различных задач: попробуйте https://urlzs.com/VC1ji.
Ответ 6
Изменение
ob_end_clean();
с этим
if (ob_get_contents()) ob_end_clean();