読者です 読者をやめる 読者になる 読者になる

PHPExcelの後継っぽいPhpSpreadsheetでExcelファイルを読み書きするサンプルコード

PHPExcel

PHPExcelを操作する。というと「やめておけ」という言葉の次に上がってくる有名なライブラリは、PHPExcelではないかと思います。

github.com

溜まりに溜まったIssuesとPull Requestsの数を見ると不安な気持ちになってしまいますが、後継のライブラリーが開発中のようです。

github.com

PHPExcel vs PhpSpreadsheet ? に書いてある通り、PHPExcelと互換性のない変更が含まれるため別プロジェクトになっているようで、開発もPhpSpreadsheetに注力しており、PHPExcelはもうメンテナンスされていないということについても明言されています。

サンプルコード

まだ安定版がリリースされていませんが、PhpSpreadsheetを使った簡単なサンプルコードを書いてみました。

動作環境

HomebrewでインストールしたPHP7.0で動作確認しました。

$ php -v
PHP 7.0.17 (cli) (built: Mar 18 2017 20:13:50) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies

composer.json

composer.json は以下のようになっています。

{
    "require": {
        "phpoffice/phpspreadsheet": "dev-develop"
    }
}

安定版がなので dev-develop を指定しています。

読み込みに使用するExcelファイル

以下のようなファイルを使用します、手元にExcelがないので、ファイルはNumbersで作りました。

f:id:ariarijp:20170326200437p:plain

サンプルコード本体

Excelファイルから特定の範囲を読み出し、各値を2乗したものを別ファイルに書き出すものです。

書き出し先はExcelファイルとCSVファイルの2パターン用意しました。

<?php

require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Settings;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;
use PhpOffice\PhpSpreadsheet\Writer\CSV as CSVWriter;

/*
 * 読み込みサンプル
 */
$reader = new XlsxReader();
$spreadsheet = $reader->load('sample1.xlsx');
$sheet = $spreadsheet->getActiveSheet();

// B2からD4までの領域を2次元配列として取得する
$dataArray = $sheet->rangeToArray('B2:D4');

/*
 * 書き出しサンプル
 */
// 上記のサンプルコードで読み出した各値を2乗する
array_walk_recursive($dataArray, function (&$x) {
    $x = $x ** 2;
});

// B1を起点として2次元配列をシートに書き込む
$sheet->fromArray($dataArray, null, 'B2');

// Excel(.xlsx)として書き出す
$writer = new XlsxWriter($spreadsheet);
$writer->save('sample2.xlsx');

// CSVとして書き出す
$writer = new CSVWriter($spreadsheet);
$writer->save('sample2.csv');

実行結果

実行結果として書き出された sample2.xlsx は以下のようになります。

f:id:ariarijp:20170326200831p:plain

また、 sample2.csv はこのようになります。

"","列1","列2","列3","列4"
"行1","1","4","9","4"
"行2","25","36","49","8"
"行3","81","100","121","12"
"行4","13","14","15","16"

まとめ

まだ開発中ではありますが、どうしてもPHPExcelを操作しなければならない時はPHPExcelとあわせてPhpSpreadsheetも検討してみるといいかもしれません。