phpword使用TemplateProcessor对模板进行替换

最近有个需求,对一个docx模板文件进行内容替换,这里记录一下遇到的一些难点和解决办法

1.单个表格替换,其中第一列需要纵向合并动态数量的单元格
模板名称:${table}
代码:

$tableStyle = array(
    'borderColor' => '000000', // 边框颜色(黑色)
    'borderSize' => 6, // 边框大小(6/8 磅)
    'cellMargin' => 50, // 单元格内边距
    'alignment' => \PhpOffice\PhpWord\SimpleType\JcTable::CENTER, // 表格居中
);
$resultTable = new \PhpOffice\PhpWord\Element\Table($tableStyle);
                $modelName = $model["name"];
                $row = $resultTable->addRow();
                //设置表头
                $row->addCell(2500,['bgColor' => '#B6DDE8'])->addText("content1", array('name' => 'Arial', 'size' => 14, 'color' => '000000', 'bold' => true));
                $row->addCell(3000,['bgColor' => '#B6DDE8'])->addText("content2", array('name' => 'Arial', 'size' => 14, 'color' => '000000', 'bold' => true));
                $row->addCell(2000,['bgColor' => '#B6DDE8'])->addText("content3", array('name' => 'Arial', 'size' => 14, 'color' => '000000', 'bold' => true));
                $row->addCell(2000,['bgColor' => '#B6DDE8'])->addText("content4", array('name' => 'Arial', 'size' => 14, 'color' => '000000', 'bold' => true));
                foreach ($model["children"] as  $key=>$child){
                    $resultTable->addRow();
//重点,需要合并的纵向单元格第一个的style设置["vMerge" => "restart"],后面的单元格设置["vMerge" => "continue"]
                    if ($key == 0){
                        $resultTable->addCell(2500,["vMerge" => "restart"])->addText($modelName, array('name' => 'Arial', 'size' => 14, 'color' => '000000', 'bold' => true));
                    }else{
                        $resultTable->addCell(null,["vMerge" => "continue"]);
                    }
                    $resultTable->addCell(2500)->addText("text1", array('name' => 'Arial', 'size' => 14, 'color' => '000000', 'bold' => true));
                    $resultTable->addCell(2000)->addText("text2", array('name' => 'Arial', 'size' => 14, 'color' => '000000', 'bold' => true));
                    $resultTable->addCell(2000)->addText("text3", array('name' => 'Arial', 'size' => 14, 'color' => '000000', 'bold' => true));
                }
                //最后将字符串替换为整个表格
                $tmpTemplateProcessor->setComplexBlock("table", $resultTable);

2.将一个字符串替换为复杂的多段文字,多个表格模块
逻辑:先将单个字符串的占位符替换成多个占位符,然后将docx保存为临时文件,重新读取,再将对应的段落和表格替换。注意这里有个坑,setComplexBlock会将段落所有的内容都替换掉,如果你只有一个段落但是里面有很多占位符,多次使用setComplexBlock后,只会有一个替换后的内容显示。
占位符:
${safe_table_block}
${safe_table}
${/safe_table_block}

$modelListStringArr =["parahraph_1","table_1","parahraph_2","table_2"]
//生成多个段落占位符
$templateProcessor->cloneBlock('safe_table_block', count($modelListStringArr), true, true);
        // 替换每个块中的占位符
        foreach ($modelListStringArr as $index => $paragraph) {
            $templateProcessor->setValue('safe_table#' . ($index + 1), htmlspecialchars($paragraph));
        }

最近更新

  1. TCP协议是安全的吗?

    2024-06-06 15:04:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-06 15:04:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-06 15:04:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-06 15:04:03       20 阅读

热门阅读

  1. 自动化迁移和更新物体检测XML数据集

    2024-06-06 15:04:03       8 阅读
  2. 03-3.1.2 栈的顺序存储的实现

    2024-06-06 15:04:03       10 阅读
  3. AJAX

    AJAX

    2024-06-06 15:04:03      8 阅读
  4. leetcode刷题

    2024-06-06 15:04:03       8 阅读
  5. WebRTC 在 Android 端实现一对一通信

    2024-06-06 15:04:03       8 阅读
  6. Webrtc支持HEVC之Mediasoup SDP协商编码流程(三)

    2024-06-06 15:04:03       9 阅读
  7. Webrtc支持HEVC之编解码器创建(二)

    2024-06-06 15:04:03       8 阅读
  8. cuda 存储相关博客收藏

    2024-06-06 15:04:03       7 阅读
  9. 注解 - @RequestParam

    2024-06-06 15:04:03       8 阅读
  10. Python正则表达式匹配中文:深入解析与实战应用

    2024-06-06 15:04:03       9 阅读
  11. git -- 清除本地分支以及删除远程分支

    2024-06-06 15:04:03       11 阅读