使用PHP从Excel(xls)单个单元格中提取图片的问题求助
错误原因分析
报错的核心是调用对象错误:getDrawingCollection()是工作表对象的方法,不能直接在单元格对象上调用,你之前的写法应该是先拿到了目标单元格再调用该方法,才会触发类方法不存在的错误。
实现方案
你需要遍历工作表的全部绘图对象,匹配目标单元格坐标即可拿到指定位置的图片和对应名称,示例代码如下:
// 获取活动工作表实例 $activeSheet = $objPHPExcel->getActiveSheet(); // 替换为你要提取的第一行目标单元格坐标,例如第一行B列就是'B1' $targetCell = 'A1'; $matchedDrawings = []; // 遍历所有绘图资源 foreach ($activeSheet->getDrawingCollection() as $drawing) { if ($drawing->getCoordinates() === $targetCell) { $matchedDrawings[] = $drawing; } } if (!empty($matchedDrawings)) { foreach ($matchedDrawings as $drawing) { // 获取图片名称 $imageName = $drawing->getName(); // 提取图片内容 if ($drawing instanceof PHPExcel_Worksheet_Drawing) { // 本地路径嵌入的图片 $imageContent = file_get_contents($drawing->getPath()); $imageSuffix = $drawing->getExtension(); } elseif ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) { // 剪贴板粘贴的内存图片 ob_start(); call_user_func( $drawing->getRenderingFunction(), $drawing->getImageResource() ); $imageContent = ob_get_clean(); $imageSuffix = $drawing->getMimeType() === 'image/png' ? 'png' : 'jpeg'; } // 此处可自行处理拿到的图片名称、内容、后缀,存库或落地存储 } }
注意事项
- 如果目标单元格内存在多张图片,上述代码会全部匹配存入
$matchedDrawings数组,按需取用即可。 - 目前PHPExcel已经停止维护,后续如果有更高版本Excel处理需求,建议替换为其迭代版本PhpSpreadsheet,API逻辑基本一致,兼容性更好。
内容的提问来源于stack exchange,提问作者Shivangi rawat
相关产品推荐
相关产品推荐

