PHPWord替换word模板内容

Composer安装 phpword

composer require phpoffice/phpword

php代码

public function export(){
        $id=input('id');
        $info=db('record a')
            ->join('user b','a.user_id=b.id')
            ->join('school_class c','b.school_class_id=c.id','left')
            ->join('school_class d','b.school_class_id2=d.id','left')
            ->join('school_admin e','a.school_admin_id=e.id','left')
            ->field('a.*,b.nickname,b.username,b.gender,b.age,c.name grade,d.name class,e.name')
            ->where('a.id',$id)->whereNull('a.deletetime')->find();
        if(!$info) $this->error('记录不存在');
        //视频对话
        $result=db('record_video')->where('record_id',$id)->where('status',2)->whereNull('deletetime')->field('result,createtime')->select();
        //测评报告
        $user_answer=db('user_answer')->alias('a')
            ->join('scale b','a.scale_id=b.id')
            ->where('a.user_id',$info['user_id'])
            ->whereTime('a.createtime','between',[strtotime($info['day']),strtotime($info['day'])+24*3600-1])
            ->whereNull('a.deletetime')->order('a.id desc')
            ->field('a.content ans_content,b.name ans_name,a.score ans_score')->select();

        //历史评语
        $record_log=db('record_log')->where('record_id',$id)->select();

        //文档模板
        $templates = './template/ban.docx';
        //声明一个模板对象、读取模板
        $templateProcessor = new \PhpOffice\PhpWord\TemplateProcessor($templates);

        //基础信息  单个设置
        $templateProcessor->setValue('nickname',$info['nickname']);
        $templateProcessor->setValue('gender',$info['gender']==1?'男':'女');
        $templateProcessor->setValue('age',$info['age']);
        $templateProcessor->setValue('grade',$info['grade']);
        $templateProcessor->setValue('class',$info['class']);
        $templateProcessor->setValue('name',$info['name']);
        $templateProcessor->setValue('day',$info['day']);

        //测评报告列表 复制块
        $templateProcessor->cloneBlock('ans_block',count($user_answer),true,false,$user_answer);

        //咨询全流程记录列表  复制块
        foreach ($result as &$item){
            $item['ask_day']=date('Y-m-d',$item['createtime']);
            $ask_result=json_decode($item['result'],true);
            $html='';
            foreach ($ask_result as $v){
                $html.='用户'.$v['user'].':'.$v['str'].'<br/>';
            }
            $item['ask_result']=$html;
        }
        $templateProcessor->cloneBlock('ask_block',count($result),true,false,$result);

        //历史评语  复制行
        $templateProcessor->cloneRow('com_day',count($record_log));
        foreach ($record_log as $k=>$v){
            $templateProcessor->setValue('com_day#'.($k+1), date('Y-m-d',$v['createtime']));
            $templateProcessor->setValue('com_result#'.($k+1), $v['result']);
        }

        $path = $info['nickname'].'_'.$info['day']."_测评报告.docx";
        //生成新的word
        $templateProcessor->saveAs($path);
        //发送到浏览器
        \fast\Http::sendToBrowser($path);
    }

模板样式
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以回答你的问题。利用POI技术动态替换word模板内容的具体步骤如下: 1. 加载word模板文件并创建XWPFDocument对象。 2. 获取XWPFDocument对象中所有的XWPFParagraph对象,遍历每个XWPFParagraph对象。 3. 在每个XWPFParagraph对象中查找需要替换的文本,可以使用正则表达式或者字符串查找的方法。 4. 如果找到需要替换的文本,就使用XWPFRun对象的setText()方法将文本替换成新的内容。 5. 遍历所有XWPFTable对象,查找需要替换的文本,并使用XWPFTableCell对象的setText()方法将文本替换成新的内容。 6. 将替换后的XWPFDocument对象保存到新的文件中。 下面是一个简单的Java代码示例,演示如何利用POI技术动态替换word模板内容: ```java import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.poi.xwpf.usermodel.*; public class WordTemplate { public static void main(String[] args) throws Exception { // 加载word模板文件 FileInputStream fis = new FileInputStream("template.docx"); XWPFDocument doc = new XWPFDocument(fis); // 遍历所有段落 for (XWPFParagraph para : doc.getParagraphs()) { String text = para.getText(); if (text.contains("{{name}}")) { // 替换文本 text = text.replace("{{name}}", "张三"); para.removeRun(0); para.createRun().setText(text); } } // 遍历所有表格 for (XWPFTable table : doc.getTables()) { for (XWPFTableRow row : table.getRows()) { for (XWPFTableCell cell : row.getTableCells()) { String text = cell.getText(); if (text.contains("{{score}}")) { // 替换文本 text = text.replace("{{score}}", "90"); cell.removeParagraph(0); cell.setText(text); } } } } // 保存替换后的文件 FileOutputStream fos = new FileOutputStream("output.docx"); doc.write(fos); doc.close(); fis.close(); fos.close(); } } ``` 上述代码中,我们使用了XWPFDocument、XWPFParagraph、XWPFRun、XWPFTable、XWPFTableRow和XWPFTableCell对象来操作word文档,并使用FileInputStream和FileOutputStream对象读取和保存文件。在代码中,我们使用了“{{name}}”和“{{score}}”作为替换文本的标识符,你可以根据实际需要修改这些标识符。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值