PHPExcelで超大excelファイルを読み込む方法


xlsxファイルの一部をデータベースにインポートする作業でよく遭遇します.通常はPHPExcelで読み取ります.
次の方法では、excelテーブルをphp配列として簡単に読み取ることができ、その後はやりたい放題にすることができます.

  
  
  
  
  1. $input_file = "data.xlsx"
  2. $objPHPExcel = PHPExcel_IOFactory::load($input_file); 
  3. $sheetData = $objPHPExcel->getSheet(0)->toArray(null, true, true, true); 

文章がこれで終わると、価値はあまりありません.
残念なことにdataがxlsxは万行以上あり、行ごとに多くの列があり、列ごとに長い文字列があり、色などの効果がある場合、上記の方法でよく発生するのがメモリ不足です.
はい、iniもあります.setはメモリを大きくし、set_を使うこともできます.time_Limitは、次のように長いタイムアウトを設定します.

  
  
  
  
  1. set_time_limit(90); 
  2. ini_set("memory_limit", "1024M"); 
  3. $input_file = "data.xlsx"
  4. $objPHPExcel = PHPExcel_IOFactory::load($input_file); 
  5. $sheetData = $objPHPExcel->getSheet(0)->toArray(null, true, true, true); 

しかし、責任を持って言えば、これらは究極の案ではありません.
メモリを2 Gに設定し、タイムアウトを90秒に設定してみたが、4000行の鮮やかなテーブルは読めなかった.理由はすべてtoArrayのこの方法の上で出て、それは処理の結果をすべて配列の中で保存して、この方式は簡単な表を処理する時やはり便利で、しかし大きい表を処理する時、本当にとても杯具です.
デルのソリューションは次のとおりです.

  
  
  
  
  1. require 'lib/PHPExcel.php'; 
  2.  
  3. set_time_limit(90); 
  4. $input_file = "data.xlsx"
  5. $objPHPExcel = PHPExcel_IOFactory::load($input_file); 
  6.  
  7. //   
  8. $sheet_read_arr = array(); 
  9. $sheet_read_arr["sheet1"] = array("A","B","C","D","F"); 
  10. $sheet_read_arr["sheet2"] = array("A","B","C","D","F"); 
  11.  
  12. //   
  13. foreach ($sheet_read_arr as $key => $val) 
  14.     $currentSheet = $objPHPExcel->getSheetByName($key);//   
  15.     $row_num = $currentSheet->getHighestRow();//   
  16.  
  17.     //  ,  
  18.     for ($i = 2; $i <= $row_num; $i++) 
  19.     { 
  20.         $cell_values = array(); 
  21.         foreach ($val as $cell_val) 
  22.         { 
  23.             $address = $cell_val . $i;//   
  24.  
  25.             //   
  26.             $cell_values[] = $currentSheet->getCell($address)->getFormattedValue(); 
  27.         } 
  28.  
  29.         //   
  30.         print_r($cell_values); 
  31.     } 

上の方法は複雑ですが、すべてのセルを全部読みたいだけなら、次の方法でいいです.

  
  
  
  
  1. require 'lib/PHPExcel.php'; 
  2.  
  3. set_time_limit(90); 
  4. $input_file = "data.xlsx"
  5. $objPHPExcel = PHPExcel_IOFactory::load($input_file); 
  6.  
  7. $sheet_count = $objPHPExcel->getSheetCount(); 
  8. for ($s = 0; $s < $sheet_count; $s++) 
  9.     $currentSheet = $objPHPExcel->getSheet($s);//   
  10.     $row_num = $currentSheet->getHighestRow();//   
  11.     $col_max = $currentSheet->getHighestColumn(); //   
  12.  
  13.     //  ,  
  14.     for($i = 2; $i <= $row_num; $i++) 
  15.     { 
  16.         $cell_values = array(); 
  17.         for($j = 'A'; $j < $col_max; $j++) 
  18.         { 
  19.             $address = $j . $i; //   
  20.             $cell_values[] = $currentSheet->getCell($address)->getFormattedValue(); 
  21.         } 
  22.  
  23.         //   
  24.         print_r($cell_values); 
  25.     } 

上のprint_rではsql文をグループ化してファイルに書き込み、mysqlでインポートします.もちろん、データベースに直接接続してテーブルにレコードを挿入することもできます.これは勝手です.
この方法で万行以上の記録を簡単に表にインポートでき、皆さんの役に立つことを願っています.