PHPWord修改模板部分变量不能显示

随机产生字符串,用phpword修改模板,$airlinePnr和$iePnr两处是空的,而其他的值显示是正常的,请问是什么原因?
代码如下:

<?php

function pnrGenerate() {
    $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randomString = '';

    for ($i = 0; $i < 6; $i++) {
        $index = rand(0, strlen($characters) - 1);
        $randomString .= $characters[$index];
    }
    echo $randomString;
}

// Importing the required dependencies
require_once 'vendor/autoload.php';

use PhpOffice\PhpWord\IOFactory;
use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\TemplateProcessor;

// Set the path for the PDF renderer library
$rendererLibraryPath = realpath(__DIR__ . '/vendor/mpdf/mpdf');
// var_dump($rendererLibraryPath);  //返回 bool(false),命令行 composer require mpdf/mpdf
\PhpOffice\PhpWord\Settings::setPdfRendererPath($rendererLibraryPath);
\PhpOffice\PhpWord\Settings::setPdfRendererName('MPDF');

$passportNo = ‘EK3478566’;
$name = 'XUE/XING';
$title = 'MR';

$airlinePnr = pnrGenerate();
$iePnr = pnrGenerate();
echo $airlinePnr. '</br>';
echo $iePnr. '</br>';

$etkt = mt_rand(1000000000, 9999999999);
echo $etkt. '</br>';

$date = date('dMY');
$date = str_replace('20', '', $date);
$date = strtoupper($date);
echo $date. '</br>';

// Load the template file in DOCX format
// $template = IOFactory::load('template1.docx');
$template = new TemplateProcessor('template1.docx');

// Replace the placehoders in the template file with the extracted information
$template->setValue('AIRLINEPNR', $airlinePnr);
$template->setValue('IEPNR', $iePnr);
$template->setValue('NAME', $name);
$template->setValue('TITLE', $title);
$template->setValue('ETKT', $etkt);
$template->setValue('PASSPORTNO', $passportNo);
$template->setValue('DATE', $date);

// Create a new PDF writer
// $xmlWriter = IOFactory::createWriter($template, 'PDF');
// Save the PDF file
// $xmlWriter->save('document.pdf');

// Save the filled template as a new file in DOCX format
$template->saveAs('output.docx');

?>

模板文件内容如下:

img

成品文件内容如下:

img

引用chatgpt内容作答:
从您提供的代码和问题描述中,我看不出明显的错误。不过,我注意到您的pnrGenerate()函数在生成随机字符串时直接输出了字符串,这可能会导致问题。pnrGenerate()函数应该返回生成的随机字符串,而不是直接输出。在模板中替换变量时,您需要确保替换的值是正确的并且在正确的位置。

以下是您的代码的修改版本,将pnrGenerate()函数修改为返回随机字符串,而不是直接输出:

<?php
 
function pnrGenerate() {
    $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randomString = '';
 
    for ($i = 0; $i < 6; $i++) {
        $index = rand(0, strlen($characters) - 1);
        $randomString .= $characters[$index];
    }
    return $randomString;
}
 
// Importing the required dependencies
require_once 'vendor/autoload.php';
 
use PhpOffice\PhpWord\TemplateProcessor;
 
$passportNo = 'EK3478566';
$name = 'XUE/XING';
$title = 'MR';
 
$airlinePnr = pnrGenerate();
$iePnr = pnrGenerate();
echo $airlinePnr. '</br>';
echo $iePnr. '</br>';
 
$etkt = mt_rand(1000000000, 9999999999);
echo $etkt. '</br>';
 
$date = date('dMY');
$date = str_replace('20', '', $date);
$date = strtoupper($date);
echo $date. '</br>';
 
$template = new TemplateProcessor('template1.docx');
 
$template->setValue('AIRLINEPNR', $airlinePnr);
$template->setValue('IEPNR', $iePnr);
$template->setValue('NAME', $name);
$template->setValue('TITLE', $title);
$template->setValue('ETKT', $etkt);
$template->setValue('PASSPORTNO', $passportNo);
$template->setValue('DATE', $date);
 
$template->saveAs('output.docx');
 
?>

请确保您的模板文件(template1.docx)中存在匹配的标签,例如AIRLINEPNR和IEPNR,并且这些标签的大小写和拼写与代码中的替换值一致。如果问题仍然存在,您可以添加一些调试输出来检查代码中的变量值以及模板中的标签是否匹配。

模板中的占位符是以大写形式表示的:$AIRLINEPNR 和 $IEPNR。你的代码中,你使用的是小写形式的占位符:$airlinePnr 和 $iePnr。

这个问题可能是因为您在使用PHPWord修改模板时,没有正确设置$airlinePnr$iePnr变量的值。以下是一些建议,帮助您解决这个问题:

  1. 检查您的代码中设置$airlinePnr$iePnr变量的部分。确保这些变量已被正确赋值,并且它们的值在修改模板时被正确传递。

  2. 确保您使用了正确的占位符来替换$airlinePnr$iePnr。在模板文件中,这些占位符应与您在代码中设置的变量名相匹配。例如,如果占位符为{airlinePnr}{iePnr},那么您需要在代码中设置相应的变量。

  3. 如果您在模板中使用了条件语句(如PHP的ifforeach),请确保$airlinePnr$iePnr变量的值能够在这些语句中被正确处理。

  4. 检查PHPWord库和您的PHP版本是否兼容。有时候,库的版本更新可能会导致一些变量处理问题。尝试使用与PHPWord库兼容的PHP版本。

  5. 如果问题仍然存在,尝试将您的模板文件和PHP代码简化,逐步排除问题。例如,您可以创建一个简单的模板,只包含$airlinePnr$iePnr变量,并尝试使用PHPWord进行修改。这可以帮助您确定问题是否与模板文件或PHP代码有关。

  6. 如果问题仍然无法解决,请查看PHPWord的官方文档和示例代码。这些资源可能会为您提供有关如何正确设置和传递变量的更多帮助。

请根据您的具体代码和模板进行调整,希望这些建议能帮助您解决问题。

【以下回答由 GPT 生成】

这个问题出现的原因可能是模板中的$airlinePnr$iePnr变量没有被正确地替换。

在查看你的代码后,我没有看到你将变量值传递给模板。你可以使用PhpWord库提供的TemplateProcessor类来加载你的模板,并将变量值传递给模板。

以下是修复问题的步骤:

  1. 使用TemplateProcessor类加载模板文件。根据你的代码,我假设模板文件的路径为template.docx。你可以根据实际情况进行修改。

    php $templateProcessor = new TemplateProcessor('template.docx');

  2. 使用setValue方法将变量值传递给模板。你需要确保传递的变量名与模板中指定的变量名一致。根据你的代码,将$airlinePnr$iePnr传递给模板。

    php $templateProcessor->setValue('airlinePnr', $airlinePnr); $templateProcessor->setValue('iePnr', $iePnr);

  3. 保存生成的文档。你可以将生成的文档保存为docx格式或者转换为其他格式(如PDF)。根据你的代码,我假设你希望保存为docx格式。

    php $outputFilePath = 'output.docx'; $templateProcessor->saveAs($outputFilePath);

  4. 确保你的模板文件中包含了相应的变量标记。你需要在模板中添加$airlinePnr$iePnr这两个变量的标记。标记的格式通常是$变量名$

    例如,在模板中将$airlinePnr$$iePnr$分别标记在需要显示对应值的位置。

这样,当你运行代码并打开生成的文档output.docx时,你应该可以看到$airlinePnr$iePnr被正确地替换成了相应的随机值。

希望这些步骤能够解决你的问题。如果还有其他疑问,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^