オリジナル作品、転載可 転載の際は必ず記事出典と著者情報とこの記述をハイパーリンクで明記して下さい。それ以外の場合は責任を負います。 http://ustb80.blog.51cto.com/6139482/1066505
私の仕事では、xlsx ファイルの一部をデータベースにインポートするという問題によく遭遇します。通常、読み込みには PHPExcel を使用します。
次のメソッドを使用すると、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);
しかし、これらが究極の解決策ではないと言うのは非常に責任があります。
一度メモリを 2G に設定し、タイムアウトを 90 秒に設定してみましたが、それでも 4,000 行のカラフルなテーブルを読み取ることができませんでした。その理由は、すべての処理結果を配列に保存する 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 を使用できます。 place は SQL ステートメントを結合してファイルに書き込み、mysql を使用してそれをインポートするように変更されています。もちろん、これはオプションです。データベースに直接接続してレコードをテーブルに挿入することもできます。
この方法を使用すると、数万行のレコードをテーブルに簡単にインポートできます。皆さんのお役に立てれば幸いです。
この記事は「Fanxing's Technology Blog」ブログからのものです。このソースは必ず保管しておいてください http://ustb80.blog.51cto.com/6139482/1066505
上記では、PHPExcel を使用して非常に大きな Excel ファイルを読み取る方法を、関連する内容も含めて紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。