PHPExcelが5000行を超えない理由を教えてください。プロジェクトのレポート生成にオープンソースのPHPExcelを使用していますが、Mysql-DBから5000行を超えるデータを書き込むことができませんでした。私の結果セットは、クエリが実行されたときに7230レコードをフェッチします。どうすれば修正できますか。
5 に答える
ほぼ確実に、これはタイムアウトまたはメモリの問題です。ワークシートサイズのPHPExcelの制限は、65,536行と256(IV)列のみです(Excel5 Writerを使用する場合)。または1,048,576行および16,384(XFD)列(Excel2007 Writerを使用する場合)。
エラーログが常に有効になっていることを確認してください...try/ catchブロックを使用して、PHPExcel例外をトラップします。また、メモリとパフォーマンスに関するPHPExcelサイトのディスカッションスレッドをお読みください。
私も同じ問題を抱えていました。十分な時間とメモリ制限を割り当てる必要があります。
3つの異なるサーバーでソリューションをテストしました。結果は次のとおりです。
約5000レコード(12列)
ファイルの読み取り: 09:48:
22ピークメモリ使用量:1.25 MB
データの読み取り:09:48:
31ピークメモリ使用量:54.5 MB
データをアレイにインデックス付けした後: 09:48:
35ピークメモリ使用量:68.5 MB
記録:4504
インデックス作成後に22.000レコードを読み取るためのメモリと時間を増やし、370.00MBに増やしました。
プログラム/関数でPHPExcelを呼び出すソリューションは次のとおりです(コードシーケンスで他のすべてが正しいことを前提としています)。
ini_set("max_execution_time", 'time_limit'); //see manual
ここですべての初期化を実行して、すべてのオブジェクトの準備ができたら、ファイルを読み取り、プログラムの内部構造にデータをインデックス付けするためのメモリを割り当てます。
ini_set('memory_limit', '???'); //your memory limit as string
$excel = $excelReader->load($filePath);
"Memory usage: " . (memory_get_peak_usage(true) / 1024 / 1024) . " MB"
//do the rest of the structure!
400 MBに達しないように、いくつかのカテゴリのデータでこれらすべてを管理することをお勧めします-エラーが発生する可能性があります!
ほぼ確実に、これはタイムアウトまたはメモリの問題です。ワークシートサイズのPHPExcelの制限は、65,536行と256(IV)列のみです(Excel5 Writerを使用する場合)。または1,048,576行および16,384(XFD)列(Excel2007 Writerを使用する場合)。
この行を変更できます
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
なので
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
次に、65536行を超えるレコードを書き込むことができます。
あなたのコードやクラスのコードがなければ、私は信じています... XLSファイルまたはワークシート内に5k行を超える行を書くことができないということですか?そうしないと、最初のシートに5K行を書き込み、2番目のシートに残りを書き込むという醜い回避策が考えられます(DBが大きくなると、各シートに5K行が書き込まれます)。XLSには5k行の制限があるとは思わないので、スクリプトに何か問題があるか、構成が間違っているはずです。何度か試したことはありますか?常に5k行を印刷しますか?または、タイムアウトが原因である可能性がありますか?(スクリプトまたは接続の)
このタイプの問題は、サーバーのメモリの問題である可能性が高いです。どのタイプのサーバーを使用していて、大きなデータファイルを処理するのに十分なメモリとリソースがあると確信していますか?どちらの方法でもわからない場合、最善の回避策は、一度に数千のレコードを読み取り、それらを処理してから、次のチャンクに移動することです。私自身、大きなデータファイルを管理可能な部分(ファイル)に分割し、その後、それらの各部分を処理して、目的の結果を得ることができます。すべてのピースが処理されたら、それらをマージして新しい大きなデータファイルを作成できます。