如何用Python的xlwings复制Excel中B列的图片单元格?
解决xlwings无法获取Excel B列内嵌/条件格式图标的问题
你遇到的问题根源在于:ws.pictures只能抓取工作表中独立的浮动图片,而B列的图标大概率是条件格式图标集或单元格内嵌绑定的图标(这类不属于xlwings默认的Picture对象范畴),所以需要通过Excel原生API来操作。
以下分两种场景给出解决方案:
场景1:B列图标是条件格式的图标集
这类图标依附于单元格的条件格式规则,无法直接作为图片对象抓取,需通过复制单元格的方式带出图标:
import os import sys import xlwings as xw path = os.path.abspath(os.path.dirname(sys.argv[0])) fn = os.path.join(path, "Interactive Price List-Schnellstartneu (1).xlsx") wb = xw.Book(fn) ws_source = wb.sheets[0] # 可替换为已存在的目标工作表名称 ws_target = wb.sheets.add("目标工作表") # 遍历B列单元格范围(示例为B1到B100,可根据实际数据范围调整) for row in range(1, 101): source_cell = ws_source.range(f"B{row}") # 检查单元格是否包含条件格式 if source_cell.api.FormatConditions.Count > 0: for fc in source_cell.api.FormatConditions: # Type=3对应图标集类型的条件格式 if fc.Type == 3: # 复制单元格所有内容(包含图标)到目标工作表对应位置 source_cell.copy() ws_target.range(f"B{row}").paste(paste=xw.constants.PasteType.xlPasteAll) # 清除剪贴板状态,避免后续操作异常 xw.apps.active.api.CutCopyMode = False
场景2:B列图标是内嵌绑定到单元格的图片
如果图标是插入后绑定到单元格的普通图片,可通过判断图片的左上角所属列来筛选B列的图片:
import os import sys import xlwings as xw path = os.path.abspath(os.path.dirname(sys.argv[0])) fn = os.path.join(path, "Interactive Price List-Schnellstartneu (1).xlsx") wb = xw.Book(fn) ws_source = wb.sheets[0] ws_target = wb.sheets.add("目标工作表") # 遍历所有图片,筛选出位于B列的图片(B列的列号为2) for pic in ws_source.pictures: if pic.api.TopLeftCell.Column == 2: # 复制图片到目标工作表的对应单元格位置 pic.copy() ws_target.range(pic.api.TopLeftCell.Address).paste()
额外说明
- 若不确定图标类型,可先尝试场景2的代码,如果无法抓取,再用场景1的方法
- 调整单元格范围时,可通过
ws_source.used_range获取实际数据范围,避免遍历过多空单元格
内容的提问来源于stack exchange,提问作者Rapid1898
相关产品推荐
相关产品推荐

