CakePHPでPHPWordを使う方法

「CakePHP PHPWord」と調べてもひとつも出てこなかったので、PHPSpreadsheetに関する記事を参考にしながらなんとか実装しました。そのなけなしの成果を書いておきます。
CakePHP4を使っています。
#インストール

composerを使ってインストールします。

```
composer require phpoffice/phpword
```

#サーバー上に保存
/webroot に sample.docx が作成されるようにしています。

```php
<?php

namespace App\Controller;

use PhpOffice\PhpWord\PhpWord;//<-追加
use PhpOffice\PhpWord\IOFactory;//<-追加


class SapmleController extends AppController
{
    public function word()
    {
        $word = new PhpWord();
        $section = $word->addSection();
        $section->addText("テスト");
        $section->addText(
            'ほげほげ',
            ['name' => 'ＭＳ ゴシック', 'size' => 15, 'color' => '00ff00', 'bold' => true, 'underline' => 'dash']
        );
        $writer = IOFactory::createWriter($word, 'Word2007');
        $writer->save(WWW_ROOT . 'sample.docx');
        exit;
    }
}
```
###結果
![スクリーンショット 2020-10-26 10.22.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617482/31105ca6-f898-6ba3-ca59-756c33821fe0.png)

他にも表や画像を貼ったりできます。(https://qiita.com/satthi/items/761f7d956e2e9ca76f53)

#ダウンロード
サーバに保存するのではなく、ブラウザでダウンロードさせたい場合はこのようにします。

```php
<?php

namespace App\Controller;

use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\IOFactory;


class SapmleController extends AppController
{
    public function download()
    {
        $word = new PhpWord();
        $section = $word->addSection();
        $section->addText("テスト");
        $section->addText(
            'ほげほげ',
            ['name' => 'ＭＳ ゴシック', 'size' => 15, 'color' => '00ff00', 'bold' => true, 'underline' => 'dash']
        );
        $writer = IOFactory::createWriter($word, 'Word2007');

        //ここから下を変更
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment;filename="sample.docx');
        header('Cache-Control: max-age=0');
        //ダウンロード
        $writer->save('php://output');
        exit;
    }
}
```

#テンプレート機能
TemplateProcessorを使えば以下のようにテンプレートのwordファイルを変数を動的に埋め込むことができます。


1. テンプレートとなるWordファイルを準備  
変数を埋め込みたい場所に ${変数名} と入力しておきます。
![スクリーンショット 2020-10-26 10.54.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617482/24b346c2-9966-7d5c-efa7-fb3ab6f24caa.png)
今回はこれを /src に /word と言うディレクトリを作り template.docx として入れておきました。

2. 値を代入  

```php
<?php

namespace App\Controller;

use PhpOffice\PhpWord\TemplateProcessor;//<-変更


class SapmleController extends AppController
{
    public function template()
    {
        $template_path  = realpath(APP) . DS .  "word" . DS . "template.docx";

        $templateProcessor = new TemplateProcessor($template_path);
        //値を代入
        $templateProcessor->setValue('hoge', "ほげほげ");
        $templateProcessor->setValue('huga', "フガふが");

        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment;filename="sample.docx"');
        header('Cache-Control: max-age=0');

        //ダウンロード
        $templateProcessor->saveAs('php://output');
        exit;
    }
}
```
->save ではなく ->saveAs とすることに気をつけてください。そうしないと何も書かれていない白紙のwordが出力されてしまいます。
###結果
![スクリーンショット 2020-10-26 11.13.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617482/48a1143e-b4e7-b505-4a40-8e844c6954ed.png)
___
####実は
これがQiita **初投稿**です。プログラミング歴もうすぐで一年になります。
間違っているところや改善すべき点がある場合は指摘していただけると幸いです。