You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python提取XLSX表格中嵌入图片的关联URL?

可以用Python实现,提供两种可行方案:

方案一:使用win32com操作Excel对象模型(Windows环境)

Excel中图片关联的超链接存储在工作表的Shape对象中,通过pywin32库可直接访问Excel的COM对象提取:

  1. 先安装依赖:
pip install pywin32
  1. 示例代码:
import win32com.client as win32
from win32com.client import constants

excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = False  # 后台运行不打开Excel窗口

workbook = excel.Workbooks.Open(r'你的Excel文件路径.xlsx')

for sheet in workbook.Sheets:
    print(f"工作表:{sheet.Name}")
    for shape in sheet.Shapes:
        # 判断当前Shape是否为图片
        if shape.Type == constants.msoPicture:
            if shape.Hyperlink is not None:
                print(f"图片名称:{shape.Name},关联URL:{shape.Hyperlink.Address}")
            else:
                print(f"图片名称:{shape.Name},无关联URL")

workbook.Close(SaveChanges=False)
excel.Quit()

方案二:直接解析Excel的XML结构(跨平台)

.xlsx本质是压缩包,内部的绘图XML文件(路径通常为xl/drawings/drawingN.xml)存储了图片与超链接的关联关系,可通过解压+XML解析实现:

  1. 先安装依赖:
pip install lxml
  1. 示例代码:
import zipfile
from lxml import etree

with zipfile.ZipFile('你的Excel文件路径.xlsx', 'r') as zf:
    # 遍历所有绘图XML文件
    for filename in zf.namelist():
        if filename.startswith('xl/drawings/') and filename.endswith('.xml'):
            with zf.open(filename) as f:
                tree = etree.fromstring(f.read())
                # 定义XML命名空间
                ns = {
                    'xdr': 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing',
                    'a': 'http://schemas.openxmlformats.org/drawingml/2006/main'
                }
                # 查找所有带超链接的图片形状
                for pic in tree.xpath('//xdr:pic', namespaces=ns):
                    hyperlink = pic.xpath('.//xdr:hyperlink/@r:id', namespaces={**ns, 'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'})
                    if hyperlink:
                        # 从关系文件中获取实际URL
                        rel_filename = f"xl/drawings/_rels/{filename.split('/')[-1]}.rels"
                        if rel_filename in zf.namelist():
                            with zf.open(rel_filename) as rel_f:
                                rel_tree = etree.fromstring(rel_f.read())
                                url = rel_tree.xpath(f"//r:Relationship[@Id='{hyperlink[0]}']/@Target", namespaces={'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'})
                                if url:
                                    print(f"图片关联URL:{url[0]}")

注意:方案二需要处理Excel内部的关系文件(.rels),不同Excel文件的绘图文件命名可能有差异(如drawing1.xml、drawing2.xml),需根据实际情况调整。

内容的提问来源于stack exchange,提问作者Sharp Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 01:17:04