PHPで帳票(Excel)出力のアレコレ

Fusicで主に業務系システムの開発をしている早崎です。
最近はもっぱらExcelやword（仕様書）と睨めっこしながら仕事をしています。

今回は自分が今年最も使った技術、**PHPExcel** でよくある使い方を忘備録的な感じでエントリーしたいと思います。

# 実装までの流れ

## 1.compserでk1low/xlsxをインストール

```
"require": {
    "php": "~5.6",
    "cakephp/cakephp": "3.3.*",
    "cakephp/migrations": "1.*",
    "cakephp/plugin-installer": "*",
    "cakephp/debug_kit": "~3.2",

    ～省略～

    "k1low/xlsx": "*"　←コレ
},
```


## 2.コードを書きます

```
use Xlsx\Xlsx;
use PHPExcel_Worksheet_Drawing;

class HogesTable extends Table
{
    public function outputExcel()
    {
        // 何はともあれコレ
        $xlsx = new Xlsx();

        // 出力ファイル名の指定
        $fileName = 'xxxxxx.xlsx';

        // 読み込むExcelテンプレートの指定
        $templateFilePath = APP.'XlsxTemplate/hoge.xlsx';

        // 読み込む
        $xlsx->read($templateFilePath);

        // 出力シートの指定
        $ast = $xlsx->setActiveSheetIndex(0); // 操作シート0が先頭シート

        // 値をセルにセット 1枚目のシートのA1セルに"ほげ"をセット
        $xlsx->setValue('ほげ', ['sheet' => 0, 'col' => 'A', 'row' => 1]);

        // セルの色塗り
        $ast->getStyle('A2')
             ->getFill()->setFillType('solid')         // 塗りぶし
             ->getStartColor()->setARGB('FF0000');     // 色指定(赤)

        // セルの罫線引き 1か所のみ（複数箇所設定は不可）
        $ast->getStyle('B2')
             ->getBorders()
             ->getLeft()                    // 左
             ->setBorderStyle('medium')     // 太線
             ->getColor()                   // カラー設定
             ->setARGB('FF000000');         // 色指定

        // セルの罫線引き 4か所一括設定
        $ast->getStyle('C3')
            ->getBorders()
            ->getAllBorders()
            ->setBorderStyle('medium')      // 太線
            ->getColor()                    // カラー設定
            ->setARGB('FF000000');          // 色指定

        // セルのマージ
        $ast->mergeCells('A4:B4');          // 結合

        // セル内文字の位置調整
        $ast->getStyle('A1')
            ->getAlignment()                // 位置関係指定
            ->setHorizontal('center');      // 中央揃え

        // セル内の文字の指定
        $ast->getStyle('A1')
            ->getFont()                     // フォント設定
            ->setSize(20)                   // サイズ
            ->setBold(true)                 // 太字
            ->setStrikethrough(true);       // 打消し線

        // 文字のフォーマット
        $xlsx->setValue('1234567', ['sheet' => 0, 'col' => 'A', 'row' => 5]);
        $ast->getStyle('A5')
            ->getNumberFormat()             // フォーマット指定
            ->setFormatCode('#,##0');       // 三桁カンマ

        // セルの行サイズの指定
        $ast->getRowDimension(5)            // 行番号1行目
            ->setRowHeight(30.755);         // 30.75px

        // 印刷範囲指定
        $ast->getPageSetup()
            ->setPrintArea('A1:K50');       // A1からK50までを範囲

        // 画像のセット
        $filePath = APP.'XlsxTemplate/hagurin.jpg';
        $objDrawing = new PHPExcel_Worksheet_Drawing();
        $objDrawing->setPath($filePath)
                   ->setCoordinates('A7')
                   ->setWidth(150)          // サイズ150px
                   ->setHeight(150)         // サイズ150px
                   ->setWorksheet($ast);

        // 最後にIE11を含むIE判定 これやらないとIEでファイル名が文字化けする
        $ua = env('HTTP_USER_AGENT');
        if (strstr($ua, 'Trident') || strstr($ua, 'MSIE')) {
            $fileName = urlencode($fileName);
        }

        // 出力（ダウンロード）
        $xlsx->output($fileName);
    }
```

## 3. outputExcelをコールします

こんな感じになります。
![qiita-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/25290/f8fb9135-391b-0b5d-d5aa-3aaffb8882de.png)

## その他

PHPExcelでExcelテンプレートを使うに当たって、その他に自分の知見情報をまとめておくと

- セルのマージをたくさん行うとメモリをめっちゃ使用するので足りなくなる可能性がある（マージは極力減らす）
- 値のセットにフォーマットを掛けるのもありですが、Excelの書式設定を入れるのもアリ（コードが減るので出来る限り使った方がいい）
- Excelの図形オブジェクトは操作できないので使用NG（出力したら消えた）
- テンプレートのカラー設定を基本カラー以外のものが使用されていると、変な色で出力されるので注意（カラーは定義色のみ使用する）

## 最後に

- PHPExcelで作成したファイルをPDFに変換する（罫線とか綺麗に）ライブラリ誰かしってたら教えて！