php word 模板变量替换

PHP · 2023-04-21

安装PHP依赖 composer require phpoffice/phpword

// 以下代码仅支持字符串与列表形式的一维数组
function fill_template($templatePath, $data = [])
    {
        //指定事先制作好的模板文件路径
        try {
            $templateProcessor = new TemplateProcessor(public_path() . $templatePath);
            foreach ($data as $k => $datum) {
                if (is_string($datum)) {
                    $templateProcessor->setValue($k, $datum);
                } else {
                    $count = count($datum);
                    $templateProcessor->cloneRow($k, $count); //复制行
                    foreach ($datum as $kk => $item) {
                        // 复制表格行后 #+数字为行号 从1开始
                        $templateProcessor->setValue($k . '#' . ($kk + 1), ''); // 设置占位标志为空字符串
                        foreach ($item as $kkk => $value) {
                            $templateProcessor->setValue($kkk.'#'.($kk + 1), $value);
                        }
                    }
                }
            }
            $name = md5(time());
            if (!is_dir(public_path("words/" . date('Ymd')))) {
                mkdir(public_path("words/" . date('Ymd')), 0755, true);
            }
            // 将 word 文档保存至 你设置的路径
            $full = public_path("words/" . date('Ymd')) . $name . ".docx";
            $templateProcessor->saveAs($full);
        } catch (CopyFileException $e) {
            return $e->getMessage();
        } catch (CreateTemporaryFileException $e) {
            return $e->getMessage();
        }
        return $full;
    }

测试数据:

        // mock 数据    
        $data['key1']= 'AA';
        $data['key2']= 'BB';
        $data['key6']= [
            [
                'name'=>'张三',
                'age'=>'12',
            ],
            [
                'name'=>'张三',
                'age'=>'22',
            ],
        ];

        echo fill_template('template/template-a.docx',$data);
        //返回 E:\code\php\XXXX\public\words/20990101\c813f6bc4dbba4fd62143b3a392fb55.docx   

参考:
phpword 模板使用

word word 模板
Theme Jasmine by Kent Liao