Python读取xlsx单元格时保留上下标用于Matplotib绘图的实现求助
问题根因
xlsx文件里的上下标属于单元格内富文本片段级别的格式,不是单元格全局属性。之前的方案读不到对应格式,本质原因各有不同:
- Pandas从设计上就只提取单元格的纯数据值,本身就不做富文本格式的留存,无论怎么调参都无法获取上下标信息
- xlrd开源库目前的版本仅支持提取纯文本,没有实现xlsx富文本的解析逻辑
- 之前用Win32com读不到,通常是仅取了单元格的纯文本值属性,没有触达逐段的字符格式存储层
xlsx格式下的落地实现方案
方案1:用openpyxl直接解析富文本片段(跨平台无依赖)
openpyxl是目前对xlsx富文本支持最完善的Python第三方库,不需要本地安装Office,Windows/macOS/Linux环境都能正常运行。
- 加载文件时必须显式开启
rich_text=True参数,默认关闭该参数时仍然只返回纯文本,这是之前很多人踩过的关键坑 - 每个单元格的富文本会被拆分为多个独立的文本片段(run),每个片段单独存储文本内容、字体格式(含上标/下标的垂直对齐属性)
核心读取代码示例:
from openpyxl import load_workbook # 关键:必须传rich_text=True,否则读不到富文本结构 wb = load_workbook("test.xlsx", rich_text=True) ws = wb.active target_cell = ws["A1"] # 逐段解析格式 parsed_segments = [] for run in target_cell.rich_text: align = run.font.vertAlign if align == "superscript": # 转成Matplotlib支持的上标语法 parsed_segments.append(f"$^{{{run.text}}}$") elif align == "subscript": # 转成Matplotlib支持的下标语法 parsed_segments.append(f"$_{{{run.text}}}$") else: parsed_segments.append(run.text) # 拼接成Matplotlib可直接渲染的完整文本 matplotlib_text = "".join(parsed_segments)
方案2:Win32com按需读取(仅Windows环境适用)
之前Win32com读不到上下标,通常是没有逐段读取字符格式:
- 调用
cell.Characters(Start=索引, Length=长度).Font属性即可逐段获取上标/下标标记 - 缺点是强依赖本地安装的Microsoft Office,跨平台兼容性差,不适合跨设备部署的工具
不依赖Excel的替代输入方案
如果觉得xlsx的富文本解析兼容性成本高,可以换更轻量化的输入存储格式,完全可控且没有解析黑盒:
- 用结构化JSON存储:把输入的文本拆成带格式标记的片段,比如存储结构为
[{"text": "加速度", "style": "normal"}, {"text": "2", "style": "superscript"}],读写全程没有第三方库依赖,格式转换逻辑完全自己掌控 - 用Markdown格式存储:利用Markdown原生的上下标语法(上标
^文本^、下标~文本~)做输入载体,用户输入门槛低,读取时直接转成Matplotlib可识别的LaTeX语法即可,不需要处理复杂的Excel格式兼容问题
内容的提问来源于stack exchange,提问作者Suresh
相关产品推荐
相关产品推荐

