Python之word文档批量处理

在文字工作中,经常会碰到与需要批量生成、编辑word文档的需求,这类机械性的工作非常适合编写小工具进行批量处理,使得原本人工处理需要几小时的工作量缩短为几分钟。

工具介绍

Python下处理word文档最好用的库为 python-docx, 目前已收入pypi,直接使用pip安装即可。

新建文档

可以新建一个空白文档 Document ,如下:

1
2
3
from docx import Document

document = Document()

编辑现有文档

将现存文件的路径传给Document类即可。

1
2
3
4
from docx import Document

document = Document('myfile.docx')
document.save('new-file-name.docx')

新建标题

新建一个标题, 其中level参数可选,有1-9中规格,代表标题级别。

1
document.add_heading('新建标题', level=1)

新建段落

创建段落 paragraph 的操作如下:

1
paragraph = document.add_paragraph('新建段落。')

设置段落样式

1
2
paragraph = document.add_paragraph('这是一个样式为 ListBullet 的段落')
paragraph.style = 'List Bullet'

设置段落对齐方式

段落对齐方式有 左对齐文字居中右对齐两端对齐,更多对齐方式请参考 WD_ALIGN_PARAGRAPH

1
2
3
4
5
6
7
8
9
10
from docx.enum.text import WD_ALIGN_PARAGRAPH

# LEFT => 左对齐
# CENTER => 文字居中
# RIGHT => 右对齐
# JUSTIFY => 文本两端对齐

paragraph = document.add_paragraph("对其方式测试")
paragraph_format = paragraph.paragraph_format
paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER

设置段落缩进

设置段落缩进,可为负值:

1
2
3
4
from docx.shared import Inches

paragraph = document.add_paragraph("这是缩进")
paragraph.paragraph_format.left_indent = Inches(0.5)

也可以设置首行缩进:

1
paragraph.paragraph_format.first_line_indent = Inches(0.5)

设置段落行距

当行距为 最小值固定值 时,设置值单位为 ,需要用 Pt ;当行距为 多倍行距 时,设置值为数值,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
from docx.enum.text import WD_LINE_SPACING

#SINGLE => 单倍行距(默认)
#ONE_POINT_FIVE => 1.5倍行距
#DOUBLE2 => 倍行距
#AT_LEAST => 最小值
#EXACTLY => 固定值
#MULTIPLE => 多倍行距

paragraph.line_spacing_rule = WD_LINE_SPACING.EXACTLY #固定值
paragraph.paragraph_format.line_spacing = Pt(18) # 固定值18磅
paragraph.line_spacing_rule = WD_LINE_SPACING.MULTIPLE #多倍行距
paragraph.paragraph_format.line_spacing = 1.75 # 1.75倍行间距

片段设置(Run)

段落包含很多块级的格式,比如缩进、行高、制表符等。每一个小片段叫做一个 run ,可以对 run 设置粗体和斜体等属性。

1
2
3
4
5
6
paragraph = document.add_paragraph()
paragraph.add_run('这是一个带有')
paragraph.add_run('粗体').bold = True
paragraph.add_run('和')
paragraph.add_run('斜体').italic = True
paragraph.add_run('的段落。')

更多参考资料

中文:https://zhuanlan.zhihu.com/p/61340025

官方文档 :https://python-docx.readthedocs.io/en/latest/index.html

案例介绍

假设我们需要生成如下的代办xx业务的委托书,客户名字和身份证号来源于其他文件(可以是txt,excel),如果手动进行复制粘贴,费时费力,不如用上一节介绍的工具进行批量处理。

下面示例代码用于生成上图中的模板文档,中文可以自行替换; 函数接收姓名、身份证号组成的列表作为 参数(另有代码进行处理,从其他 文件获得),如[('小明', 330201xxxxxxxxxxxxx1410), ..., ('小红', 330205xxxxxxxxxxxxx1701)]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
def generate_doc(namelist):

# 授权正文
content = '兹委托 xxx (身份证件号:xxxxxxxxxxxxx)' \
'到xx机关办理xx业务事项。委托人和代理人严格遵守有关xx法律法规。'



# 以下为生成保密协议的代码,name_list中的每个人员都将生成对应一份保密协议文档
for names in name_list:
# 创建内存中的word文档对象
file = docx.Document()
file.styles['Normal'].font.name = u'宋体'
file.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体') # 可换成word里面任意字体



# 写入若干段落
p1 = file.add_paragraph()
p1.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER # 段落文字居中设置
run = p1.add_run("办理xx事项授权委托书")
run.font.size = docx.shared.Pt(20)
run.bold = True

# 抬头
head = file.add_paragraph()
head.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT
run = head.add_run("\n\nxx市xx区xx局:\n")
run.font.size = docx.shared.Pt(14) # 四号字体
run.bold = True

# 个人信息
p2 = file.add_paragraph()
# p2.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE
p2.paragraph_format.line_spacing_rule = WD_LINE_SPACING.DOUBLE
p2.paragraph_format.first_line_indent = Inches(0.5)
p2.add_run('本人,').font.size = docx.shared.Pt(14)
run = p2.add_run('%s' % names[0])
run.font.size = docx.shared.Pt(14)

p2.add_run('(身份证件号:').font.size = docx.shared.Pt(14)
run = p2.add_run('%s)' % names[1])
run.font.size = docx.shared.Pt(14)

p2.add_run(content + '\n').font.size = docx.shared.Pt(14)

p3 = file.add_paragraph()
run = p3.add_run('委托人签名: 代理人签名:\n')
run.font.size = docx.shared.Pt(14)
run.bold = True

p5 = file.add_paragraph()
p5.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.RIGHT

run = p5.add_run("2021 年 5 月")
run.font.size = docx.shared.Pt(14)
run.bold = True

# 保存
file.save("./result/办理xx事项授权委托书-%s.docx" % names[0])

如需完整代码,可以关注公众号”CodingSirTutor”, 回复“word批量处理”获取;如需定制文件模板或有特殊需求,可添加wx助手:caxiaozhushou咨询。

0%