news 2026/6/10 17:33:23

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/6/10 8:01:15

2025年AI工厂与物理AI的技术创新全景

2025年是开发者与研究人员运用相关技术的又一个里程碑之年。数据中心供电与计算设计、AI基础设施、模型优化、开源模型、AI智能体以及物理AI领域的进展,重新定义了智能系统的训练、部署方式及其向现实世界的迁移。以下内容重点介绍了最受读者关注的创新技术。 数据中…

作者头像 李华
网站建设 2026/6/10 7:54:46

【课程设计/毕业设计】基于微信小程序的话剧票务管理系统基于springboot+微信小程序的话剧票务管理系统【附源码、数据库、万字文档】

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

作者头像 李华
网站建设 2026/6/10 7:59:26

【读书笔记】《日常生活中的自我呈现》

《日常生活中的自我呈现》书籍解读整理 这是一本由加拿大社会学家欧文戈夫曼(Erving Goffman)撰写的经典著作,将戏剧表演框架引入社会学分析,提出“拟剧论”(dramaturgical analysis)。戈夫曼认为&#xff…

作者头像 李华
网站建设 2026/6/10 3:33:18

避坑指南:Open Interpreter本地AI编程常见问题全解

避坑指南:Open Interpreter本地AI编程常见问题全解 1. 引言:为什么选择本地化AI编程? 随着大模型技术的普及,开发者对数据隐私、执行效率和系统可控性的要求日益提升。将AI代码生成能力部署在本地,已成为越来越多技术…

作者头像 李华
网站建设 2026/6/10 8:02:20

免费查文献的网站推荐:实用资源汇总与使用指南

做科研的第一道坎,往往不是做实验,也不是写论文,而是——找文献。 很多新手科研小白会陷入一个怪圈:在知网、Google Scholar 上不断换关键词,结果要么信息过载,要么完全抓不到重点。今天分享几个长期使用的…

作者头像 李华
网站建设 2026/6/10 9:26:10

Meta-Llama-3-8B-Instruct一键部署:open-webui可视化界面教程

Meta-Llama-3-8B-Instruct一键部署:open-webui可视化界面教程 1. 引言 随着大语言模型在对话理解、指令遵循和多任务处理能力上的持续进化,本地化部署高性能开源模型已成为开发者和研究者的刚需。Meta于2024年4月发布的Meta-Llama-3-8B-Instruct&#…

作者头像 李华