如何用python-docx获取docx文档的ListNumber及段落样式
获取Word段落的列表编号及更多样式信息
我之前也碰到过这个问题!用paragraph.style.name确实拿不到列表相关的“List 1”“List 2”标识,因为Word里的列表段落很多时候是基于Normal样式,只是额外应用了列表格式,而不是直接用名为“List 1”的段落样式。下面分两部分给你解决思路:
一、如何获取列表段落的编号/级别信息
1. 判断段落是否为列表项
首先可以用paragraph.is_list_item来快速判断当前段落是不是列表的一部分:
from docx import Document doc = Document("your_file.docx") for para in doc.paragraphs: if para.is_list_item: # 处理列表段落 pass
2. 获取列表级别(对应List 1/List 2)
如果是列表项,可以通过list_item.level拿到其级别(从0开始计数,0对应List 1,1对应List 2,以此类推):
if para.is_list_item: list_level = para.list_item.level print(f"该段落属于 List {list_level + 1}")
3. 获取实际显示的编号值(比如1、1.1)
Python-docx没有直接提供获取动态生成的编号文本的方法,但可以通过一些方式计算:
- 对于连续的同级别列表,你可以统计同级别段落的索引+1作为编号:
if para.is_list_item: level = para.list_item.level # 筛选所有同级别列表段落 same_level_paras = [p for p in doc.paragraphs if p.is_list_item and p.list_item.level == level] # 当前段落的编号就是索引+1 current_number = same_level_paras.index(para) + 1 print(f"当前编号:{current_number}")
- 如果是多级编号(比如1.1、1.2),需要递归计算父级编号,或者解析段落的底层XML元素(
<w:numPr>节点)来获取更准确的编号规则。
二、除了Normal外,还能获取哪些样式信息
paragraph.style.name能拿到所有应用在段落上的内置样式和自定义样式,常见的内置样式包括:
- 标题类:
Heading 1到Heading 9、Title、Subtitle - 引用类:
Quote、Intense Quote - 辅助文本类:
Caption、Footer、Header、Footnote Text、Endnote Text - 格式类:
Strong(加粗样式)、Emphasis(斜体样式)、Hyperlink
另外,除了样式名称,你还能获取样式的具体属性:
- 字体信息:
paragraph.style.font.name(字体名)、paragraph.style.font.size(字号) - 段落格式:
paragraph.style.paragraph_format.alignment(对齐方式)、paragraph.style.paragraph_format.line_spacing(行间距)、paragraph.style.paragraph_format.left_indent(左缩进)
内容的提问来源于stack exchange,提问作者Gavin Underwood
相关产品推荐
相关产品推荐

