CodeIgniter项目使用PHPWord创建表格报addSection未定义致命错误
核心报错原因
出现Call to undefined method Phpword::addSection()错误,本质是代码中实例化拿到的对象,根本不是PHPWord官方提供的核心功能类,两个常见的触发原因叠加导致:
- Composer自动加载机制是严格按照类名大小写匹配对应类文件的,官方核心类名是大写W的
PhpWord,当加载的时候写了小写w的Phpword,自动加载逻辑找不到匹配的类文件,拿到的实例没有addSection方法 - 手动实例化的时候没有写完整的命名空间路径,引用了全局命名空间下不存在的空类,没有实际绑定到PhpOffice下的PHPWord核心类
分步修复方案
- 修正类加载的大小写匹配规则
把控制器中加载库的代码从$this->load->library('Phpword')改成和实际类文件名大小写完全一致的$this->load->library('PhpWord'),避免自动加载匹配失败。 - 手动实例化时必须写全命名空间路径
不要直接写new PhpWord(),要完整指定类的命名空间路径,确保拿到的是带全部核心方法的正确实例:// 错误写法 $document_with_table = new PhpWord(); // 正确写法 $document_with_table = new \PhpOffice\PhpWord\PhpWord(); - 避免重复实例化的逻辑冲突
不要先通过CI加载器加载一遍库、又手动new一个新对象,两种方式拿到的实例如果路径不统一,很容易出现方法不匹配的问题。如果需要手动操作核心类,直接用全命名空间实例化即可,CI加载的实例可以不用重复调用。
修复后可直接运行的完整代码
// 正确加载PHPWord库 $this->load->library('PhpWord'); // 用完整命名空间实例化核心文档类 $document_with_table = new \PhpOffice\PhpWord\PhpWord(); // 以下表格生成逻辑即可正常调用 $section = $document_with_table->addSection(); $table = $section->addTable(); for ($r = 1; $r <= 8; $r++) { $table->addRow(); for ($c = 1; $c <= 5; $c++) { $table->addCell(1750)->addText("Row {$r}, Cell {$c}"); } } // 原有文档处理逻辑无需改动 $objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($document_with_table, 'Word2007'); $fullxml = $objWriter->getWriterPart('Document')->write(); $tablexml = preg_replace('/^[\s\S]*(<w:tbl\b.*<\/w:tbl>).*/', '$1', $fullxml); $template_document = new \PhpOffice\PhpWord\TemplateProcessor('C:\xampp\htdocs\practice_ci\CodeIgniter\template.docx'); $template_document->setValue('table', $tablexml); $template_document->saveAs('template_with_table.docx');
注意事项:不要直接套用3年以上的旧版PHPWord代码,新版本PHPWord(0.10以上)已经把所有核心类迁移到PhpOffice命名空间下,不带命名空间的旧代码会频繁出现类找不到、方法未定义的错误。
内容的提问来源于stack exchange,提问作者Anadkat Bhavik
相关产品推荐
相关产品推荐

