在word中插入表格进行的编号时,有时会遇到编号太多,容易写错的问题,因此加上了自动化修改编号的部分
此示例为修改XXX-XXX-XXX-XXX最后三位的编号,当文档从上到下遍历时,每遇到一个标题,编号重新置为001
具体以实际情况修改。
import os
import docx
from docx.oxml.table import CT_Tbl
from docx.oxml.text.paragraph import CT_P
# from docx.shared import Pt
def load_word(file_path):
doc = docx.Document(file_path)
n = 0
"""遍历该word中的所有元素内容,返回的是两种element格式对象,如
<CT_P '<w:p>' at 0x1b6a2e4a660>、
<CT_Tbl '<w:tbl>' at 0x1b6a35064d0>"""
print(doc.tables[0])
print(doc.tables[0]._element)
for block in doc.element.body.iterchildren():
# 判断该对象是否为CT_P
if isinstance(block, CT_P):
# print(block)
for paragraph in doc.paragraphs:
# 判断段落的的element是否与从上到下遍历到的元素相同
if paragraph._element == block:
# 判断段落是否为目录标题形式
if paragraph.style.name.startswith('Heading'):
n = 0
# 判断该对象是否为CT_Tbl
elif isinstance(block, CT_Tbl):
# 准备需要替换的number
nums = []
for i in range(1, 1000):
nums.append('{:03d}'.format(i))
# 遍历该文档中的所有表格
for table in doc.tables:
# 判断表的element是否与从上到下遍历到的元素相同
if table._element == block:
# 判断每个表的第一行第一列是否是XXX编号作为定位,也可用其他方式,因为可能有其他形式的表格
if table.cell(0, 0).text == "XX编号": # 根据表格格式决定
text = table.cell(0, 1).text # 获取编号text
idx = text.rfind("-") # 查找倒数第一个"-"的索引
for paragraph in table.cell(0, 1).paragraphs: # **直接替换文字不修改样式
for run in paragraph.runs:
run.text = run.text.replace(text[idx+1:], nums[n]) # 转化为字符串,部分替换
"""
直接修改text会修改单元格格式,需要重新定义单元格的样式
table.cell(0, 1).text = text.replace(text[idx+1:], a)
cell = table.cell(0, 1)
cell.paragraphs[0].runs[0].font.name = '等线'
cell.paragraphs[0].runs[0].font.size = docx.shared.Pt(10.5)
cell.paragraphs[0].alignment = docx.enum.text.WD_ALIGN_PARAGRAPH.LEFT
cell.width = docx.shared.Inches(2.0)
"""
print(nums[n])
print(text)
n += 1
doc.save("new.docx")
print("完成")
if __name__ == '__main__':
ROOT_DIR_P = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) # 项目根目录
file_path = os.path.join(ROOT_DIR_P, "<项目的相对路径如:xx\\file\\xx汇总>") # 文件路径及文件名
load_word(file_path)