I'm trying to read a 17MB excel file (2003) with PHPExcel1.7.3c, but it crushes already while loading the file, after exceeding the 120 seconds limit I have. Is there another library that can do it more efficiently? I have no need in styling, I only need it to support UTF8. Thanks for your help
6 に答える
PHPExcel を使用する場合、ファイルサイズは適切な尺度ではありません。各ワークシートのセル数 (行 x 列) を把握することがより重要です。
スタイリングが不要な場合は、次のように呼び出していますか?
$objReader->setReadDataOnly(true);
ファイルをロードする前に?
すべてのワークシートにアクセスする必要がない場合、またはワークシート内の特定のセルのみにアクセスする必要がない場合は、次の使用を検討してください。
$objReader->setLoadSheetsOnly(array(1,2))
また
$objReader->setLoadSheetsOnly(1)
または readFilter を定義する
セルキャッシュを使用していますか? もしそうなら、どのような方法ですか?これにより、ロード時間が遅くなります。
読み取ったExcelファイルから必要なものがデータだけである場合、巨大なExcelファイルを読み取る私の方法は次のとおりです。
サーバーに gnumeric をインストールします。つまり、debian/ubuntu を使用します: apt-get install gnumeric
次に、Excel ファイルを読み取り、それを 2 次元データ配列に格納するための php 呼び出しは非常に単純です (次元は行と列です)。
system("ssconvert \"$excel_file_name\" \"temp.csv\"");
$array = array_map("str_getcsv", file("temp.csv"));
次に、配列でやりたいことを実行できます。10MB の大きな xls ファイルの場合、これは 10 秒もかからず、お気に入りの表計算ソフトウェアでファイルをロードする必要があるのと同じ時間です。
非常に巨大なファイルの場合、fopen() および file_getcsv() 関数を使用し、file() 関数を使用して csv ファイル全体をメモリに格納することを避けるために、巨大な配列にデータを格納せずに必要なことを行う必要があります。これは遅くなりますが、サーバーのメモリをすべて消費することはありません!
17MB はかなりのファイルです。
17MB のファイルにかかる時間を計算できるように、1MB のファイルの解析にかかる時間を計算します。その場合、1 つのオプションとして、120 秒の制限を増やすことが考えられます。
または、より効率的な CSV にエクスポートし、PHP の fgetcsv 経由でインポートすることもできます。
大きなファイルを読むには、 Excel エクスプローラーの方が優れていると聞いたことがあります。
おそらく、csv に変換/エクスポートして、組み込みの fgetcsv() を使用できます。必要な機能の種類によって異なります。