找不到类“PhpOffice\PhpWord\Writer\Word2007\Element\Section”

问题描述 投票:0回答:1

我正在尝试使用以下代码将列表项添加到 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”

为什么会发生这种情况以及如何解决?

谢谢

laravel phpword
1个回答
1
投票

图书馆开发人员已经在研究这个问题,但解决方案仍在 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');
 }
}
© www.soinside.com 2019 - 2024. All rights reserved.