2

かなり大きな XML ファイルを読み取るために phpExcel を使用しています。例に示されているように、これをチャンクで実行しようとしています。しかし、何を試しても、「$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