ホームページ > バックエンド開発 > PHPチュートリアル > PHPExcelで非常に大きなExcelファイルを読み取る方法

PHPExcelで非常に大きなExcelファイルを読み取る方法

WBOY
リリース: 2016-07-30 13:31:57
オリジナル
1194 人が閲覧しました

オリジナル作品、転載可 転載の際は必ず記事出典と著者情報とこの記述をハイパーリンクで明記して下さい。それ以外の場合は責任を負います。 http://ustb80.blog.51cto.com/6139482/1066505

私の仕事では、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); 

しかし、これらが究極の解決策ではないと言うのは非常に責任があります。

一度メモリを 2G に設定し、タイムアウトを 90 秒に設定してみましたが、それでも 4,000 行のカラフルなテーブルを読み取ることができませんでした。その理由は、すべての処理結果を配列に保存する 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. $cell_values[] = $currentSheet->getCell($address)->getFormattedValue(); 
  26.         } 
  27.  
  28.         // 看看数据 
  29.         print_r($cell_values); 
  30.     } 

上記のメソッドはより複雑な状況と考えられます。すべてのセルを読み出したいだけの場合は、次のメソッドを使用してください:

  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. {
  10. $currentSheet = $objPHPExcel->getSheet($s);// 当前页 
  11.     $row_num = $currentSheet->getHighestRow();// 当前页行数 
  12.     $col_max = $currentSheet->getHighestColumn(); // 当前页最大列号 
  13.  
  14.     // 循环从第二行开始,第一行往往是表头 
  15.     for($i = 2; $i <= $row_num; $i++)
  16. {
  17. $cell_values = array();
  18. for($j = 'A'; $j < $col_max; $j++)
  19. {
  20. $address = $j . $i; // 单元格坐标
  21. $cell_values[] = $currentSheet->getCell($address)->getFormattedValue(); 
  22.         } 
  23.  
  24.         // 看看数据 
  25.         print_r($cell_values); 
  26.     } 

上記の print_r を使用できます。 place は SQL ステートメントを結合してファイルに書き込み、mysql を使用してそれをインポートするように変更されています。もちろん、これはオプションです。データベースに直接接続してレコードをテーブルに挿入することもできます。

この方法を使用すると、数万行のレコードをテーブルに簡単にインポートできます。皆さんのお役に立てれば幸いです。

この記事は「Fanxing's Technology Blog」ブログからのものです。このソースは必ず保管しておいてください http://ustb80.blog.51cto.com/6139482/1066505

上記では、PHPExcel を使用して非常に大きな Excel ファイルを読み取る方法を、関連する内容も含めて紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート