Подтвердить что ты не робот

Не удалось удалить буфер. Нет буфера для удаления

Я пытаюсь создать файл 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);



    }
4b9b3361

Ответ 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.

Ответ 5

Буферизация вывода позволяет вам сохранять выходные данные PHP (в основном генерируемые echo) в памяти (т.е. В буфере) вместо немедленной передачи в браузер или терминал. Что полезно для решения различных задач: попробуйте https://urlzs.com/VC1ji.

Ответ 6

Изменение

ob_end_clean();

с этим

if (ob_get_contents()) ob_end_clean();