创建phpexcel对象后无法输出缓冲区

时间:2015-10-21 12:07:35

标签: php output buffer phpexcel output-buffering

我需要我的脚本在处理时回应一些东西。但是,在创建phpexcel对象之后我回复的所有东西都会进入缓冲区,并且只有在脚本完成后才会回显。

有解决方法吗?

以下是代码的一部分:

$inputFileName = 'index.xlsx';
echo "bla<br>";
//  Read your Excel workbook
try {
    $inputFileType = PHPExcel_IOFactory::identify($inputFileName);
    $objReader = PHPExcel_IOFactory::createReader($inputFileType);
    echo "Hi<br>";
    //Everything before here does not go to buffer.
    $objPHPExcel = $objReader->load($inputFileName);
    //Everything after here goes to buffer and only echoes after the script has finished running
    echo "Hi<br>";
} catch (Exception $e) {
    die('Error loading file "' . pathinfo($inputFileName, PATHINFO_BASENAME) 
    . '": ' . $e->getMessage());
}
ob_implicit_flush(true);
ob_end_flush();
echo "Hi<br>";

在回声之后已经尝试ob_flush()flush(),但它们都不起作用。

此处也尝试了所有内容:How to flush output after each `echo` call?

我需要它来制作COMET解决方案,如果我不能立即输出回声,就无法实现它。

欢迎任何有关如何使脚本与javascript通信而不在其过程中输出回声的想法!

1 个答案:

答案 0 :(得分:2)

一般来说,PHExcel load()方法不会生成任何输出,因此在执行时不会显示任何内容;并且没有直接的用户钩子可用于在该过程中显示任何内容。

但是,应该可以配置读取过滤器,并使用它来生成输出。

class readOutputFilter implements PHPExcel_Reader_IReadFilter {
    $currentRow = 1;

    public function readCell($column, $row, $worksheetName = '') {
        if ($row != $this->currentRow) {
            $this->currentRow = $row;
            echo 'Row ', $row, PHP_EOL;
        }
        // always return true, because we want to load every cell
        return true;
    }
}

$outputFilter = new readOutputFilter();
$objReader->setReadFilter($outputFilter);
$objPHPExcel = $objReader->load($inputFileName);

这将在每个新行开始阅读时显示一条消息,但基本原则可以应用于其他标准