14

開発中の Web アプリのレポート モジュールに、PHP 用のワード ドキュメント ジェネレーターを使用しています。私が 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');
?>

新しいセクションを作成して、テンプレートの 1 つの変数 (Value2) に割り当てようとしましたが、次のエラーが表示されました。

[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
4

3 に答える 3

6

setValue は、2 番目のパラメーターがプレーンな文字列であることを想定しています。セクション オブジェクトを提供することはできません。

私はコードに飛び込みましたが、setValue 関数で使用できる値を返すセクション オブジェクトを持つ簡単な方法はありません。

同じ問題があったため、タグを setValue に置き換える前にテーブル行を複製できるようにする Template.php ファイルのパッチを作成しました。各行には一意の 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;
}

テンプレート ファイルで、テンプレート行として使用する 1 つの行を各テーブルに追加します。この行にタグ ${first_name} を追加したとします。

3 行のテーブルを取得するには: $document->cloneRow('first_name', 3);

テンプレートの作業コピーが更新され、3 行を含むテーブルが作成されました。行内の各タグには、# と行番号が追加されています。

値を設定するには、setValue $document->setValue('first_name#1', 'Name on the first row'); を使用します。$document->setValue('first_name#2', '2 行目の名前'); $document->setValue('first_name#3', '3 行目の名前');

これが役に立つことを願っています!コードとドキュメントの更新版をここに置いておきます: http://jeroen.is/phpword-templates-with-repeating-rows/

于 2013-03-13T17:27:40.133 に答える
2
于 2014-10-21T21:30:04.633 に答える
1

完全に新しいバージョンの CloneRow と setValue

これで、結合されたセルを複製できます。OOXML タグに関する多くのバグが修正されました。

新しいメソッド setValue - パターン内のごみタグを無視するようになりました。お気に入り

{My<trash ooxml tags>Pattern}

ここでコード、ドキュメント、および例を見つけることができます: https://github.com/Arisse/PHPWord_CloneRow

于 2014-02-13T09:04:19.433 に答える