Python自动化办公--Word

Python实现高效自动化Word办公:如何批量合并多个文档(python-docx库)

在Word文件中,不但有文字内容,还有加粗、红色等格式,而且这些特殊的格式和文字内容是混合在一起的,但如果用Python来读取Word文件,这段文字会被分为纯文字、段落、字体、字号以及表格 等更具体的部分,而且每一个部分都对应着Python的变量和函数。

用Python读取文件时,你需要记住很多个Python变量和函数。当然了,针对这一点, 你也不用担心,这些变量和函数在Python的Word扩展库官方文档可以查看。所以如果你需 要某个功能,但是不知道应该用什么变量和函数名称时,可以在官方文档中找到它的名字和 描述信息。

用Python自动合并两个Word文件

  • 文件一(内容包含字体、字号、颜色等额外信息):

  • 文件二(内容文字出现在表格中):

第一个文件中,字体使用了黑体和宋体字,此外还有红色字体和加粗等格式。现在我需要 只提取其中的文字内容,不带任何格式。

第二个文件中,文字被放在了一张表格里。现在我需要用Python把表格中的文字提取出 来,合并成一个新的文件。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 from docx import Document
from pathlib import Path
def mrge_without_format(docfiles:list):
'''
只获取内容进行合并
'''
#遍历文件
for docx_file in sorted(docfiles):
another_doc = Document(docx_file)
# 获取每个文件的的所有段落
paras = another_doc.paragraphs
for para in paras:
# 为新的word文件创建一个新段落
newpar = doc.add_paragraph('')
#将提取的内容写入新的文本段落中
newpar.add_run(para.text)

#所有文件合并完成后在指定路径中保存
doc.save(Path(word_files_path,'new.docx'))

#调用函数
merge-mrge_without_format(files)

用Python合并Word和其他类型的文件

相较于其他文件,Word文件支持的格式丰富程度远远高于Txt文件等,所以当这两种格式丰富程度不一致的文件进行合并时,要么向下兼容,去掉Txt不支持的格式;要 么向上兼容,对Txt进行格式再调整。否则容易出现合并之后仍需要手动调整格式的问题,影 响工作效率。

将纯文本和Word文件合并

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
from docx import Document
from docx.shared import RGBColor
from pathlib import Path, PurePath

# word文件所在路径
word_files_path = 'D:/Python自动化办公/Day02/word样例文件'

# # 取得该目录下所有的docx格式文件
# p = Path(word_files_path)

my_content = '''
野老篱边江岸回,柴门不正逐江开。
渔人网集澄潭下,贾客船随返照来。
长路关心悲剑阁,片云何意傍琴台?
王师未报收东郡,城阙秋生画角哀。
'''

def add_content_mode1(content):

'''
增加内容
'''
print(doc)
para = doc.add_paragraph().add_run(content)

# 设置字体格式
para.font.name = '仿宋'
# 设置下划线
para.font.underline = True
# 设置颜色
para.font.color.rgb = RGBColor(255, 128, 128)
# 其他设置参考官方文档
# https://python-docx.readthedocs.io/en/latest/api/text.html#run-objects


doc = Document()
add_content_mode1(my_content)
doc.save(Path(word_files_path, 'new2.docx'))

将图片和Word文件合并

我们经常见到的图片格式就有.jpg、.png、.gif等,由于这些格式应用范围广,格式 没有被商业软件加密,所以python-docx库的add_picture函数就能实现把图片插入Word的 功能。

1
2
3
4
5
6
from docx import Document
from docx import shared

doc = Document()
# 按英寸设置宽度,添加图片
doc_add_picture('test.jpg',width=shared.Inches(1))

将Execl和Word文件合并

  • 使用Python制作邀请函

    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
    61
    62
    63
    import xlrd
    from docx import Document
    from pathlib import Path, PurePath
    import datetime

    today=datetime.date.today().strftime('%Y-%m-%d')

    # 客户信息文件
    customer = '/Users/edz/Desktop/效率专栏/文章2/邀请函样例文件/客户信息.xlsx'

    # 邀请函模版
    invitation = '/Users/edz/Desktop/效率专栏/文章2/邀请函样例文件/邀请函模版.docx'

    # 邀请函路径
    invitation_path = '/Users/edz/Desktop/效率专栏/文章2/邀请函样例文件/'

    # 替换内容
    replace_content = {
    '<姓名>' : 'no_name',
    '<性别>' : 'm_f',
    '<今天日期>' : today
    }

    def generat_invitation():
    '''
    生成邀请函文件
    '''
    doc = Document(invitation)
    # 取出每一段
    for para in doc.paragraphs:
    for key, value in replace_content.items():
    if key in para.text:
    # 逐个关键字进行替换
    para.text = para.text.replace(key, value)

    file_name = PurePath(invitation_path).with_name(replace_content['<姓名>']).with_suffix('.docx')

    doc.save(file_name)


    def get_customer(customer_file: Path):
    '''
    获取邀请函信息
    '''
    # 从第一个sheet中取出客户信息
    data = xlrd.open_workbook(customer_file)
    table = data.sheets()[0]

    # 取得客户数量
    customer_number = table.nrows

    for line in range(1, customer_number):
    content = table.row_values(rowx=line, start_colx=0, end_colx=None)
    replace_content['<姓名>'] = content[0]
    replace_content['<性别>'] = content[1]
    # print(replace_content)
    # {'<姓名>': '韩梅梅', '<性别>': '女士', '<今天日期>': '2021-01-01'}
    # {'<姓名>': '李雷', '<性别>': '先生', '<今天日期>': '2021-01-01'}
    generat_invitation()


    if __name__ == '__main__':
    get_customer(customer)

总结

在对不同类型文件进行合并时,要考虑不同的问题

  1. 对于支持格式丰富不同的文件时要考虑格式的兼容性;
  2. 对于图片、音乐、视频和Word合并时要考虑是否是受到word支持的通用格式;
  3. 对于像Excel格式于Word合并时能实现更复杂的功能,代码的复杂程度也会随之提高,一 般需要先分析功能,再进行代码编写。
谢谢你的支持哦,继续加油.