ThinkPHP使用phpword读取模板word文件并添加表格

1.安装phpword包composer require phpoffice/phpword

2.模板文件结构

如上图框住的是要替换的文本和要复制表格样式

实现代码

php 复制代码
<?php

namespace app\api\logic;

use PhpOffice\PhpWord\Element\Table;
use PhpOffice\PhpWord\SimpleType\TblWidth;
use PhpOffice\PhpWord\TemplateProcessor;
class Word
{

    public static function test($arr,$title,$stu_name)
    {
        //多行数据参考<w:br/>用于换行
//        $arr = [
//            ['id' => '1', 'value' => '单词内容<w:br/>单词内容<w:br/>单词内容单词内容单词内容单<w:br/>词内容单词内容单词内容单词内容单词内容单<w:br/>词内容单词内容单词内容单词内容单词内容单词内容单词内容单词内容单词内容单词内容单词内容单词内容单词内容单词内容单词内容'],
//            ['id' => '2', 'value' => '单词内容单词内容单词内<w:br/>容单词内容单词内容'],
//            ['id' => '3', 'value' => '单词内容单词<w:br/>内容单词内容单词内容单词内容'],
//            ['id' => '4', 'value' => '单词内容单词内容单<w:br/>词内容单词内容单词内容单词内容单词内容单<w:br/>词内容单词内容单词内容<w:br/>单词内容单词内容单词内容单词内容单词内容'],
//            ['id' => '5', 'value' => '单<w:br/>词<w:br/>内<w:br/>容'],
//        ];

        //新文件名
        $filename = date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8).".docx";
        $date = date('Y-m-d');
        $path = "export/word/$date/";
        if (!file_exists($path)) {
            mkdir($path, 0777, true);
        }
        //实例化, 参数传入模板文件地址
        $word_template = ROOT_PATH.'public/export/test.docx'; // 使用绝对路径

        // 检查模板文件是否存在
        if (!file_exists($word_template)) {
            throw new \Exception("模板文件不存在: " . $word_template);
        }
        $templateProcessor = new TemplateProcessor($word_template);
        //替换(设置)变量值
        $array_title = [
            'title' => $title,
            'date' => $date,
            'num' => count($arr),
            'name' => $stu_name,
        ];
        $templateProcessor->setValues($array_title);


        //生成表格
        $table = new Table(['borderSize' => 12, 'width' => 6000, 'unit' => TblWidth::TWIP, 'alignMent' => 'center']);

        $rows = count($arr);//总行数
        $templateProcessor->cloneRow('id', $rows);//$arr条数复制行
        for ($i = 0; $i < $rows; $i++) {
            $templateProcessor->setValue("id#" . ($i + 1), $arr[$i]['id']);//替换变量
            $templateProcessor->setValue("value#" . ($i + 1), $arr[$i]['value']);//替换变量
        }
        $templateProcessor->setComplexBlock('table', $table);
        //保存文件
        $templateProcessor->saveAs($path . $filename);
        return "/" . $path . $filename;
    }


}

上图是最终生成的word文件

相关推荐
YuMiao11 小时前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议
BingoGo2 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack2 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo3 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack3 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
Sinclair3 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
Rockbean4 天前
用40行代码搭建自己的无服务器OCR
服务器·python·deepseek
茶杯梦轩4 天前
CompletableFuture 在 项目实战 中 创建异步任务 的核心优势及使用场景
服务器·后端·面试