在PHPWord操纵模板(manipulating template in PHPWord)

2019-08-08 13:04发布

我使用的是Word文档生成器,用于PHP的Web的应用程序,我正在开发的报告模块。 我选择PHPWord因为PHPDocX的免费版本功能非常有限,再加上它有一个页脚,它仅仅是一个免费的版本。 我有客户端提供的模板。 我要的是我要加载的模板和动态元素添加到它像其他文字或表格。 我的代码是在这里:

<?php
require_once '../PHPWord.php';

$PHPWord = new PHPWord();

$document = $PHPWord->loadTemplate('Template.docx');
$document->setValue('Value1', 'Great');

$section = $PHPWord->createSection();
$section->addText('Hello World!');
$section->addTextBreak(2);

$document->setValue('Value2', $section);

$document->save('test.docx');
?>

我试图创建一个新的部分,并试图将其分配给一个变量在模板(值2),但出现此错误:

[28-Jan-2013 10:36:37 UTC] PHP Warning:  utf8_encode() expects parameter 1 to be string, object given in /Users/admin/localhost/PHPWord_0.6.2_Beta/PHPWord/Template.php on line 99

Answer 1:

的setValue预计的第二个参数是纯字符串。 这是不可能提供部分对象。

我跳入代码和有没有一个简单的方法有部分对象返回,可以通过的setValue函数中使用的值。

由于我有同样的问题,我已经写了template.php文件中,允许您使用的setValue更换他们的标签之前克隆表行补丁。 每一行获得一个唯一的ID,让您识别模板标签为每个不同的行。

这是如何工作的:

此功能添加到您的template.php文件(PHPWord目录内找到)

public function cloneRow($search, $numberOfClones) {
    if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') {
        $search = '${'.$search.'}';
    }
    $tagPos      = strpos($this->_documentXML, $search);
    $rowStartPos = strrpos($this->_documentXML, "<w:tr", ((strlen($this->_documentXML) - $tagPos) * -1));
    $rowEndPos   = strpos($this->_documentXML, "</w:tr>", $tagPos) + 7;

    $result = substr($this->_documentXML, 0, $rowStartPos);
    $xmlRow = substr($this->_documentXML, $rowStartPos, ($rowEndPos - $rowStartPos));
    for ($i = 1; $i <= $numberOfClones; $i++) {
        $result .= preg_replace('/\$\{(.*?)\}/','\${\\1#'.$i.'}', $xmlRow);
    }
    $result .= substr($this->_documentXML, $rowEndPos);
    $this->_documentXML = $result;
}

在您的模板文件添加到每个表,你将作为模板行用一行。 让我们假设你已经添加了一个标记$ {} FIRST_NAME这排。

为了得到表3行称:$文档 - > cloneRow( 'FIRST_NAME',3);

模板的工作副本现在更新包含3行的表。 行内的每个标签已被附加了#和行号。

要设置值,使用的setValue $文档 - >的setValue( '#FIRST_NAME 1', '名称的第一行'); $文档 - >的setValue( '如first_name#2', '第二行名称'); $文档 - >的setValue( '如first_name#3', '第三行名称');

我希望这是有用的! 我会保持代码和文档的更新版本在这里: http://jeroen.is/phpword-templates-with-repeating-rows/



Answer 2:

根据该文件,当你使用模板的,你不能将内容添加到该文件。

这是不可能的新PHPWord元素添加到装载的模板文件。

文档



Answer 3:

全新版本CloneRow和setValue方法

现在,您可以克隆合并单元格。 与OOXML标签许多错误是固定的。

而新方法SetValue - 现在忽略你的模式里面的垃圾标签。 喜欢

{My<trash ooxml tags>Pattern}

你可以找到的代码,文档和例子在这里: https://github.com/Arisse/PHPWord_CloneRow



文章来源: manipulating template in PHPWord