phpword使用TemplateProcessor对模板进行替换

作者 : admin 本文共2199个字,预计阅读时间需要6分钟 发布时间: 2024-06-10 共1人阅读

最近有个需求,对一个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));
}
本站无任何商业行为
个人在线分享 » phpword使用TemplateProcessor对模板进行替换
E-->