最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python解析Excel圖表Chart的信息實戰(zhàn)指南

 更新時間:2026年01月19日 09:42:35   作者:weixin_46244623  
在數(shù)據(jù)分析與報表自動化場景中,Excel圖表往往承載著關(guān)鍵業(yè)務(wù)信息,本文將基于OpenXML規(guī)范,通過將.xlsx文件視為ZIP壓縮包,直接解析?xl/charts/chart*.xml,實現(xiàn)了對?Excel?圖表元數(shù)據(jù)的精準(zhǔn)提取,感興趣的小伙伴可以了解下

摘要

在數(shù)據(jù)分析與報表自動化場景中,Excel 圖表往往承載著關(guān)鍵業(yè)務(wù)信息,但常規(guī)庫對圖表結(jié)構(gòu)與樣式的解析能力有限。本文基于 OpenXML 規(guī)范,通過將 .xlsx 文件視為 ZIP 壓縮包,直接解析 xl/charts/chart*.xml,實現(xiàn)了對 Excel 圖表元數(shù)據(jù)的精準(zhǔn)提取。使用 Python 的 urllib、zipfile 與 xml.etree.ElementTree,完整獲取了圖表標(biāo)題、系列名稱、X/Y 軸數(shù)據(jù),以及標(biāo)題、坐標(biāo)軸和數(shù)據(jù)系列的字體與字號信息。實踐結(jié)果表明,該方法無需依賴 Excel 環(huán)境,適用于線上 Excel 文件解析、圖表規(guī)范校驗及報表自動化處理,為 Excel 圖表的深度解析與二次利用提供了一種高效可行的技術(shù)方案。

一、背景介紹

在實際項目中,我們經(jīng)常會遇到這樣的需求:

線上 Excel 文件(HTTP 地址)

不關(guān)心單元格數(shù)據(jù),而是需要:

  • 圖表標(biāo)題
  • 系列名稱
  • X / Y 軸數(shù)據(jù)
  • 圖表、坐標(biāo)軸、系列的字體和字號

然而,openpyxl 等庫并不能完整解析 Excel 圖表的樣式和結(jié)構(gòu)。

事實上,.xlsx 本質(zhì)上是一個 ZIP 壓縮包,圖表信息存儲在:

xl/charts/chart*.xml

只要我們直接解析這個 XML,就能拿到幾乎全部圖表元數(shù)據(jù)。

二、整體思路

技術(shù)路線

1.通過 urllib 下載 Excel 文件

2.使用 ZipFile 讀取 xlsx 內(nèi)部結(jié)構(gòu)

3.定位 xl/charts/chart1.xml

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

5.按 OpenXML 規(guī)范解析:

  • 標(biāo)題(title)
  • 系列(ser)
  • 分類軸(catAx)
  • 數(shù)值軸(valAx)
  • 字體、字號
  • X / Y 軸數(shù)據(jù)

三、核心代碼實現(xiàn)

完整函數(shù)代碼

import xml.etree.ElementTree as ET
from zipfile import ZipFile
import io
import urllib.request

def get_chat_info(direct_link):
    result = {}
    res = {}

    try:
        # 下載 Excel 文件
        file = urllib.request.urlopen(direct_link).read()
        archive = ZipFile(io.BytesIO(file))

        try:
            # 讀取圖表 XML
            data = archive.read('xl/charts/chart1.xml')
            res['code'] = 200
            res['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'
            }

            # ================== 圖表標(biāo)題 ==================
            title_element = root.find('.//c:title/c:tx/c:rich', ns)
            if title_element is not None:
                title_text = ""
                for t in title_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)
            if title_ax_element is not None:
                tx_pr = title_ax_element.find('.//a:defRPr', ns)
                if tx_pr is not None:
                    latin = tx_pr.find('.//a:latin', ns)
                    result['title_font'] = latin.get('typeface') if latin is not None else "no"
                    result['title_size'] = tx_pr.get('sz') or "no"

            # ================== 系列名稱 ==================
            ser_elements = root.findall('.//c:chart/c:plotArea/*/c:ser', ns)
            series_name = ""
            for ser in ser_elements:
                v = ser.find('.//c:v', ns)
                if v is not None:
                    series_name = v.text
            result['series_name'] = series_name

            # ================== X / Y 數(shù)據(jù) ==================
            x_values, y_values = [], []

            for num_ref in root.findall('.//c:numRef', ns):
                for v in num_ref.findall('.//c:v', ns):
                    y_values.append(v.text)

            for pt in root.findall('.//c:cat/c:strRef/c:strCache/c:pt', ns):
                v = pt.find('.//c:v', ns)
                if v is not None:
                    x_values.append(v.text)

            result['x_values'] = x_values
            result['y_values'] = y_values

            # ================== 數(shù)值軸 ==================
            val_ax = root.find('.//c:valAx', ns)
            if val_ax is not None:
                tx_pr = val_ax.find('.//c:txPr/a:p/a:pPr/a:defRPr', ns)
                if tx_pr is not None:
                    latin = tx_pr.find('.//a:latin', ns)
                    result['valAx_font'] = latin.get('typeface') if latin is not None else "no"
                    result['valAx_size'] = tx_pr.get('sz') or "no"

            # ================== 分類軸 ==================
            cat_ax = root.find('.//c:catAx', ns)
            if cat_ax is not None:
                tx_pr = cat_ax.find('.//c:txPr/a:p/a:pPr/a:defRPr', ns)
                if tx_pr is not None:
                    latin = tx_pr.find('.//a:latin', ns)
                    result['catAx_font'] = latin.get('typeface') if latin is not None else "no"
                    result['catAx_size'] = tx_pr.get('sz') or "no"

            # ================== 系列字體 ==================
            ser = root.find('.//c:chart/c:plotArea/*/c:ser', ns)
            if ser is not None:
                tx_pr = ser.find('.//a:defRPr', ns)
                if tx_pr is not None:
                    latin = tx_pr.find('.//a:latin', ns)
                    result['ser_font'] = latin.get('typeface') if latin is not None else "no"
                    result['ser_size'] = tx_pr.get('sz') or "no"

            res['data'] = result

        except:
            res['code'] = 404
            res['msg'] = "未找到圖表信息"

    except:
        res['code'] = 500
        res['msg'] = "未獲取excel信息"

    return res

測試示例

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

四、運行結(jié)果示例

{
  "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"
  }
}

五、關(guān)鍵知識點總結(jié)

.xlsx 是 ZIP 文件

圖表數(shù)據(jù)在 xl/charts/chart*.xml

Excel 圖表完全遵循 OpenXML 規(guī)范

字體大小單位為 1/100 磅(pt)

  • 1000 = 10pt
  • 1200 = 12pt

六、適用場景

  • 自動化審計 Excel 報表
  • 圖表規(guī)范校驗(字體 / 標(biāo)題 / 數(shù)據(jù)完整性)
  • Excel → 圖表數(shù)據(jù) → Web 可視化
  • 報表 AI / LLM 解析前的數(shù)據(jù)結(jié)構(gòu)化

延伸:Python使用openpyxl從URL讀取Excel并獲取單元格樣式

到此這篇關(guān)于Python解析Excel圖表Chart的信息實戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Python解析Excel圖表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python成功解決讀文件出現(xiàn):IOError:?[Errno?0]?Error的錯誤

    Python成功解決讀文件出現(xiàn):IOError:?[Errno?0]?Error的錯誤

    在Python編程中,處理文件是常見的任務(wù)之一,但偶爾也會遇到各種錯誤,包括IOError,盡管Python?3.x中IOError已被OSError和FileNotFoundError等更具體的異常所取代,由于[Errno?0]不直接指向具體的錯誤類型,我們將討論一系列可能導(dǎo)致IOError的常見情況,需要的朋友可以參考下
    2024-07-07
  • 深入理解pytorch庫的dockerfile

    深入理解pytorch庫的dockerfile

    這篇文章主要介紹了pytorch庫的dockerfile,主要包括dockerfile命令,使用指令的注意點及存在的一些問題,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • flask中使用SQLAlchemy進行輔助開發(fā)的代碼

    flask中使用SQLAlchemy進行輔助開發(fā)的代碼

    在Web.py, Django, Flask, Tornado里,自帶的ORM功能比較缺乏,推薦大家使用SQLAlchemy來輔助開發(fā)
    2013-02-02
  • python判斷變量是否為列表的方法

    python判斷變量是否為列表的方法

    在本篇文章里小編給大家整理了關(guān)于python判斷變量是否為列表的方法,有需要的朋友們可以學(xué)習(xí)下。
    2020-09-09
  • Python實現(xiàn)高精度敏感詞過濾

    Python實現(xiàn)高精度敏感詞過濾

    這篇文章主要為大家詳細(xì)介紹了Python中實現(xiàn)高精度敏感詞過濾的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • 修改 CentOS 6.x 上默認(rèn)Python的方法

    修改 CentOS 6.x 上默認(rèn)Python的方法

    這篇文章主要介紹了修改 CentOS 6.x 上默認(rèn)Python的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • Python讀取中文路徑出現(xiàn)亂碼問題的解決方案

    Python讀取中文路徑出現(xiàn)亂碼問題的解決方案

    小編在使用opencv讀取帶有中文路徑的圖片時,發(fā)現(xiàn)會出現(xiàn)亂碼的情況,當(dāng)讀取的文件路徑出現(xiàn)中文時,(文件夾名為中文或者文件為中文)出現(xiàn)錯誤,所以本文給大家介紹了Python讀取中文路徑出現(xiàn)亂碼問題的解決方案,需要的朋友可以參考下
    2024-06-06
  • 使用Python寫個小監(jiān)控

    使用Python寫個小監(jiān)控

    最近使用python寫了個小監(jiān)控,為什么使用python?簡單、方便、好管理,Python如何實現(xiàn)簡單的小監(jiān)控,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Tensorflow 查看變量的值方法

    Tensorflow 查看變量的值方法

    今天小編就為大家分享一篇Tensorflow 查看變量的值方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • python3使用print打印帶顏色的字符串代碼實例

    python3使用print打印帶顏色的字符串代碼實例

    這篇文章主要介紹了python3使用print打印帶顏色的字符串代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08

最新評論

花垣县| 阜康市| 平阴县| 喀什市| 开鲁县| 邹城市| 鹿泉市| 晋中市| 怀宁县| 普兰县| 同仁县| 西丰县| 砚山县| 钦州市| 图片| 盈江县| 三原县| 九江市| 临邑县| 祁阳县| 广昌县| 黑河市| 周至县| 鄂尔多斯市| 望谟县| 绵阳市| 玛曲县| 文山县| 安西县| 盐亭县| 康乐县| 福安市| 青川县| 巍山| 玛多县| 嘉义市| 广东省| 怀来县| 全椒县| 万盛区| 鸡东县|