ブログ
[PHP]大量データがあるExcelの読み込みライブラリの紹介
こんにちは、T.Oと申します。
PHPで大量の行数があるExcelファイルを読み込む際に、使用したライブラリ「OpenSpout」のご紹介をいたします。
検証環境は以下の通りです。
- macOS Monterey 12.6.1
- PHPバージョン 8.1
OpenSpoutとは
XLSX、ODS、CSVの 3 種類のスプレッドシートをサポートしており、すばやく大規模のファイルを読み書きできるライブラリです。
こちらのライブラリはMITライセンスで商用利用も可能です。
https://github.com/openspout/openspout
OpenSpout動作要件
- PHPバージョン 8.0以上
- PHP拡張
PHP_zip
必須 - PHP拡張
PHP_xmlreader
必須
インストール方法
OpenSpoutはcomposerから直接インストールできます。composer.json
に下記を追記してください。
"require": {
...
"openspout/openspout": "^v4.13.1"
},
composer.json
が存在するディレクトリで以下のコマンドを実行します。
$ composer install
OpenSpout使用例
Excelファイルを読み込んで、シートの行を配列で返すサンプルコードになります。
4行目でXLSXReaderのインスタンスを作成し、5行目で読み込むファイルを開き、9行目のforeachで読み込んだExcelファイル全体を読み込んでます。その後、11行目のifで取得対象のシートのみのデータを取得しています。(特定のシートを読み込む必要がない場合は、ここのifは不要です)13行目のネストしてるforeachで、行のセルを一行ずつ取得して取得した行を配列で返してます。全てのforeachが終わった後にファイルを閉じています。
use OpenSpout\Reader\XLSX\Reader as XLSXReader;
...
// インスタンス作成
$reader = new XLSXReader();
// ファイルを開く
$reader->open('ファイル名.xlsx');
// セルデータ配列
$cells_data = [];
// Excelファイル全体の読み込み
foreach ($reader->getSheetIterator() as $sheet) {
// 取得対象のシートかどうか
if ($sheet->getName() === 'シート名') {
// 一行ずつ行の内容を取得
foreach ($sheet->getRowIterator() as $row) {
// 行のセルをまとめて配列で返す
$cells_data[] = $row->toArray();
}
// シートがない場合処理終了
break;
}
}
// ファイルを閉じる
$reader->close();
最後に
OpenSpoutを使用した感想ですが、複雑なコードを書かなくても、シンプルで理解しやすく扱いやすかったです。PHPで大量データがあるExcelファイルなどを使う際に、OpenSpoutを候補にしてみてはいかがでしょうか。
株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!