PHPExcelの後継っぽいPhpSpreadsheetでExcelファイルを読み書きするサンプルコード
PHPでExcel
PHPでExcelを操作する。というと「やめておけ」という言葉の次に上がってくる有名なライブラリは、PHPExcelではないかと思います。
溜まりに溜まったIssuesとPull Requestsの数を見ると不安な気持ちになってしまいますが、後継のライブラリーが開発中のようです。
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で作りました。
サンプルコード本体
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
は以下のようになります。
また、 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"
まとめ
まだ開発中ではありますが、どうしてもPHPでExcelを操作しなければならない時はPHPExcelとあわせてPhpSpreadsheetも検討してみるといいかもしれません。
なんだかんだExcelとの付き合いは続くものですね。
Microsoft Excel 2016 (最新)|オンラインコード版|Windows版
- 出版社/メーカー: マイクロソフト
- 発売日: 2015/09/30
- メディア: Software Download
- この商品を含むブログを見る
PHPCompatibilityを実行するためのDockerイメージを作った
PHP5からPHP7への移行を検討するとき、この記事を思い出してPHPCompatibilityを使ってみたところ、結構便利そうだった。
で、ちょっと導入が面倒な気がしたので、Dockerイメージに無理やり押し込んでみたのがこちら。
https://hub.docker.com/r/ariarijp/php-compatibility/
PHP_CodeSnifferとPHPCompatibility導入済みのイメージなので、Dockerホスト上のPHPアプリが置いてあるディレクトリをマウントすれば phpcs
が実行できる。
設定ファイルは元記事を参考に、PHP7で非推奨になったものをチェックする。
<?xml version="1.0"?> <ruleset name="wordpress"> <rule ref="PHPCompatibility"> <arg name="testVersion" value="7.0" /> <exclude name="PHPCompatibility.PHP.DefaultTimezoneRequired" /> </rule> </ruleset>
試しにWordPressを対象に実行してみる例がこちら
$ docker run --rm -v `pwd`:/mnt/host ariarijp/php-compatibility phpcs --extensions=php --standard=/mnt/host/ruleset.xml /mnt/host/wordpress FILE: /mnt/host/wordpress/wp-admin/includes/class-ftp.php ---------------------------------------------------------------------- FOUND 0 ERRORS AND 1 WARNING AFFECTING 1 LINE ---------------------------------------------------------------------- 902 | WARNING | Function dl() is deprecated since PHP 5.3 ---------------------------------------------------------------------- FILE: /mnt/host/wordpress/wp-admin/includes/class-pclzip.php ---------------------------------------------------------------------- FOUND 2 ERRORS AFFECTING 2 LINES ---------------------------------------------------------------------- 5345 | ERROR | Function set_magic_quotes_runtime() is deprecated | | since PHP 5.3 and removed since PHP 7.0 5376 | ERROR | Function set_magic_quotes_runtime() is deprecated | | since PHP 5.3 and removed since PHP 7.0 ---------------------------------------------------------------------- ...略...
PHP5.6のEOLは2018/12/31。まだ余裕があるようで、時間はあっという間に過ぎてしまうので、こういったツールも活用しつつ計画的にアップグレードしていきたいところ。
PHP BLT #6 でPHPのパフォーマンスモニタリングについてLTした
ちょっと前の話になってしまいますが、2/22にメルカリさんで開催されたPHP BLT #6に参加しました。
発表内容
php-profiler-extensionとElasticsearch/Kibanaを使用したパフォーマンスモニタリングの試行について発表しました。
5分に収まるように資料を無理やりまとめてしまったのと、発表時は緊張してたのもあって、駆け足なLTになってしまったのですが、後からハッシュタグを追ってみるとphp-profiler-extensionはXHProfの代替として利用でき、PHP7に対応しているというところは興味を持っていただけたようでした。
LTで軽くデモをしたElasticsearch/Kibanaでの可視化については、別途記事を書くかもしれません。
感想
PHP BLT初参加だったのですが、話題が多岐にわたりながらLTサイズ(5分)で聞けるので、普段気にしていなかったり触れていなかったことを発見できる場として、素直にいいなと思いました。
個人的にはPHP BLT #5での @sotarok さんの発表スライドを見て、次に開催されるときは必ず参加しようと思っていたこともあり、そういった意味でも充実した時間を過ごすことができました。
遅くなってしまいましたが、メルカリさん(と、司会の @koemu さん)ありがとうございました!
Mackerel Meetup #9でPHPerとしてLTしてきました
LT枠が空いていて、会社からも近かったので参加してきました。
参加レポートはこちらの記事を読んでいただくのがよいと思います。さすがの当日投稿でした。
そんななかで、年始に時間が空いてたときに作ったmackerel-client-phpについてLTしてきました。
実はLT枠で参加を決めた後に、先にLT枠で登録されていたのが sion_cojp さんだと知って、「Get wildのあとにする話なんか無い」と膝から落ちたのはいい思い出です。
このLT時点でGithubのStarが0だったことをネタにしたのがややウケでよかったです。
ちなみに、当日のMeetupが終わってから家につくまでにStarがじんわり増えたのですが、都合によりかなり飛ばしたペースで話したので、ほとんど記憶に残らないぐらいのリポジトリ名にもかかわらず、わざわざ探してStarをつけていただいた皆様には感謝しかありません。ありがとうございました。
会場にはPHPerの方が少ないように見受けられましたが、対 not PHPerネタとして無理やり仕込んだSlack APIを使ったチームのがんばり度合いの可視化もちょっとウケたようでよかったです。
クローズ時間が差し迫っていたこともあり、あまり多くの方とお話できなかったのですが、またMeetupの機会があれば、参加させていただきたいなと思っています。
最後に、Meetupの場とLTのノベルティを提供していただいたレコチョクさん、はてなさん、ありがとうございました!
LTしたらレコチョクさんとはてなさんからノベルティいただきました!ありがとうございました!明日の朝、かみさんから「なんで勉強会とかに行くとTシャツとかバッグが貰えるの?」という質問を受けるまでがMackerel Meetupです #mackerelio pic.twitter.com/DMgLkSQZrK
— Takuya Arita (@ariarijp) 2017年1月26日