You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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

火山引擎 最新活动