BLOG

ブログ

2023/06/26 プログラミング

[PHP]大量データがあるExcelの読み込みライブラリの紹介

この記事を書いた人 T.O

こんにちは、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を候補にしてみてはいかがでしょうか。



株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!

アーカイブ