
本文介绍如何利用 Python 的 zipfile 和 lxml 库,直接解析 Excel .xlsx 文件底层 XML,高效提取形状(如文本框、椭圆)的几何类型、填充色与边框色,无需依赖耗时的 COM 或自动化库。
本文介绍如何利用 python 的 `zipfile` 和 `lxml` 库,直接解析 excel `.xlsx` 文件底层 xml,高效提取形状(如文本框、椭圆)的几何类型、填充色与边框色,无需依赖耗时的 com 或自动化库。
Excel 的 .xlsx 文件本质上是一个 ZIP 压缩包,其中每个工作表对应的形状定义存储在 xl/drawings/drawing*.xml 文件中。这些 XML 遵循 Office Open XML 标准,包含
以下为完整增强版代码,不仅提取形状文本,还同步获取形状类型、填充色(RGB 十六进制值)和边框色:
from zipfile import ZipFile
from lxml import etree
def extract_shapes_with_color(xlsx_path):
ns = {
"xdr": "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing",
"a": "http://schemas.openxmlformats.org/drawingml/2006/main",
"r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships"
}
shapes_info = []
with ZipFile(xlsx_path) as z:
# 定位所有 drawing XML 文件(如 drawing1.xml, drawing2.xml)
drawing_files = [f for f in z.filelist if "drawings/drawing" in f.filename and f.filename.endswith(".xml")]
for drw in drawing_files:
with z.open(drw.filename) as f:
tree = etree.fromstring(f.read())
# 提取文本内容(仅含文本框内可见文字)
texts = tree.xpath('//xdr:txBody[preceding-sibling::xdr:spPr]/a:p/a:r/a:t/text()', namespaces=ns)
# 提取形状属性:几何类型、填充色、边框色(按顺序返回)
# 注意:XPath 使用 | 分隔多个路径,结果为扁平列表
shape_attrs = tree.xpath(
'//xdr:spPr/a:prstGeom/@prst | ' # 预设几何类型,如 'ellipse', 'rect'
'//xdr:spPr/a:solidFill/a:srgbClr/@val | ' # 填充色(RGB 十六进制,如 '729fcf')
'//xdr:spPr/a:ln/a:solidFill/a:srgbClr/@val', # 边框色
namespaces=ns
)
# 按每3个元素一组分组(几何类型、填充色、边框色),与文本一一对应
# 若某形状缺失某属性(如无边框),对应位置为空字符串
for i, text in enumerate(texts):
geom = shape_attrs[i*3] if i*3 <p><strong>输出示例:</strong> </p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/shouce/1658" title="Python对Excel操作详解 中文WORD版"><img
src="https://img.php.cn/upload/manual/000/000/020/170615523764496.png" alt="Python对Excel操作详解 中文WORD版" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/shouce/1658" title="Python对Excel操作详解 中文WORD版" class="overflowclass">Python对Excel操作详解 中文WORD版</a>
<p class="overflowclass">本文档主要介绍如何通过python对office excel进行读写操作,使用了xlrd、xlwt和xlutils模块。另外还演示了如何通过Tcl tcom包对excel操作。感兴趣的朋友可以过来看看</p>
</div>
<a rel="nofollow" href="/xiazai/shouce/1658" title="Python对Excel操作详解 中文WORD版" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><pre class="brush:php;toolbar:false;">Shape 1: 'Text box 2' | Type: rect | Fill: #729FCF | Line: #3465A4
Shape 2: 'Sheet2 ellipse text 3' | Type: ellipse | Fill: #EDD400 | Line: NONE✅ 关键说明与注意事项:
- 颜色格式:a:srgbClr/@val 返回的是不带 # 的 6 位十六进制 RGB 字符串(如 '729fcf'),建议转为大写并加 # 前缀便于 CSS 或可视化使用。
- 属性缺失处理:若形状无填充或无线条,对应 XPath 不会返回值,需用索引边界检查避免 IndexError;本实现采用安全索引 + 默认 "NONE"。
- XPath 可扩展性:除 srgbClr 外,Excel 还支持 hslClr、sysClr 等颜色模型,如需兼容,可扩展 XPath 匹配 //a:srgbClr/@val | //a:hslClr/@hue 等。
- 性能优势:全程纯内存 XML 解析,毫秒级响应,适用于批量处理数百个 Excel 文件的场景。
- 调试技巧:手动解压 .xlsx,用浏览器打开 xl/drawings/drawing1.xml,配合开发者工具“Copy XPath”快速验证路径准确性。
该方法绕过了高层库限制,直击数据源头,是自动化报表分析、模板合规性校验及 UI 元素一致性审计的可靠技术方案。










