Visual FoxPro 9从含图片的Excel文件提取保存图片方法咨询
处理Visual FoxPro 9中Excel物料清单图片的保存方案
Hey Herbert, 我之前也遇到过类似的需求,用VFP操作Excel里的图片确实需要借助OLE自动化来实现,下面是具体的步骤和代码示例,你可以参考试试:
核心思路
通过VFP调用Excel的OLE对象,遍历工作表中的所有图片(Shapes对象),根据图片所在的行号关联到对应的物料行,然后将图片导出到指定路径。
具体实现步骤
- 连接到Excel文件:创建Excel应用程序对象,打开目标工作簿和工作表。
- 遍历所有图片:逐个检查每个图片的起始行号,匹配对应的物料行。
- 导出图片:根据物料信息命名图片文件,保存到指定目录。
代码示例
LOCAL loExcel, loWorkbook, loSheet, loShape LOCAL lnShapeRow, lnItemRow, lcItemCode, lnPicIndex, lcSaveDir * 图片保存目录,提前创建好或者让代码自动创建 lcSaveDir = "D:\物料图片\" IF NOT DIRECTORY(lcSaveDir) MD (lcSaveDir) ENDIF * 启动Excel并打开文件 loExcel = CREATEOBJECT("Excel.Application") loExcel.Visible = .F. && 后台运行,不显示Excel界面 loWorkbook = loExcel.Workbooks.Open("D:\你的物料清单.xlsx") && 替换成你的Excel文件路径 loSheet = loWorkbook.Sheets(1) && 假设图片在第一个工作表 * 遍历所有形状(包含图片) FOR EACH loShape IN loSheet.Shapes * 获取图片左上角所在的行号 lnShapeRow = loShape.TopLeftCell.Row * 根据你的文档结构计算对应的物料行:每个物料占1行,图片占3行,每4行为一组 lnItemRow = lnShapeRow - MOD(lnShapeRow - 1, 4) * 获取物料编号(假设物料编号在A列,可根据实际调整列号) lcItemCode = loSheet.Cells(lnItemRow, 1).Value IF NOT EMPTY(lcItemCode) * 计算该物料下的图片序号(1-3) lnPicIndex = lnShapeRow - lnItemRow * 生成保存路径和文件名 lcSavePath = lcSaveDir + ALLTRIM(lcItemCode) + "_图片" + TRANSFORM(lnPicIndex) + ".png" * 导出图片,2代表PNG格式,1=GIF,3=JPEG,可按需替换 loShape.Export(lcSavePath, 2) ? "已保存图片:" + lcSavePath ENDIF ENDFOR * 清理资源 loWorkbook.Close(.F.) && 不修改原Excel文件,直接关闭 loExcel.Quit() RELEASE loShape, loSheet, loWorkbook, loExcel MESSAGEBOX("图片导出完成!", 0+64)
注意事项
- 确保你的Excel文件在运行代码前是关闭状态,避免OLE连接冲突。
- 如果你的物料和图片的行结构不是每4行一组(比如物料行是N,图片行是N+1到N+3),可以调整
lnItemRow的计算逻辑,比如如果物料行是连续的,图片紧跟在物料行下方3行,那么可以用你已保存的物料文本数据中的行号来匹配(比如你已经存了每个物料对应的Excel行号,就用那个行号来关联图片行)。 - 若遇到导出失败的情况,检查图片是否是特殊嵌入类型,部分特殊对象可能需要用
CopyPicture配合剪贴板保存,但大部分普通图片用Export就足够了。
内容的提问来源于stack exchange,提问作者user1603827
相关产品推荐
相关产品推荐

