最近CakePHP翻訳会に参加してCakePHPいいなーってところでアスクリード社内の雰囲気がLaravelになって悲しんでるヤマグチケイスケです。
さて、本記事ではCakePHP3とRHEL6系OSを使って綺麗なExcelファイルとPDFを作る方法を紹介します。
PHPでExcelファイル出力からPDFまで記載されている文章が日本語ではなかったかつ直近のがなかったのでお役に立てる内容になってるかと思います。
概要/環境
以下環境でExcelファイルとPDFファイルを作る方法を紹介します。
・RHEL6系(CentOS6, AmazonLinux等)
・PHP5.4
・CakePHP3.1
・PHPExcel 1.8
・LibreOffice 4.2
実装時のポイント
具体的なポイントは以下となります。
1.テンプレートとなるExcelファイルを用意すべし
よくググると、「色を付ける場合にはー」とか「セルを結合する場合にはー」とか出てきます。
しかし、一般的なExcelファイル(例えば見積書など)でそれをおこなう場合は非常にコードが長くなってしまうことは明白です。
そのため、テンプレートとなる値の入っていないExcelファイルを用意して、そのExcelを使っていきましょう。
2.PDF出力確認時の調節はLibreOffice(Mac版やWindows版等)と、MicrosoftOfficeのExcelの両方をつかうべし
Excelファイルを修正し、ExcelファイルからPDFに変換させ、それを確認する・・・等いったことを何度もおこなっていては日が暮れてしまいます。そんな確認をしたいときは、LibreOfficeの印刷プレビューを利用してください。
[手順概要]
① PDF変換となる印刷範囲をMS-Officeで設定(これはMS-Officeの方が使いやすいという理由が最も大きい)
② PDF変換対象となるExcelファイルをLibreOfficeで開き、印刷の余白等を調節してファイルを保存
3.透過PNGは透過GIFにすること
PHPExcelの開発者はそれほど活発な開発はしていないようです。
そのためか分かりませんが、透過PNGは対応されていません。(歴史的な経緯もありそうですが)
透過されている事が期待されているところは全て白色となっています。
もし透過PNGを使いたい場合は透過GIFに変換してから使いましょう。
4.Excelの関数が使えるということ
当然、Excelが持っている関数(例えば「sum」等)は使うことができます。
税込み価格や総額を求める際に値をわざわざ計算しなくよいのです。
横一列の情報を追加するだけで見積書が作れてしまいます。
5.セルが結合されている場合は最も左上のセルに対して書き込む事
Excel関数やVBAと同じようにセルを結合しているときは、結合されているセルのなかで最も左上のセルの番地を使う必要があります。
例えば、「A1からB2」まで結合されている場合、「A1」に対して書き込みをすれば良いです。
実装時のワークフロー
1.出来上がるExcelファイルのサンプル作成
もし成果物に対してYES/NOが言える人がいるのであれば、その人にサンプルを見せてYES/NOを貰いましょう。
もしくはその方からサンプルを貰うのがいいかもしれません。
そして、何処のセルにどういう内容の値が入っているのかきちんと聞きましょう。
例えば、「A1」にはカンマ区切りで税込みの総計が入ってること、等。
また静的な値(例えば自社名など)は、元からExcelにいれてしまいましょう。
逆に金額や項目名といった動的な箇所については削除しておいたほうがいいです。
2.実装(出力メソッド)
以下、$inputPathファイルをテンプレートファイルとして、$outputPathに書き出したExcelファイルを作成するメソッド例です。
この場合、$sheetNameは書き出し対象となるシート名で、$dataは添え字がセル番地の書きたい内容です。
private function setExcelData($inputPath, $outputPath, $sheetName, $data){ // ファイル作成 $reader = PHPExcel_IOFactory::createReader('Excel5'); $excel = $reader->load($inputPath); $sheet = $excel->getSheetByName($sheetName); // データ入力 foreach ($data as $key => $datums) { if($key && $datums){ $sheet->setCellValue($key, $datums); } } // 保存 $excel->setActiveSheetIndex(0); $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5'); $writer->save($outputPath); }
3.実装(Excelファイル作成)
public function hoge(){ $data[‘A1’] = “価格”; $data[‘B1’] = “3000”; $this->setExcelData(“/hoge/hoge”, “/piyo/piyo”, “sheet”, $data); }
以上です。
PDFを出力するにはいろんな方法があるかと思いますが、MS-Excelを綺麗に出力する方法はあまり無かったのでLibreOfficeがお勧めです! ノシ