如何使用Python将Excel工作表中的图片复制到另一个工作簿?
如何用Python复制Excel工作表中的图片到另一个工作簿?
嘿,这个问题我之前也碰到过!你用的openpyxl默认只复制单元格数据,图片是作为独立的绘图对象存在的,得单独提取和添加到目标工作表里。我帮你修改了代码,加上图片复制的逻辑,一起来看看:
核心思路
图片在openpyxl里存在工作表的_images属性中,我们需要:
- 遍历源工作表的所有图片,提取它们的二进制数据和锚定位置
- 在目标工作表中创建新的图片对象,设置相同的位置,再添加进去
修改后的完整代码
from openpyxl import load_workbook, Workbook from openpyxl.drawing.image import Image from io import BytesIO path1 = "/mnt/e/RecEasy-MVP-Python/FlaskApp/Uploaded_files/" + key print(path1) path2 = "/mnt/e/RecEasy-MVP-Python/FlaskApp/Compiled/" + current_acc_group + "_" + current_gl_account + ".xlsx" print(path2) path_to_key_sheet = "/mnt/e/RecEasy-MVP-Python/FlaskApp/Uploaded_files/" + key + "_key_sheet.txt" print("Path to key sheet file:") print(path_to_key_sheet) # 重要:读取源文件时不能用read_only=True,否则无法访问图片对象 wb1 = load_workbook(filename=path1, data_only=True) # 找到要复制的目标工作表(优化了循环写法) ws1 = None target_sheet_title = str(content_of_key_sheet_file) for sheet in wb1: if sheet.title == target_sheet_title: ws1 = sheet print("Sheet selected") print(sheet.title) break # 处理目标工作簿:如果文件不存在就新建,存在就打开 try: wb2 = load_workbook(path2) except FileNotFoundError: wb2 = Workbook() # 删除默认生成的空Sheet,避免干扰 if "Sheet" in wb2.sheetnames: wb2.remove(wb2["Sheet"]) # 创建目标工作表 ws2 = wb2.create_sheet(ws1.title) print("Copying from the Excel file: " + path1) # 复制单元格内容(保留原有逻辑) for row in ws1: for cell in row: if cell.value is not None: ws2[cell.coordinate].value = cell.value # 新增:复制图片 for img in ws1._images: # 获取图片锚定的单元格位置(比如A1) anchor_cell = img.anchor._from anchor_pos = f"{anchor_cell.col_letter}{anchor_cell.row}" # 提取图片的二进制数据,转为BytesIO流 img_stream = BytesIO(img.image) # 创建新的图片对象,设置位置后添加到目标工作表 new_img = Image(img_stream) new_img.anchor = anchor_pos ws2.add_image(new_img) # 保存最终工作簿 wb2.save(path2)
几个关键注意事项
- 去掉
read_only=True:只读模式下openpyxl不会加载绘图对象,所以必须用普通模式读取源文件 - 锚点位置处理:图片的位置通过
anchor._from获取,确保复制后图片和源工作表在同一个单元格位置 - 目标工作簿初始化:如果目标文件还不存在,要创建新工作簿并删除默认的空Sheet,避免出现多余的工作表
这样修改后,你的程序就能同时复制单元格内容和工作表里的图片啦!
内容的提问来源于stack exchange,提问作者Subhaac




