这是我的日更第16天
阅读大概需要9分钟
希望这个文章可以给您带来帮助
在技术支持的过程中,总是有人问以下几个问题
目录如下,按需阅读:
Excel怎么填充图片?
Excel中的图片怎么导出?
图片已经下载好了 如何嵌入?
如何把浮动图片转为嵌入呢?
今天我们就来解决这个问题~~~ 文章比较长 耐心阅读
Excel怎么填充图片?我们要知道我们填充图片其实是有指令的,不过这个指令填充的是浮动图片不是嵌入图片
解决方法如下
填充的浮动图片
使用官方自定义指令就可以
图片
填充的嵌入图片
方法1利用WPS新特性实现
这里是效果展示
图片
这里是指令搭建展示
图片
代码块是用来将剪切板内容粘贴到表格中的
图片
代码如下import win32com.client as win32excel = win32.GetActiveObject("Excel.Application")wb = excel.ActiveWorkbooksheet = wb.ActiveSheetsheet.Paste()
需要实现这个功能需要配置wps的设置
本次效果实现借助的是WPS最新版本中新特性所带来的功能,下图所示哟
图片
借助这个新特性那我们就可以使用影刀指令中选择指定区域,然后将图片文件置予剪切板中,再通过Python代码将剪切板图片粘贴到表格中,最终实现直接嵌入图片啦,而且它可以实现一次性粘贴多张图片哟,多张图片粘贴方式是按列从上到下
WPS新特性打开具体方法:文件 > 选项 > 新特性 > 粘贴设置 > 勾选"粘贴图片时,嵌入选中单元格格"
WPS最新版本下载地址:WPS WIN X64 官网下载就可以
图片已经下载好了 如何嵌入?如果图像已经下载好了本地其实可以有很多办法解决
方法1 利用excel公式解决
二、实现方法。
1、整理图片。
图片
图片中的名称要和工作表中相应的字段进行对应,本示例中照片的名称为本文姓名字段。
2、设置目标单元格。
图片
方法:
1、选中目标单元格。
2、输入:="<table><img src=""H:\Excel函数公式\8.6 批量插入对应名称的图片\照片\"&B3&".jpg""width=""140""height=""160"">",其中B3为姓名所在的单元格地址。
3、复制单元格。
4、在新建的TXT文档中进行粘贴。
3、选择性粘贴,批量填充照片。
方法2 利用vba 代码解决
vba还是很牛的~~ 不过这个需要一定逻辑思维
我是先录制出来的脚本,在改里面的参数 实现的
视频教学
https://www.bilibili.com/video/BV1r54y1w7Ei/?spm_id_from=333.999.0.0
备注 前提 必须先调整好单元格大小在插入且要和代码中长宽一致,还有就是图片文件名和单元格文字一一对应
需要修改的参数
循环的区域
写入的列位置
文件夹的位置
文件名字的后缀
图片的高度和宽带
Sub 批量插入嵌入图片() On Error Resume Next Dim c As Range, i As Integer For Each c In Range("A1:A4") Range("b" & c.Row).Select ActiveSheet.Pictures.Insert("D:\桌面\图片批量插入\" & c.Value & ".png").Select Selection.Placement = xlMoveAndSize Selection.ShapeRange.Height = 170.0787401575 Selection.ShapeRange.Width = 170.0787401575 Application.CommandBars("Format Object").Visible = False NextEnd Sub
图片
Excel中的图片怎么导出?如何导出浮动图片?
可以利用自定义指令中导出单元格图片
图片
如何导出嵌入图片?
图片
解决方案1:
ps:这个方案虽然可以一次性导出,但是无法和Excel行对应,从而无法进行重命名。
1、 我们找到有图片的EXCEL表格,把后缀名更改为压缩包的后缀名“zip”。
图片
2、 更改后缀名后双击 打开,会出现压缩包的页面,找到XL文件夹
3、 打开XL文件夹后,找到media文件夹
4、 可以看到excel表格里面所有的图片全部在media文件夹里
图片
解决方案2 模拟人工导出 不推荐:
先转换成浮动式图片,可以用选中区域的指令选中图片所在区域,然后再右击,点击“转为浮动图片”,再用导出图片的指令循环导出。
图片
解决方案3 利用公式规律实现:
如图,嵌入到单元格的图片,实际上是对应了一个公式,可以看到公式内有一个ID,或许可以从这个ID入手。
图片
我用影刀读取单元格内容发现确实也是一个公式
图片
我们要知道,xlsx其实是一个压缩文件,我们可以解压缩看到里面的东西。
图片
在这个路径下可以找到Excel文件内的图片文件:工作簿1\xl\media
图片
但是这里图片文件名与公式中的ID不一致,需要找到对应关系。
1、找对应关系:
在“工作簿1\xl\cellimages.xml”这个文件里可以看到ID对应了一个rId
图片
在“工作簿1\xl\_rels\cellimages.xml.rels”这个文件里可以看到rId对应了一个图片路径
图片
看到这里,可以得到公式里的ID与图片路径的映射关系:ID-->rId-->图片路径
根据映射关系提取图片并重命名为公式中的ID
最后,用代码解析文件,获得映射关系字典,把“工作簿1\xl\media”中的图片重命名为公式中的ID,保存至一个图片文件夹内,待使用。
图片
这样,公式与图片就直接对应上了,后续需要如何处理图片就可以很方便地操作了。
实现如下
创建daotu.py文件 把下面代码拷贝替换
import osimport zipfileimport shutilimport xml.etree.ElementTree as ETimport re"""功能:提取xlsx文件中的图片,以ID命名,保存到指定文件夹中参数:file_path : xlsx文件路径 save_image_path : 保存图片的文件夹路径"""import xbotfrom xbot import print, sleepfrom .import packagefrom .package import variables as glvdef main(args): pass# 创建一个临时文件夹def create_temp_folder(path): """ 根据传入的文件路径,在文件所在文件夹目录下创建一个临时文件夹 :param path: xlsx文件路径 :return: 临时文件夹路径 """ temp_folder = os.path.dirname(path) + "\\临时文件夹" try: os.mkdir(temp_folder) print(f"{temp_folder}文件夹创建成功。") return temp_folder except FileExistsError: print(f"{temp_folder}文件夹已存在。") return temp_folder# 解压缩def extract_file(file_path, target_path): with zipfile.ZipFile(file_path, 'r') as zip_ref: zip_ref.extractall(target_path) return target_path# 提取xml中第2个标签内容,生成命名空间字典def extract_name_space(xml_path): with open(xml_path, "r") as file: xml_content = file.read() pattern = r"<.*?>" matches = re.findall(pattern, xml_content) pattern = r'\w*?=".*?"' name_spaces = re.findall(pattern, matches[1]) name_space = {} for i in name_spaces: key, value = i.split("=") # print(key, value) name_space[key] = value.replace('"', "") # print(name_space) return name_space# 解析cellimages_xml文件中的映射关系,rID-->IDdef extract_attributes(cellimages_xml_path, namespaces): with open(cellimages_xml_path, 'r', encoding='utf-8') as file: xml_content = file.read() # print(xml_content) xml_to_dict = {} root = ET.fromstring(xml_content) # 查找所有的xdr:pic节点 pic_elements = root.findall('.//xdr:pic', namespaces) for pic_element in pic_elements: # 在每个xdr:pic内查找xdr:cNvPr节点并提取name属性 cNvPr_element = pic_element.find('.//xdr:cNvPr', namespaces) if cNvPr_element is not None: name = cNvPr_element.get('name') # 同样在xdr:pic内查找a:blip节点并提取r:embed属性 blip_element = pic_element.find('.//a:blip', namespaces) if blip_element is not None: r_embed = blip_element.get("{" + namespaces['r'] + "}" + "embed") xml_to_dict[r_embed] = name # print(f"cNvPr name: {name}, a:blip r:embed: {r_embed}") # print(xml_to_dict) return xml_to_dict# 解析cellimages_xml_rels文件中的映射关系,rID-->image_indexdef extract_attributes_rels(cellimages_xml_rels_path, namespaces): with open(cellimages_xml_rels_path, 'r', encoding='utf-8') as file: xml_content = file.read() # print(xml_content) xml_rels_to_dict = {} root = ET.fromstring(xml_content) # 查找所有的Relationship节点 pic_elements = root.findall('.//xmlns:Relationship', namespaces) for element in pic_elements: rID = element.get('Id') image_index = str(element.get('Target')).replace("media/image", '').replace(".png", '') xml_rels_to_dict[rID] = image_index # print(xml_rels_to_dict) return xml_rels_to_dict# 构建image_index和ID的映射关系def creat_imageindex_to_ID_dict(xml_to_dict, xml_rels_to_dict): imageindex_to_ID_dict = {} for key_rID, value_ID in xml_to_dict.items(): image_index = xml_rels_to_dict[key_rID] imageindex_to_ID_dict[image_index] = value_ID return imageindex_to_ID_dict# 将图片文件根据image_index和ID的映射关系重命名,并移动到指定文件夹中def rename_move_image(imageindex_to_ID_dict, media_path, save_image_path): # 遍历映射关系字典,重命名文件并移动 for image_index, name in imageindex_to_ID_dict.items(): image_path = media_path + "\\image" + image_index + ".png" new_image_path = media_path + "\\" + name + ".png" move_to_path = save_image_path + "\\" + name + ".png" os.rename(image_path, new_image_path) shutil.move(new_image_path, move_to_path) print(f"{image_path}重命名并移动文件至:{move_to_path}")# 主函数def 导出图片(file_path, save_image_path): ''' 参数: file_path : Excel文件路径 save_image_path : 存放图片的文件夹路径 ''' # 初始化,创建临时文件夹,将xlsx文件解压至临时文件夹中 temp_folder = create_temp_folder(file_path) # 创建临时文件夹 extract_file(file_path, temp_folder) # 解压xlsx文件 # 定义几个要用到的文件夹路径 media_path = temp_folder + "\\xl\\media" # 解压后的图片文件夹 cellimages_xml_path = temp_folder + "\\xl\\cellimages.xml" # xml文件,内有ID_与rID的映射关系 cellimages_xml_rels_path = temp_folder + "\\xl\\_rels\\cellimages.xml.rels" # xml文件,内有imageIndex_与rID的映射关系 # 提取cellimages_xml的命名空间字典 name_space = extract_name_space(cellimages_xml_path) print("提取cellimages_xml的命名空间字典") # 读取cellimages_xml文件,得到映射关系字典rID-->image_index mapping_dict = extract_attributes(cellimages_xml_path, name_space) print("读取cellimages_xml文件,得到映射关系字典rID-->image_index") # 提取cellimages_xml_rels的命名空间字典 name_space_rels = extract_name_space(cellimages_xml_rels_path) print("提取cellimages_xml_rels的命名空间字典") # 读取cellimages_xml_rels文件,得到映射关系字典rID-->image_index rID_to_image_index_dict = extract_attributes_rels(cellimages_xml_rels_path, name_space_rels) print("读取cellimages_xml_rels文件,得到映射关系字典rID-->image_index") # 创建image_index和ID的映射关系字典 imageindex_to_ID_dict = creat_imageindex_to_ID_dict(mapping_dict, rID_to_image_index_dict) print("创建image_index和ID的映射关系字典") # 重命名、移动图片文件 rename_move_image(imageindex_to_ID_dict, media_path, save_image_path) # 删除临时文件夹 try: shutil.rmtree(temp_folder) print(f"{temp_folder}文件夹删除成功。") except: print("删除临时文件夹失败。")#file_path = r"D:\桌面\文件.xlsx"#save_image_path = r"D:\桌面\文件"#导出图片(file_path, save_image_path)
图片
可视化流程如下
图片
实现效果 图片名字对应excel中公式的id
图片
这个代码我测试过 有用,完整运行
如何把浮动图片转为嵌入呢?有一个悬浮图片的Excel,并且图片是悬浮在需要嵌入的单元格上方的,如图。
图片
思路
模拟输入快捷键+影刀win元素来实现两个关键点
1、模拟人工选中图片并且点击图片嵌入元素
图片
2、点击这个“将全部图片嵌入单元格”
图片
【实现过程】 方法1
实现第一个关键点:模拟人工选中点击图片嵌入图标按钮
图片
思路就是,先批量选中所有的悬浮图片,然后选中其中一个图片。
批量选中所有悬浮图片思路:
在WPS界面按下键盘上的Ctrl+G快捷键唤起定位窗口,然后分别按下快捷键B选中对象和快捷T来定位选中所有的元素。
图片
效果如下:
图片
选中其中一个图片
如何选中其中一个图片呢?很简单,在全选的情况下按下Tab键就可以啦✌
此时就变成了如图样子,这时候,这个嵌入图标按钮就出现啦😆
图片
后面就简单啦,直接捕获这个图标按钮对应的win元素就行啦然后点击😉
图片
实现第二个关键点:点击这个“将全部图片嵌入单元格”
图片
这一步当然我们第一反应就是捕获这个将全部拖嵌入单元格这个元素了,可以我们尝试捕获一下发现这个地方没有办法直接捕获到,如图
图片
那该怎么办呢?
不怕,我们就点击这个元素,但是点击的时候设置一下偏移量就可以啦,如图。
图片
最终流程
图片
注:这里在输入快捷键前一定要激活WPS窗口保证快捷键发送给对应窗口哦👏
运行效果
图片
最后的反思
图片
END关于作者:
持续分享干货,不断授人以渔,不辍收集软件,不停成长进阶,致力成为超有用的号主。全网同名【小可耐教你学RPA】,速来关注,与大家一同快乐成长、努力学习!涉及领域广泛,包括 RPA 技能、生活经验、法律学习、科普文章、自媒体经验、理财知识、保险、人生思考、反赌、反诈骗等。文章更新频率一切随缘。赠人玫瑰,手有余香。爱分享,爱思考。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。