社群中的第一篇文章 phpwprd 模板使用

852919991發表於2020-04-08

記錄下專案中遇到的問題
應專案需求,需要將使用者的資料生成word文件,最後找到了phpword,他可以通過事先設定好的模板生成相應的文件
效果

1.安裝phpword

$ composer require phpoffice/phpword

2.準備一個 word 模板

3.在我們的控制器裡編寫程式碼

<?php

namespace App\Http\Controllers;

use PhpOffice\PhpWord\TemplateProcessor;
use PhpOffice\PhpWord\PhpWord;
use App\Http\Controllers\Controller;

class TestController extends Controller
{
    public function demo()
    {
        //例項化 phpword 類
        $PHPWord = new PhpWord();

        //指定事先製作好的模板檔案路徑
        $templateProcessor = new TemplateProcessor(public_path("Uploads/pdf/demo3.docx"));

        // 需要的資料
        $arr = [];
        $arr = [
            [
                'num' => 1,
                'add' => '臨平1',
                'dec' => '描述1',
                'list' => [
                    ['list' => '未制定安全生產責任制,扣10分;未經責任人簽字確認,扣5分'],
                    ['list' => '未制定安全生產責任制,扣3分;未經責任人簽字確認,扣100分'],
                ]
            ],
            [
                'num' => 2,
                'add' => '臨平2',
                'dec' => '描述2',
                'list' => [
                    ['list' => '未制定安全生產責任制,扣4分;未經責任人簽字確認,扣8分'],
                    ['list' => '未制定安全生產責任制,扣7分;未經責任人簽字確認,扣5分'],
                    ['list' => '未制定安全生產責任制,扣3分;未經責任人簽字確認,扣200分'],
                ]
            ],
            [
                'num' => 3,
                'add' => '臨平3',
                'dec' => '描述3',
                'list' => [
                    ['list' => '未制定安全生產責任制,扣10分;未經責任人簽字確認,扣5分'],
                    ['list' => '未制定安全生產責任制,扣9分;未經責任人簽字確認,扣2分'],
                    ['list' => '未制定安全生產責任制,扣4分;未經責任人簽字確認,扣8分'],
                    ['list' => '未制定安全生產責任制,扣7分;未經責任人簽字確認,扣5分'],
                    ['list' => '未制定安全生產責任制,扣3分;未經責任人簽字確認,扣300分'],
                ]
            ],
        ];

        // 迴圈次數
        $count = count($arr);

            // 將 ${num} 所在行clone
            $templateProcessor->cloneRow('num', $count); //複製行

            foreach ($arr as $kk => $vv) {
                $list = '';
                for ($i = 0; $i < count($vv['list']); $i++) {
                    if ($i == (count($vv['list']) - 1)) {
                        $list = $list . ($i + 1) . ' .${list#' . ($kk + 1) . '#' . ($i + 1) . '}';
                    } else {
                        // <w:br/> 換行符
                        $list = $list . ($i + 1) . ' .${list#' . ($kk + 1) . '#' . ($i + 1) . '}<w:br/>';
                    }
                }
                $templateProcessor->setValue('list#' . ($kk + 1), $list); //複製行

            }

        // 儲存新word文件
        $path = md5(time());
        if (!is_dir(public_path("Uploads/pdf"))) {
            mkdir(public_path("Uploads/pdf"), 0755, true);
        }
        // 將 word 文件儲存至 你設定的路徑
        $templateProcessor->saveAs(public_path("Uploads/pdf/" . md5(time()) . ".docx"));

    }
}

4.檢視剛生成的檔案

phpwprd 模板使用

5.將我們的資料填充進去

public function demo()
    {
        //例項化 phpword 類
        $PHPWord = new PhpWord();

        //指定模板檔案
        $templateProcessor = new TemplateProcessor(public_path("Uploads/pdf/demo3.docx"));

        //通過setValue 方法給模板賦值
        $templateProcessor->setValue('project', "專案名稱");

        $arr = [];
        $arr = [
            [
                'num' => 1,
                'add' => '臨平1',
                'dec' => '描述1',
                'list' => [
                    ['list' => '未制定安全生產責任制,扣10分;未經責任人簽字確認,扣5分'],
                    ['list' => '未制定安全生產責任制,扣3分;未經責任人簽字確認,扣100分'],
                ]
            ],
            [
                'num' => 2,
                'add' => '臨平2',
                'dec' => '描述2',
                'list' => [
                    ['list' => '未制定安全生產責任制,扣4分;未經責任人簽字確認,扣8分'],
                    ['list' => '未制定安全生產責任制,扣7分;未經責任人簽字確認,扣5分'],
                    ['list' => '未制定安全生產責任制,扣3分;未經責任人簽字確認,扣200分'],
                ]
            ],
            [
                'num' => 3,
                'add' => '臨平3',
                'dec' => '描述3',
                'list' => [
                    ['list' => '未制定安全生產責任制,扣10分;未經責任人簽字確認,扣5分'],
                    ['list' => '未制定安全生產責任制,扣9分;未經責任人簽字確認,扣2分'],
                    ['list' => '未制定安全生產責任制,扣4分;未經責任人簽字確認,扣8分'],
                    ['list' => '未制定安全生產責任制,扣7分;未經責任人簽字確認,扣5分'],
                    ['list' => '未制定安全生產責任制,扣3分;未經責任人簽字確認,扣300分'],
                ]
            ],


        ];

        // 迴圈次數
        $count = count($arr);
            // 第一層
            $templateProcessor->cloneRow('num', $count); //複製行

            foreach ($arr as $kk => $vv) {
                $list = '';
                for ($i = 0; $i < count($vv['list']); $i++) {
                    if ($i == (count($vv['list']) - 1)) {
                        $list = $list . ($i + 1) . ' .${list#' . ($kk + 1) . '#' . ($i + 1) . '}';
                    } else {
                        $list = $list . ($i + 1) . ' .${list#' . ($kk + 1) . '#' . ($i + 1) . '}<w:br/>';
                    }
                }
                $templateProcessor->setValue('list#' . ($kk + 1), $list); //複製行
            }
            foreach ($arr as $k => $v) {

                $templateProcessor->setValue('num#' . ($k + 1), $v['num']);
                $templateProcessor->setValue('add#' . ($k + 1), $v['add']);
                $templateProcessor->setValue('dec#' . ($k + 1), $v['dec']);

                for ($i = 0; $i < count($arr[$k]['list']); $i++) {
                    $templateProcessor->setValue('list#' . ($k + 1) . '#' . ($i + 1), $arr[$k]['list'][$i]['list']); //替換變數
                }
            }


        //儲存新word文件
        $path = md5(time());
        if (!is_dir(public_path("Uploads/pdf"))) {
            mkdir(public_path("Uploads/pdf"), 0755, true);
        }
        $templateProcessor->saveAs(public_path("Uploads/pdf/" . md5(time()) . ".docx"));
    }

最終效果

phpwprd 模板使用

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章