news 2026/2/7 11:43:13

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/2/4 17:56:12

中式餐品中式菜品食物检测数据集VOC+YOLO格式6928张238类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):6928标注数量(xml文件个数):6928标注数量(txt文件个数):6928标注类别…

作者头像 李华
网站建设 2026/2/3 14:15:59

护网行动入门指南:普通人如何参与并积累实战经验

护网行动入门指南:如何参与并积累实战经验 护网行动是国内最高规格的网络安全实战演练,旨在检验企业、单位的网络安全防御能力,现已成为网络安全领域的“实战练兵场”。对计算机专业学生而言,参与护网行动不仅能积累宝贵的实战经…

作者头像 李华
网站建设 2026/2/3 15:46:15

Spring Boot 实现各种参数校验,写得太好了,建议收藏!

简单使用Java API规范(JSR303)定义了Bean校验的标准validation-api,但没有提供实现。hibernate validation是对这个规范的实现,并增加了校验注解如Email、Length等。Spring Validation是对hibernate validation的二次封装,用于支持spring mvc…

作者头像 李华