news 2026/5/1 6:53:22

Python 解析 Excel 图表(Chart)信息实战:从 xlsx 中提取标题、字体和数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 解析 Excel 图表(Chart)信息实战:从 xlsx 中提取标题、字体和数据

摘要

在数据分析与报表自动化场景中,Excel 图表往往承载着关键业务信息,但常规库对图表结构与样式的解析能力有限。本文基于 OpenXML 规范,通过将 .xlsx 文件视为 ZIP 压缩包,直接解析 xl/charts/chart*.xml,实现了对 Excel 图表元数据的精准提取。使用 Python 的 urllib、zipfile 与 xml.etree.ElementTree,完整获取了图表标题、系列名称、X/Y 轴数据,以及标题、坐标轴和数据系列的字体与字号信息。实践结果表明,该方法无需依赖 Excel 环境,适用于线上 Excel 文件解析、图表规范校验及报表自动化处理,为 Excel 图表的深度解析与二次利用提供了一种高效可行的技术方案。

一、背景介绍

在实际项目中,我们经常会遇到这样的需求:

  • 线上 Excel 文件(HTTP 地址)

  • 不关心单元格数据,而是需要:

    • 图表标题
    • 系列名称
    • X / Y 轴数据
    • 图表、坐标轴、系列的字体和字号

然而,openpyxl等库并不能完整解析 Excel 图表的样式和结构

事实上,.xlsx本质上是一个ZIP 压缩包,图表信息存储在:

xl/charts/chart*.xml

只要我们直接解析这个 XML,就能拿到几乎全部图表元数据。


二、整体思路

技术路线

  1. 通过urllib下载 Excel 文件

  2. 使用ZipFile读取 xlsx 内部结构

  3. 定位xl/charts/chart1.xml

  4. 使用xml.etree.ElementTree解析图表 XML

  5. 按 OpenXML 规范解析:

    • 标题(title)
    • 系列(ser)
    • 分类轴(catAx)
    • 数值轴(valAx)
    • 字体、字号
    • X / Y 轴数据

三、核心代码实现

1️⃣ 完整函数代码

importxml.etree.ElementTreeasETfromzipfileimportZipFileimportioimporturllib.requestdefget_chat_info(direct_link):result={}res={}try:# 下载 Excel 文件file=urllib.request.urlopen(direct_link).read()archive=ZipFile(io.BytesIO(file))try:# 读取图表 XMLdata=archive.read('xl/charts/chart1.xml')res['code']=200res['msg']="获取图表信息成功"tree=ET.parse(io.BytesIO(data))root=tree.getroot()# 命名空间ns={'c':'http://schemas.openxmlformats.org/drawingml/2006/chart','a':'http://schemas.openxmlformats.org/drawingml/2006/main'}# ================== 图表标题 ==================title_element=root.find('.//c:title/c:tx/c:rich',ns)iftitle_elementisnotNone:title_text=""fortintitle_element.iter('{http://schemas.openxmlformats.org/drawingml/2006/main}t'):title_text+=t.text result['title']=title_text title_ax_element=root.find('.//c:chart/c:title/c:tx',ns)iftitle_ax_elementisnotNone:tx_pr=title_ax_element.find('.//a:defRPr',ns)iftx_prisnotNone:latin=tx_pr.find('.//a:latin',ns)result['title_font']=latin.get('typeface')iflatinisnotNoneelse"no"result['title_size']=tx_pr.get('sz')or"no"# ================== 系列名称 ==================ser_elements=root.findall('.//c:chart/c:plotArea/*/c:ser',ns)series_name=""forserinser_elements:v=ser.find('.//c:v',ns)ifvisnotNone:series_name=v.text result['series_name']=series_name# ================== X / Y 数据 ==================x_values,y_values=[],[]fornum_refinroot.findall('.//c:numRef',ns):forvinnum_ref.findall('.//c:v',ns):y_values.append(v.text)forptinroot.findall('.//c:cat/c:strRef/c:strCache/c:pt',ns):v=pt.find('.//c:v',ns)ifvisnotNone:x_values.append(v.text)result['x_values']=x_values result['y_values']=y_values# ================== 数值轴 ==================val_ax=root.find('.//c:valAx',ns)ifval_axisnotNone:tx_pr=val_ax.find('.//c:txPr/a:p/a:pPr/a:defRPr',ns)iftx_prisnotNone:latin=tx_pr.find('.//a:latin',ns)result['valAx_font']=latin.get('typeface')iflatinisnotNoneelse"no"result['valAx_size']=tx_pr.get('sz')or"no"# ================== 分类轴 ==================cat_ax=root.find('.//c:catAx',ns)ifcat_axisnotNone:tx_pr=cat_ax.find('.//c:txPr/a:p/a:pPr/a:defRPr',ns)iftx_prisnotNone:latin=tx_pr.find('.//a:latin',ns)result['catAx_font']=latin.get('typeface')iflatinisnotNoneelse"no"result['catAx_size']=tx_pr.get('sz')or"no"# ================== 系列字体 ==================ser=root.find('.//c:chart/c:plotArea/*/c:ser',ns)ifserisnotNone:tx_pr=ser.find('.//a:defRPr',ns)iftx_prisnotNone:latin=tx_pr.find('.//a:latin',ns)result['ser_font']=latin.get('typeface')iflatinisnotNoneelse"no"result['ser_size']=tx_pr.get('sz')or"no"res['data']=resultexcept:res['code']=404res['msg']="未找到图表信息"except:res['code']=500res['msg']="未获取excel信息"returnres

四、测试示例

aa=get_chat_info("http://192.168.31.161:8080/555.xlsx")print(aa)

五、运行结果示例

{"code":200,"msg":"获取图表信息成功","data":{"title":"各季度采购合理性折线图","title_font":"宋体","title_size":"1200","series_name":"采购合理性","x_values":["2018-1","2018-2","2018-3","2018-4","Jan-19","2019-2","2019-3","2019-4","2020-1","2020-2","2020-3","2020-4","2021-1","2021-2","2021-3","2021-4","2022-1","2022-2","2022-3","2022-4"],"y_values":["0.99","0.92","0.91","0.37","0.85","0.97","0.8","0.88","0.67","0.91","0.76","0.75","0.99","0.95","0.89","0.83","0.44","0.75","0.94","0.41"],"valAx_font":"宋体","valAx_size":"1000","catAx_font":"宋体","catAx_size":"1000","ser_font":"宋体","ser_size":"1000"}}

六、关键知识点总结

.xlsx是 ZIP 文件
✅ 图表数据在xl/charts/chart*.xml
✅ Excel 图表完全遵循OpenXML 规范
✅ 字体大小单位为1/100 磅(pt)

  • 1000 = 10pt
  • 1200 = 12pt

七、适用场景

  • 自动化审计 Excel 报表
  • 图表规范校验(字体 / 标题 / 数据完整性)
  • Excel → 图表数据 → Web 可视化
  • 报表 AI / LLM 解析前的数据结构化

文章关联

Python 使用 openpyxl 从 URL 读取 Excel 并获取 Sheet 及单元格样式信息

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 5:10:44

GESP认证C++编程真题解析 | 202403 一级

​欢迎大家订阅我的专栏:算法题解:C与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选…

作者头像 李华
网站建设 2026/4/30 17:10:56

基于区块链的虚拟电厂运营平台建设方案:“区块链+虚拟电厂”模式、平台集成数据监控、负荷预测、储能调控等八大功能

本项目基于区块链技术构建虚拟电厂运营平台,聚合工业企业与园区分布式资源,通过智能调度与需求响应提升电网调节能力。平台集成数据监控、负荷预测、储能调控等八大功能,实现能源优化与可信交易,促进清洁能源消纳,降低…

作者头像 李华
网站建设 2026/5/1 5:10:44

计算机小程序毕设实战-基于nodejs+微信小程序的智能垃圾分类和回收系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/22 6:29:43

Python就业前景好不好?

Python凭借“低门槛广应用”的双重优势,成为当下最具竞争力的编程语言之一。它覆盖数据分析、AI研发、Web开发等多个热门赛道,那么学Python就业前景好吗?以下是详细内容介绍。Python语言具有简单易学、代码可读性高、应用广泛等特点,使其成为…

作者头像 李华
网站建设 2026/4/29 4:29:19

Python编程最好的就业方向是什么?

Python的就业表现一直稳居编程语言第一梯队,凭借场景广、门槛低的优势成为求职热门。它覆盖AI、数据分析、Web 开发等多个高薪赛道,岗位需求年均增长显著,应届生与转行人群都能找到适配机会。那么Python编程最好的就业方向是什么?请看下文。…

作者头像 李华
网站建设 2026/4/30 23:04:22

Linux文件权限777和755的区别!

Linux 文件权限是系统安全的核心基石,它通过严格的权限划分,决定了不同用户、用户组对文件和目录的访问、修改、执行权限,直接关系到系统的稳定性与数据安全。那么Linux文件权限777和755的区别是什么?请看下文。Linux文件权限使用三位数字来…

作者头像 李华