Templates processing

You can create an OOXML document template with included search-patterns (macros) which can be replaced by any value you wish. Only single-line values can be replaced. Macros are defined like this: ${search-pattern}. To load a template file, create a new instance of the TemplateProcessor.

$templateProcessor = new TemplateProcessor('Template.docx');

setValue

Given a template containing

Hello ${name}!

The following will replace ${name} with World. The resulting document will now contain Hello World!

$templateProcessor->setValue('name', 'World');

setImageValue

The search-pattern model for images can be like:
  • ${search-image-pattern}

  • ${search-image-pattern:[width]:[height]:[ratio]}

  • ${search-image-pattern:[width]x[height]}

  • ${search-image-pattern:size=[width]x[height]}

  • ${search-image-pattern:width=[width]:height=[height]:ratio=false}

Where:
  • [width] and [height] can be just numbers or numbers with measure, which supported by Word (cm, mm, in, pt, pc, px, %, em, ex)

  • [ratio] uses only for false, - or f to turn off respect aspect ration of image. By default template image size uses as ‘container’ size.

Example:

${CompanyLogo}
${UserLogo:50:50} ${Name} - ${City} - ${Street}
$templateProcessor = new TemplateProcessor('Template.docx');
$templateProcessor->setValue('Name', 'John Doe');
$templateProcessor->setValue(array('City', 'Street'), array('Detroit', '12th Street'));

$templateProcessor->setImageValue('CompanyLogo', 'path/to/company/logo.png');
$templateProcessor->setImageValue('UserLogo', array('path' => 'path/to/logo.png', 'width' => 100, 'height' => 100, 'ratio' => false));

cloneBlock

Given a template containing See Sample_23_TemplateBlock.php for an example.

${block_name}
Customer: ${customer_name}
Address: ${customer_address}
${/block_name}

The following will duplicate everything between ${block_name} and ${/block_name} 3 times.

$templateProcessor->cloneBlock('block_name', 3, true, true);

The last parameter will rename any macro defined inside the block and add #1, #2, #3 … to the macro name. The result will be

Customer: ${customer_name#1}
Address: ${customer_address#1}

Customer: ${customer_name#2}
Address: ${customer_address#2}

Customer: ${customer_name#3}
Address: ${customer_address#3}

It is also possible to pass an array with the values to replace the marcros with. If an array with replacements is passed, the count argument is ignored, it is the size of the array that counts.

$replacements = array(
    array('customer_name' => 'Batman', 'customer_address' => 'Gotham City'),
    array('customer_name' => 'Superman', 'customer_address' => 'Metropolis'),
);
$templateProcessor->cloneBlock('block_name', 0, true, false, $replacements);

The result will then be

Customer: Batman
Address: Gotham City

Customer: Superman
Address: Metropolis

replaceBlock

Given a template containing

${block_name}
This block content will be replaced
${/block_name}

The following will replace everything between``${block_name}`` and ${/block_name} with the value passed.

$templateProcessor->replaceBlock('block_name', 'This is the replacement text.');

deleteBlock

Same as previous, but it deletes the block

$templateProcessor->deleteBlock('block_name');

cloneRow

Clones a table row in a template document. See Sample_07_TemplateCloneRow.php for an example.

------------------------------
| ${userId} | ${userName}    |
|           |----------------|
|           | ${userAddress} |
------------------------------
$templateProcessor->cloneRow('userId', 2);

Will result in

----------------------------------
| ${userId#1} | ${userName#1}    |
|             |------------------|
|             | ${userAddress#1} |
---------------------------------|
| ${userId#2} | ${userName#2}    |
|             |------------------|
|             | ${userAddress#2} |
----------------------------------

applyXslStyleSheet

Applies the XSL stylesheet passed to header part, footer part and main part

$xslDomDocument = new \DOMDocument();
$xslDomDocument->load('/path/to/my/stylesheet.xsl');
$templateProcessor->applyXslStyleSheet($xslDomDocument);