PHPExcel使用RichText为单元格部分文本上色的报错及实现问题
问题原因&解决方法
1. 类型报错解决
报错根本原因是混用了旧版PHPExcel和新版PhpSpreadsheet的颜色类:你当前使用的RichText属于PhpSpreadsheet组件,对应需要传递的颜色类是\PhpOffice\PhpSpreadsheet\Style\Color,不能使用旧的PHPExcel_Style_Color类,否则就会出现参数类型不匹配的致命错误。
2. 文本重复问题解决
你先把完整文本全部加入RichText对象,再追加一次要高亮的片段,自然会出现重复内容。正确逻辑是把原文本拆成高亮前文本、高亮文本、高亮后文本三个部分,分别添加到RichText对象中,仅给高亮部分设置绿色字体。
完整可运行代码
if($product_name == '2-Day Cleanse'){ $orderSpc = $formatter->objPHPExcel->getActiveSheet()->getCell('C'.$row)->getValue(); // 要高亮的目标片段,可根据实际匹配需求调整大小写规则 $highlightStr = '2 day cleanse'; $highlightPos = stripos($orderSpc, $highlightStr); if($highlightPos !== false){ $objRichText = new \PhpOffice\PhpSpreadsheet\RichText\RichText(); // 先添加高亮前的普通文本 $beforeStr = substr($orderSpc, 0, $highlightPos); if(!empty($beforeStr)){ $objRichText->createText($beforeStr); } // 添加高亮文本,设置深绿色字体 $objCleanse = $objRichText->createTextRun($highlightStr); $objCleanse->getFont()->setColor( new \PhpOffice\PhpSpreadsheet\Style\Color( \PhpOffice\PhpSpreadsheet\Style\Color::COLOR_DARKGREEN ) ); // 最后添加高亮后的普通文本 $afterStr = substr($orderSpc, $highlightPos + strlen($highlightStr)); if(!empty($afterStr)){ $objRichText->createText($afterStr); } // 写入目标单元格 $formatter->objPHPExcel->getActiveSheet()->setCellValue('C'.$row, $objRichText); } }
如果需要自定义ARGB颜色,直接在实例化Color类时传入对应值即可,示例:
// 自定义亮红色 new \PhpOffice\PhpSpreadsheet\Style\Color('FFFF0000')
额外注意事项
- 不要使用
setColor(new Color())->setARGB()的链式写法:setColor()的返回值是Font对象,不是Color对象,后续调用setARGB()不会生效,需要在实例化Color类时直接传入ARGB值即可。
内容的提问来源于stack exchange,提问作者Mellopes
相关产品推荐
相关产品推荐

