この記事は「株式会社グロージェント Advent Calendar 2016」の9日目の記事です。
RYです。
久しぶりの技術ネタでも書こうかと思います。
特に目新しいものでもないのですが、こういうことをする必要がある時もあるのさ……ということで。
Excelに入力するのを自動化したい
元々は社内のシステムで勤務時間などを管理していたのですが、やはりExcelが欲しいなーという要件が出てきたのです。
なのでDBにある内容だったりをとってきてそれをExcelに入れたいなと思っていました。
こういう地味な仕事はエンジニア的には正直、テンションが上がりにくい……
そこで当時そのシステムを作ることになった私はブームだった(世の中的にも自分的にも)Node.jsでの実装をしようと思いました。
Node.jsでは中々難しかった
結論としてはNode.jsはやめましたw
これは言語がという話ではなく、Node.jsには満足できるレベルでExcelのファイルを弄るライブラリがなかったのですね。
しかし元々Excelが好きではない私です。
xlsxを弄る為にゴリゴリライブラリを直すなんてこともしたくないし、相当時間かかりそうです。
仕様から調べなければならないですし……
そこまでやるよりはもっと時間を大切にしようと思いました。
ついでに時間はそんなにありませんでした。
そこでPHPExcel
そういう流れでPHPでExcelを弄ることになりました。
PHPにはPHPExcelというライブラリがあるのですが、これが試した中では一番無難にやってくれます。
https://github.com/PHPOffice/PHPExcel
composerでインストールしましょう。
"require": { "phpoffice/phpexcel": "~1.8" },
さて、ここからプログラミング開始。
大変ですぞ!……と言いたいところですが、実は至って簡単。
今回はテンプレートとなるファイルを読み込んで、そこにPHPから入力してファイルを保存しましょう。
これが出来れば大幅にエクセル作業の時間が短縮できますねb
// まずは読み込むファイルと出力ファイルを指定しちゃう // 今回はサンプルなのでハードコーディングで $src = 'template.xlsx'; $dest = 'output.xlsx'; // テンプレート読み込む為にリーダーを作る。 // xlsxフォーマットを指定 $reader = PHPExcel_IOFactory::createReader('Excel2007'); // 読み込む $excel = $reader->load($src); // 最初のシートをアクティブにする $excel->setActiveSheetIndex(0); // シートオブジェクトの取得。シートに関する操作はこれでやることになる。 $sheet = $excel->getActiveSheet(); // A3セルになんか入れる $sheet->setCellValue('A3', 'アドベントカレンダー2016'); // 列と行で指定することも可能。ループとかで活躍。 // 6列3行目になんか書く // ColumnとRowで始まるインデックスが違うのに注意 $sheet->setCellValueByColumnAndRow(5, 3, 'お疲れサマンサ'); // ライター作成 $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel2007'); // ファイルをアウトプット $writer->save($dest);
こんな感じで簡単に出来ました。
いくつか試したライブラリの中では一番いい感じです。
皆さんもPHPでExcelと上手く付き合いましょう。