PHPExcelで超大excelファイルを読み込む方法
8843 ワード
xlsxファイルの一部をデータベースにインポートする作業でよく遭遇します.通常はPHPExcelで読み取ります.
次の方法では、excelテーブルをphp配列として簡単に読み取ることができ、その後はやりたい放題にすることができます.
文章がこれで終わると、価値はあまりありません.
残念なことにdataがxlsxは万行以上あり、行ごとに多くの列があり、列ごとに長い文字列があり、色などの効果がある場合、上記の方法でよく発生するのがメモリ不足です.
はい、iniもあります.setはメモリを大きくし、set_を使うこともできます.time_Limitは、次のように長いタイムアウトを設定します.
しかし、責任を持って言えば、これらは究極の案ではありません.
メモリを2 Gに設定し、タイムアウトを90秒に設定してみたが、4000行の鮮やかなテーブルは読めなかった.理由はすべてtoArrayのこの方法の上で出て、それは処理の結果をすべて配列の中で保存して、この方式は簡単な表を処理する時やはり便利で、しかし大きい表を処理する時、本当にとても杯具です.
デルのソリューションは次のとおりです.
上の方法は複雑ですが、すべてのセルを全部読みたいだけなら、次の方法でいいです.
上のprint_rではsql文をグループ化してファイルに書き込み、mysqlでインポートします.もちろん、データベースに直接接続してテーブルにレコードを挿入することもできます.これは勝手です.
この方法で万行以上の記録を簡単に表にインポートでき、皆さんの役に立つことを願っています.
次の方法では、excelテーブルをphp配列として簡単に読み取ることができ、その後はやりたい放題にすることができます.
- $input_file = "data.xlsx";
- $objPHPExcel = PHPExcel_IOFactory::load($input_file);
- $sheetData = $objPHPExcel->getSheet(0)->toArray(null, true, true, true);
文章がこれで終わると、価値はあまりありません.
残念なことにdataがxlsxは万行以上あり、行ごとに多くの列があり、列ごとに長い文字列があり、色などの効果がある場合、上記の方法でよく発生するのがメモリ不足です.
はい、iniもあります.setはメモリを大きくし、set_を使うこともできます.time_Limitは、次のように長いタイムアウトを設定します.
- set_time_limit(90);
- ini_set("memory_limit", "1024M");
- $input_file = "data.xlsx";
- $objPHPExcel = PHPExcel_IOFactory::load($input_file);
- $sheetData = $objPHPExcel->getSheet(0)->toArray(null, true, true, true);
しかし、責任を持って言えば、これらは究極の案ではありません.
メモリを2 Gに設定し、タイムアウトを90秒に設定してみたが、4000行の鮮やかなテーブルは読めなかった.理由はすべてtoArrayのこの方法の上で出て、それは処理の結果をすべて配列の中で保存して、この方式は簡単な表を処理する時やはり便利で、しかし大きい表を処理する時、本当にとても杯具です.
デルのソリューションは次のとおりです.
- require 'lib/PHPExcel.php';
-
- set_time_limit(90);
- $input_file = "data.xlsx";
- $objPHPExcel = PHPExcel_IOFactory::load($input_file);
-
- //
- $sheet_read_arr = array();
- $sheet_read_arr["sheet1"] = array("A","B","C","D","F");
- $sheet_read_arr["sheet2"] = array("A","B","C","D","F");
-
- //
- foreach ($sheet_read_arr as $key => $val)
- {
- $currentSheet = $objPHPExcel->getSheetByName($key);//
- $row_num = $currentSheet->getHighestRow();//
-
- // ,
- for ($i = 2; $i <= $row_num; $i++)
- {
- $cell_values = array();
- foreach ($val as $cell_val)
- {
- $address = $cell_val . $i;//
-
- //
- $cell_values[] = $currentSheet->getCell($address)->getFormattedValue();
- }
-
- //
- print_r($cell_values);
- }
- }
上の方法は複雑ですが、すべてのセルを全部読みたいだけなら、次の方法でいいです.
- require 'lib/PHPExcel.php';
-
- set_time_limit(90);
- $input_file = "data.xlsx";
- $objPHPExcel = PHPExcel_IOFactory::load($input_file);
-
- $sheet_count = $objPHPExcel->getSheetCount();
- for ($s = 0; $s < $sheet_count; $s++)
- {
- $currentSheet = $objPHPExcel->getSheet($s);//
- $row_num = $currentSheet->getHighestRow();//
- $col_max = $currentSheet->getHighestColumn(); //
-
- // ,
- for($i = 2; $i <= $row_num; $i++)
- {
- $cell_values = array();
- for($j = 'A'; $j < $col_max; $j++)
- {
- $address = $j . $i; //
- $cell_values[] = $currentSheet->getCell($address)->getFormattedValue();
- }
-
- //
- print_r($cell_values);
- }
- }
上のprint_rではsql文をグループ化してファイルに書き込み、mysqlでインポートします.もちろん、データベースに直接接続してテーブルにレコードを挿入することもできます.これは勝手です.
この方法で万行以上の記録を簡単に表にインポートでき、皆さんの役に立つことを願っています.