使用PhpSpreadsheet设置Excel公式调用Word书签时触发非法字符错误
问题:PhpSpreadsheet设置Excel公式链接Word书签触发非法字符错误
已在Word文档中将“test”标记为书签bm1,用PhpSpreadsheet给Excel单元格设置公式链接该书签内容时,报错illegal character '~',但手动在Excel里操作完全正常。
代码示例
<?php require 'vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; $spreadsheet = new Spreadsheet(); $activeWorksheet = $spreadsheet->getActiveSheet(); $wordReportPath=dirname(__FILE__).'\report_output.docx'; // 尝试设置的公式:=Word.Document|'C:\xampp\htdocs\Project\test_excelGetWordBookmark.docx'!'!bm1' $activeWorksheet->setCellValue('A1', "=Word.Document|'C:\xampp\htdocs\Project\test_excelGetWordBookmark.docx'!'!bm1'"); $writer = new Xlsx($spreadsheet); $writer->save('excelFormLinkToWord.xlsx');
错误信息
Uncaught PhpOffice\PhpSpreadsheet\Calculation\Exception: Worksheet!A1 -> Formula Error: Illegal character '~'
解决办法
PhpSpreadsheet的公式语法校验机制会把外部链接里的|和!组合识别为非法的~转义字符,直接用setCellValue会触发校验错误,有两种可行的修复方式:
方式1:用setCellValueExplicit强制设为公式类型,绕过语法检查
把设置单元格的代码替换成下面的写法,同时注意路径里的反斜杠要转义成\\(避免PHP解析错误):
$activeWorksheet->setCellValueExplicit( 'A1', "=Word.Document|'C:\\xampp\\htdocs\\Project\\test_excelGetWordBookmark.docx'!'!bm1'", \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_FORMULA );
方式2:手动转义公式里的特殊字符
按照Excel的转义规则,把公式里的!替换成~!,修改后的公式代码:
$activeWorksheet->setCellValue( 'A1', "=Word.Document|'C:\\xampp\\htdocs\\Project\\test_excelGetWordBookmark.docx'~'~!bm1'" );
实际测试下来,方式1的兼容性更好,因为PhpSpreadsheet对这类跨Office的外部链接公式解析支持有限,直接绕过校验更稳妥。
内容的提问来源于stack exchange,提问作者Premlatha
相关产品推荐
相关产品推荐

