phpword模板动态块

jfewjypa  于 2023-01-29  发布在  PHP
关注(0)|答案(1)|浏览(219)

我有一个包含此内容的Word模板

${line1}

SQL中的${line 1}模板内容值为

${block_name} 
${var1}  
${block_name}

使用PhpWord模板处理器,我可以替换这个。在TemplateProcessor.php中,我添加了

$replace = preg_replace('~\R~u', '</w:t><w:br/><w:t>', $replace);

在函数setValue中。这是因为,块应该是多行的,并且没有空间才能发生克隆块。
然后,我保存为template2.docx并再次加载到新的TemplateProcessor()中。当我打开word文件时,它已经显示多行。但是,仍然无法实现cloneblock。

include "db.php";

require_once 'vendor/autoload.php';
use PhpOffice\PhpWord\TemplateProcessor;
use PhpOffice\PhpWord\IOFactory;
use PhpOffice\PhpWord\PhpWord;

//1
$templateProcessor = new TemplateProcessor('template.docx');    
//template content value
$templateContentValue=$stmt->fetchAll(PDO::FETCH_ASSOC);
$content        =$templateContentValue[0]['contentVal'];
$templateProcessor->setValue('line', $content);
//save as template2.docx
$pathToSave     ='template2.docx';
$templateProcessor->saveAs($pathToSave);

//2
$templateProcessor2 = new TemplateProcessor($pathToSave);
$replacements = array(
                            array('var1' => 'value1'),
                            array('var1' => 'value2'),
                        );
$templateProcessor2->cloneBlock('block_name', 0, true, false, $replacements);
$templateProcessor2->saveAs('output.docx');

预期输出:

value1
value2
v2g6jxz6

v2g6jxz61#

我想您可能在最后一行的块语法中输入了错误
通过参考cloneBlock文档,您发现模板内容**${line1}**中缺少斜线(/),内容值应为

${block_name} 
${var1}  
${/block_name} // last line of block syntax

在第一个包含内容的单词模板中

${line1}

我看到你的代码

$templateProcessor->setValue('line', $content);

不是吗?

$templateProcessor->setValue('line1', $content);

所以我想这可能只是你写文章时的一个打字错误,这不是这里的主要问题。
在使用多行值的这篇文章的建议进行测试后,我能想到的另一种可能性是,这可能是由于PHPWord在**${line1}的替换内容中无法识别*换行符**的语法。
我尝试以下第一个字模板:

${line1}
${line2}
${line3}

然后一次替换多个值

$templateProcessor->setValues([
  'line1' => '${block_name}',
  'line2' => '${var1}',
  'line3' => '${/block_name}'
]);

// same goes to your code starting at line ==> //save as template2.docx

输出如预期,但我不认为这是你喜欢的。
希望能有所帮助!

相关问题