news 2026/3/22 19:25:56

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/3/19 4:08:08

2026 为 npm、yarn 和 pnpm 设置淘宝镜像源

为 npm、yarn 和 pnpm 设置淘宝镜像源,最直接的方法是使用它们各自的命令。以下是淘宝最新镜像地址和对应的设置方法:最新镜像地址: 截至2026年1月,淘宝 npm 镜像的官方最新域名为 https://registry.npmmirror.com。一些旧资料中提…

作者头像 李华
网站建设 2026/3/13 14:08:05

卫健委医院运营与财务智能分析平台建设方案

一、项目背景与必要性随着医药卫生体制改革的深入推进和公立医院高质量发展要求的提出,对医疗卫生机构的精细化管理和运营效率提出了更高要求。市卫健委通常下辖多家医院,其运营状况、财务健康度直接关系到市医疗卫生服务的有效供给和可持续发展。目前&a…

作者头像 李华
网站建设 2026/3/16 3:57:05

文件脱敏程序设计思路

文件脱敏的核心是:识别敏感信息 → 生成可追溯的替换结果 → 保持文件可用性(格式/结构不破坏)→ 输出合规审计证据。下面给你一套可落地的设计框架。1) 先定“脱敏目标与边界”(否则做不准) 1.1 明确敏感信息范围&…

作者头像 李华
网站建设 2026/3/20 23:40:56

亲测Meta-Llama-3-8B-Instruct:8K上下文对话效果超出预期

亲测Meta-Llama-3-8B-Instruct:8K上下文对话效果超出预期 1. 引言:为何选择 Meta-Llama-3-8B-Instruct? 在当前开源大模型快速迭代的背景下,如何在有限算力条件下实现高质量的对话与指令执行能力,成为个人开发者和中…

作者头像 李华
网站建设 2026/3/13 23:26:43

APP/小程序个人信息保护合规自查手册(附整改方案)

本指南基于《中华人民共和国个人信息保护法》《数据安全法》《网络安全法》《常见类型App必要个人信息范围规定》及GB/T 35273-2020《个人信息安全规范》等核心法规标准,结合2025-2026年监管执法趋势(如常态化专项整治、跨境数据监管收紧、AI应用数据合规…

作者头像 李华