2

私は問題に直面しています。

約10MBの.xlsファイルを読み取る必要があります。小さな.xlsファイルを読み取るときに正常に機能するphpコードを記述します。しかし、大きなファイルを読み込もうとすると、ブラウザに「致命的なエラー:許可されたメモリサイズ134217728バイトが使い果たされました(1032バイトを割り当てようとしました)」が1126行目のC:\ wamp \ www \ student \ ExcelRes \ PHPExcel\Cell.phpに表示されます。 「」

これが私のコードです。

<?php 

    ini_set('memory_limit', '128M');

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

    include 'PHPExcel/IOFactory.php';
    $inputFileName = 'ru_unit_H_all.xls'; 
    $objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
    $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);


    echo $sheetData['20007'][ 'K'];          //row colomn

?>
4

4 に答える 4

2

エラーメッセージは自明である必要があります:

「致命的なエラー:1126行目のC:\ wamp \ www \ student \ ExcelRes \ PHPExcel \ Cell.phpで許可されたメモリサイズ134217728バイトが使い果たされました(1032バイトを割り当てようとしました)」

1つのスクリプトの実行用に予約されているメモリが不足しているだけです。

この問題を解決するために、memory_limit使用量を増やすことができます。ini_set()

注:それでもエラーが発生するため、使用128MBするだけでは不十分です。134217728B = ~128MBを使用してみてください512MB

私が知っているPHP用のExcelリーダー/ライターのメモリ効率の良い実装はありません。

于 2012-12-03T12:15:01.077 に答える
0

スクリプトで使用可能なメモリが使い果たされました。デフォルトでは、各スクリプトには8MBのメモリが割り当てられていると思います。10MBのファイルを読み取ろうとしているため、要求を処理するのに十分なメモリがなく、失敗します。

設定を使用して、使用可能なメモリの量を増やしてみることができmemory_limitます。

これは、php.ini設定ファイル内のすべてのスクリプトに対してグローバルに実行することも、スクリプトごとに次を使用して実行することもできます。

ini_set('memory_limit','16M');

16M16メガバイトのメモリはどこにありますか。

于 2012-12-03T12:17:32.167 に答える
0

おそらくメモリを増やすことに加えて、「セルキャッシング」というタイトルの開発者向けドキュメントのセクション(セクション4.2.1)で説明されているように、まさにこの目的のためにPHPExcelによって提供されるセルキャッシングオプションも検討する必要があります。

編集

また、toArray()を使用すると、要求している配列もPHPメモリに構築され、オーバーヘッドが追加されます。ワークシートをメモリに2回ロードするのではなく、一度に1行ずつ反復処理することを検討してください(PHPExcelオブジェクトとして1回)。そして一度あなたの配列として)

于 2012-12-03T12:28:14.830 に答える
0

最後に、example12コードを使用して問題を解決します。

<?php

set_include_path(get_include_path() . PATH_SEPARATOR . 'ExcelRes/');
include 'PHPExcel/IOFactory.php';

$inputFileType = 'Excel5'; 
$inputFileName = 'ru_unit_H_all.xls'; 

class chunkReadFilter implements PHPExcel_Reader_IReadFilter
{
    private $_startRow = 0;
    private $_endRow = 0;

    public function setRows($startRow) 
    {
        $this->_startRow    = $startRow; 
    }

    public function readCell($column, $row, $worksheetName = '')
    { 
        if (($row == 1) || ($row >= $this->_startRow )) 
        {
            return true;
        }
        return false;
    }
}

$objReader = PHPExcel_IOFactory::createReader($inputFileType);

$chunkFilter = new chunkReadFilter();

$objReader->setReadFilter($chunkFilter);

$chunkFilter->setRows(22000); 
$objPHPExcel = $objReader->load($inputFileName);

echo $objPHPExcel->getActiveSheet()->getCell('K22000')->getValue();

}

?> 
于 2012-12-03T15:46:38.487 に答える