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

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