2

我正在使用 phpExcel 来读取一个相当大的 XML 文件。如示例中所示,我正在尝试分块执行此操作。但无论我尝试什么,“$objPHPExcel = $objReader->load($inputFileName)”总是失败并导致错误提示内存已用尽。

我看过http://phpexcel.codeplex.com/discussions/242712?ProjectName=phpexcel如何使用 PHPExcel 从大型 Excel 文件 (27MB+) 中读取大型工作表?但是我尝试的每个代码都以相同的加载方法失败。

这是我目前正在使用的代码的一部分:

set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');

/** PHPExcel_IOFactory */
include 'PHPExcel/IOFactory.php';


$inputFileType = 'Excel5';
//  $inputFileType = 'Excel2007';
//  $inputFileType = 'Excel2003XML';
//  $inputFileType = 'OOCalc';
//  $inputFileType = 'Gnumeric';
$inputFileName = 'testfile.xls';


/**  Define a Read Filter class implementing PHPExcel_Reader_IReadFilter  */
class chunkReadFilter implements PHPExcel_Reader_IReadFilter
{
    private $_startRow = 0;

    private $_endRow = 0;

    /**  We expect a list of the rows that we want to read to be passed into the constructor  */
    public function __construct($startRow, $chunkSize) {
        $this->_startRow    = $startRow;
        $this->_endRow      = $startRow + $chunkSize;
    }

    public function readCell($column, $row, $worksheetName = '') {
        //  Only read the heading row, and the rows that were configured in the constructor
        if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) {
            return true;
        }
        return false;
    }
}


$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objReader->setReadDataOnly(true);
echo '<hr />';


/**  Define how many rows we want for each "chunk"  **/
$chunkSize = 5;


/**  Loop to read our worksheet in "chunk size" blocks  **/
for ($startRow = 2; $startRow <= 240; $startRow += $chunkSize) {
    echo 'Loading WorkSheet using configurable filter for headings row 1 and for rows ',$startRow,' to ',($startRow+$chunkSize-1),'<br />';
    /**  Create a new Instance of our Read Filter, passing in the limits on which rows we want to read  **/
    $chunkFilter = new chunkReadFilter($startRow,$chunkSize);
    /**  Tell the Reader that we want to use the new Read Filter that we've just Instantiated  **/
    $objReader->setReadFilter($chunkFilter);
    /**  Load only the rows that match our filter from $inputFileName to a PHPExcel Object  **/
    echo "before load <br />";
    $objPHPExcel = $objReader->load($inputFileName);
    echo "after load";
    //  Do some processing here

    $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);
    var_dump($sheetData);
    echo '<br /><br />';
}

所以我想知道是否有人知道为什么其他主题中的解决方案都不起作用?

谢谢,

格茨

4

0 回答 0