我正在尝试使用以下代码将列表项添加到 phpword 模板:
$PHPWord = new PHPWord();
$document = $PHPWord->loadTemplate(storage_path('app/template_report.docx'));
$section = $PHPWord->addSection();
$section->addListItem('List Item 1', 0);
$section->addTextBreak(1);
$document->setComplexBlock('list_items', $section);
$save_file_name = storage_path('app/report_'.date('Ymd_His').'.docx');
$document->saveAs($save_file_name);
但返回以下错误:
找不到类“PhpOffice\PhpWord\Writer\Word2007\Element\Section”
为什么会发生这种情况以及如何解决?
谢谢
图书馆开发人员已经在研究这个问题,但解决方案仍在 PR 中:https://github.com/PHPOffice/PHPWord/pull/2562。
解决方案其实很简单,只需要添加一个if,并将Section elementName替换为Container即可。就我而言,我使用的是 TemplateProccessor 类,因此我只需复制 PR 代码,创建自定义 TemplateProcessor 类并覆盖 setComplexBlock 函数,这是一个临时解决方案,直到 PR 合并之后,您应该避免直接修改库代码。
use PhpOffice\PhpWord\Element\AbstractElement;
use PhpOffice\PhpWord\Shared\XMLWriter;
use PhpOffice\PhpWord\TemplateProcessor as PHPWordTemplateProcessor;
class TemplateProcessor extends PHPWordTemplateProcessor
{
public function setComplexBlock($search, AbstractElement $complexType): void
{
$elementName = substr(get_class($complexType), strrpos(get_class($complexType), '\\') + 1);
//This is the solution
if ($elementName === 'Section') {
$elementName = 'Container';
}
$objectClass = 'PhpOffice\\PhpWord\\Writer\\Word2007\\Element\\' . $elementName;
$xmlWriter = new XMLWriter();
/** @var \PhpOffice\PhpWord\Writer\Word2007\Element\AbstractElement $elementWriter */
$elementWriter = new $objectClass($xmlWriter, $complexType, false);
$elementWriter->write();
$this->replaceXmlBlock($search, $xmlWriter->getData(), 'w:p');
}
}