如何用Python解析Office Open XML (XLSX)文件

来源:AI技术网作者:北京网站建设头衔:草根站长
导读:本期聚焦于小伙伴创作的《如何用Python解析Office Open XML (XLSX)文件》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何用Python解析Office Open XML (XLSX)文件》有用,将其分享出去将是对创作者最好的鼓励。

Office Open XML格式的XLSX文件本质是遵循特定规范的ZIP压缩包,内部包含多个XML文件,分别存储工作表、单元格数据、样式、共享字符串等内容。使用Python解析XLSX文件有两种常见思路,一种是借助成熟的第三方库快速实现,另一种是手动解压后解析内部XML文件。

如何用Python解析Office Open XML (XLSX)文件

XLSX文件的基本结构

将XLSX文件的后缀名修改为zip后解压,可以看到以下核心目录和文件:

  • _rels目录:存储文件关系配置
  • xl目录:核心内容目录,包含worksheets(工作表目录)、sharedStrings.xml(共享字符串)、styles.xml(样式配置)等文件
  • [Content_Types].xml:记录所有文件的内容类型

其中单元格的文本内容如果长度超过一定阈值,会被存储到sharedStrings.xml中,工作表的XML文件只存储对应的索引,解析时需要做映射处理。

使用openpyxl库解析XLSX

openpyxl是Python中专门处理XLSX文件的第三方库,支持读取和写入XLSX格式,使用起来非常简单。首先需要安装该库:

pip install openpyxl

读取工作表数据

以下是读取XLSX文件中所有工作表数据的示例代码:

import openpyxl

# 加载XLSX文件
workbook = openpyxl.load_workbook("test.xlsx")
# 获取所有工作表名称
sheet_names = workbook.sheetnames
print("所有工作表名称:", sheet_names)

# 遍历每个工作表读取数据
for sheet_name in sheet_names:
    sheet = workbook[sheet_name]
    print(f"工作表 {sheet_name} 的数据:")
    # 遍历行,min_row和max_row指定行范围,values_only=True直接获取单元格值
    for row in sheet.iter_rows(min_row=1, max_row=sheet.max_row, values_only=True):
        print(row)

读取指定单元格内容

如果需要读取指定单元格的内容,可以通过单元格坐标直接获取:

import openpyxl

workbook = openpyxl.load_workbook("test.xlsx")
# 获取第一个工作表
sheet = workbook.active
# 读取A1单元格的内容
cell_value = sheet["A1"].value
print("A1单元格内容:", cell_value)
# 也可以通过行号和列号读取,行号和列号从1开始
cell_value2 = sheet.cell(row=2, column=3).value
print("第2行第3列单元格内容:", cell_value2)

手动解压解析XLSX内部XML

如果不想依赖第三方库,也可以手动解压XLSX文件后解析内部XML内容,这种方式更灵活,适合需要自定义解析逻辑的场景。

解压XLSX文件

使用Python的zipfile模块可以解压XLSX文件:

import zipfile

xlsx_path = "test.xlsx"
extract_path = "xlsx_extract"
with zipfile.ZipFile(xlsx_path, "r") as zip_ref:
    zip_ref.extractall(extract_path)
print("解压完成,文件存放在:", extract_path)

解析共享字符串和工作表数据

首先解析sharedStrings.xml获取所有共享字符串,再解析工作表XML获取单元格对应的字符串索引,最后映射得到实际内容:

import xml.etree.ElementTree as ET

# 解析共享字符串
shared_strings_path = "xlsx_extract/xl/sharedStrings.xml"
tree = ET.parse(shared_strings_path)
root = tree.getroot()
# 命名空间,XLSX的XML文件通常带有默认命名空间
ns = {"ns": "http://schemas.openxmlformats.org/spreadsheetml/2006/main"}
shared_strings = []
# 遍历所有si节点,获取文本内容
for si in root.findall("ns:si", ns):
    text = ""
    for t in si.findall("ns:t", ns):
        text += t.text if t.text else ""
    shared_strings.append(text)

# 解析第一个工作表
sheet_path = "xlsx_extract/xl/worksheets/sheet1.xml"
sheet_tree = ET.parse(sheet_path)
sheet_root = sheet_tree.getroot()
# 遍历行节点
for row in sheet_root.findall("ns:sheetData/ns:row", ns):
    row_data = []
    # 遍历行内的单元格节点
    for cell in row.findall("ns:c", ns):
        cell_type = cell.get("t")
        value_node = cell.find("ns:v", ns)
        if value_node is None:
            row_data.append(None)
            continue
        cell_value = value_node.text
        # 如果单元格类型是s,说明是共享字符串索引,需要映射
        if cell_type == "s" and cell_value:
            idx = int(cell_value)
            row_data.append(shared_strings[idx])
        else:
            row_data.append(cell_value)
    print(row_data)

两种方式的对比

两种方式各有适用场景,具体差异如下:

解析方式优点缺点适用场景
使用openpyxl库使用简单,无需处理底层XML结构,支持读写操作需要安装第三方库,自定义解析逻辑较麻烦快速实现XLSX文件的读写,常规数据处理场景
手动解析XML无第三方依赖,可自定义解析规则,灵活度高需要处理命名空间、共享字符串等细节,开发成本高对解析逻辑有特殊要求,或者无法安装第三方库的场景

在实际开发中,优先推荐使用openpyxl库,能够快速满足大部分XLSX解析需求,只有在特殊场景下才考虑手动解析内部XML的方式。

PythonXLSXOffice_Open_XMLopenpyxl修改时间:2026-07-16 17:54:32

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。