PHPでExcelならこれ!PhpSpreadsheetを使ってみる〜読み込み編〜

こんにちは、コバヤシです。

今回はとある案件でPHPでExcelファイルを扱う必要が出てきてたので「PhpSpreadsheet」を調査してまとめてみました。

PhpSpreadsheetとは

PHPでExcelを操作するライブラリです。Excelファイルの読み込み・作成が出来ます。
以前はPHPでExcelを扱うとしたら「PHPExcel」でしたが、すでに開発も終了し後継として「PhpSpreadsheet」が登場しました。

phpspreadsheet.readthedocs.io

まずはインストール

Composerからインストールします

composer require phpoffice/phpspreadsheet

動作環境はPHP7.2以降となります。

Excelファイルを読み込んでみる

インストールが終わったら、まずは読み込んでみます。

<?php
include('./vendor/autoload.php');
  
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
  
$reader = new XlsxReader();
$spreadsheet = $reader->load('test.xlsx'); // ファイル名を指定
$sheet = $spreadsheet->getSheetByName('test'); // 読み込むシートを指定
  
$data = $sheet->rangeToArray('A1:E1'); // 配列で取得したい範囲を指定

var_dump($data);

単純に指定した範囲を配列として取得するだけなら、これだけで完了です。
とても簡単です!

シートの内容をすべて取得する

取得したい範囲が決まっていない場合は少しコードを書く必要があります。 例えば行数が決まっていないとかです。

<?php
include('./vendor/autoload.php');
  
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
  
$reader = new XlsxReader();
$spreadsheet = $reader->load('test.xlsx'); // ファイル名を指定
$sheet = $spreadsheet->getSheetByName('test'); // 読み込むシートを指定
  
foreach ($sheet->getRowIterator() as $row) {
    foreach($sheet->getColumnIterator() as $column)
    {
        echo $sheet->getCell($column->getColumnIndex() . $row->getRowIndex())->getValue().PHP_EOL;
    }
}

getRowIterator()で使用している行のオブジェクト、getColumnIterator()で使用している列のオブジェクトが返ってきます。この2つを使ってぐるぐる回し値を取得します。
getColumnIndex()で「A」「B」などの列番号、getRowIndex()で「1」「2」などの行番号が取得できるので、2つを連結してgetCell()に渡してあげることでセルの情報が取得できます。

セルの値を取得する

値は以下の方法で取得できます。

<?php

$sheet->getCell('A1')->getValue(); // 通常はこちら
$sheet->getCell('A1')->getCalculatedValue(); // 計算式が入っている場合
$sheet->getCell('A1')->getFormattedValue(); // セルに設定された表示形式で取得したい場合

セルのスタイルを取得する

セルの背景色を取得する場合は以下のようにします。

<?php

$sheet->getCell('A1')->getStyle()->getFill()->getStartColor()->getRGB();

取り消し線が設定されているか判断するには以下のようにするとbooleanが返ってきます。

<?php

$sheet->getCell('A1')->getStyle()->getFont()->getStrikethrough();

セルのマージ情報を取得する

マージしているセルの範囲を取得。

<?php

$sheet->getCell('A1')->getMergeRange();

マージしているセルかどうか。

<?php

$sheet->getCell('A1')->isInMergeRange();

マージしているセルの実際に値が入っているセルかどうか。 A1とA2がマージされている場合、A1はtrueA2はfalseとなります。(A1に入っている値が表示されている)

<?php

$sheet->getCell('A1')->isMergeRangeValueCell();

まとめ

まだまだ色々なメソッドが用意されています。
少し調べた限りですが、これなら必要な情報をExcelファイルから取得できそうですね。
APIは公式サイトに詳しく載っています。より詳しく知りたい方は以下サイトで調べてみてください。

phpoffice.github.io

次回はExcelファイルの作成について書きたいと思います。