<自动化办公> Python 操控 Word

虽然Word不好用, 但还必须得用它, python-docx是专门用于编辑Word文档的一个工具库, 它有两大用途, 自动化生成word文档 and 自动化修改文档

python word

1. 自定义样式

自定义样式

python可以自定义三类样式

  • 段落样式
  • 字符样式
  • 表格样式(一般用不到)

这三类样式的创建方式基本一致, 只是创建参数 略有不同(1为段落样式, 2为字符样式, 3为表格样式)

以设置段落样式为例

    # 创建自定义段落样式(第一个参数为样式名, 第二个参数为样式类型, 1为段落样式, 2为字符样式, 3为表格样式)
    UserStyle1 = document.styles.add_style('UserStyle1', 1)
    # 设置字体尺寸
    UserStyle1.font.size = Pt(40)
    # 设置字体颜色
    UserStyle1.font.color.rgb = RGBColor(0xff, 0xde, 0x00)
    # 居中文本
    UserStyle1.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER
    # 设置中文字体
    UserStyle1.font.name = '微软雅黑'
    UserStyle1._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')

2.理解结构关系

结构关系
  • 往文档中插入文本内容, 首先要插入一个段落, 段落后面可追加字符, 但文档不能直接插入字符
  • 段落之间会自动以 回车符号 分隔
  • 段落 和 字符 可 各自设置独立的样式

实例: 插入段落, 插入段落后追加字符

    # 使用自定义段落样式
    document.add_paragraph('自定义段落样式', style = UserStyle1)

    # 使用自定义字符样式
    document.add_paragraph('').add_run('正月里采花无哟花采,二月间采花花哟正开,二月间采花花哟正开。三月里桃花红哟似海,四月间葡萄架哟上开,四月间葡萄架哟上开。', style = UserStyle2)

3. 插入图片

python-docx支持将图片插入文档, 且可以设置图片大小


插入图片

实例代码:

    document.add_picture('少女17087938.jpg', width=Inches(5))

4.插入列表

插入列表

插入有序列表

    document.add_paragraph('把冰箱门打开', style='List Number')
    document.add_paragraph('把大象装进去', style='List Number')
    document.add_paragraph('把冰箱门关上', style='List Number')

插入无序列表

    document.add_paragraph('天地匆匆 惊鸿而过 路有千百个', style='List Bullet')
    document.add_paragraph('遑遑无归 闲云逸鹤 人间红尘过', style='List Bullet')
    document.add_paragraph('引势而流 鸿门乱局 各有各选择', style='List Bullet')
    document.add_paragraph('乾震坎艮 坤巽离兑 定一切生克', style='List Bullet')

5.插入表格

插入表格

把表格看做二维数组, 然后往数组中填数据

    rows_num = 5
    cols_num = 6
    table = document.add_table(rows=rows_num, cols=cols_num, style = 'Table Grid')

    for r in range(rows_num):
        for c in range(cols_num):
            table.cell(r, c).text = "第{r}行{c}列".format(r = r+1, c = c+1)

完整源码:

from docx import Document
from docx.shared import Inches
from docx.dml.color import ColorFormat
from docx.shared import Pt
from docx.shared import RGBColor
from docx.oxml.ns import qn
from docx.enum.style import WD_STYLE_TYPE
from docx.enum.text import WD_ALIGN_PARAGRAPH

def main():
    # 创建文档对象
    document = Document()

    # 设置默认字体
    document.styles['Normal'].font.name = '微软雅黑'
    document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
    
    # 创建自定义段落样式(第一个参数为样式名, 第二个参数为样式类型, 1为段落样式, 2为字符样式, 3为表格样式)
    UserStyle1 = document.styles.add_style('UserStyle1', 1)
    # 设置字体尺寸
    UserStyle1.font.size = Pt(40)
    # 设置字体颜色
    UserStyle1.font.color.rgb = RGBColor(0xff, 0xde, 0x00)
    # 居中文本
    UserStyle1.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER
    # 设置中文字体
    UserStyle1.font.name = '微软雅黑'
    UserStyle1._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')

    
    # 创建自定义字符样式(第一个参数为样式名, 第二个参数为样式类型, 1为段落样式, 2为字符样式, 3为表格样式)
    UserStyle2 = document.styles.add_style('UserStyle2', 2)
    # 设置字体尺寸
    UserStyle2.font.size = Pt(15)
    # 设置字体颜色0c8ac5
    UserStyle2.font.color.rgb = RGBColor(0x0c, 0x8a, 0xc5)
    # 设置段落样式为宋体
    UserStyle2.font.name = '宋体'
    UserStyle2._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')



    # 使用自定义段落样式
    document.add_paragraph('自定义段落样式', style = UserStyle1)

    # 使用自定义字符样式
    document.add_paragraph('').add_run('正月里采花无哟花采,二月间采花花哟正开,二月间采花花哟正开。三月里桃花红哟似海,四月间葡萄架哟上开,四月间葡萄架哟上开。', style = UserStyle2)


    # 设置粗体字
    document.add_paragraph('设置粗体字:').add_run('粗体字').bold = True

    # 设置斜体字
    document.add_paragraph('设置斜体字:').add_run('斜体字').italic = True

    # 设置字号50
    document.add_paragraph('设置字号50:').add_run('50').font.size = Pt(50)

    # 设置字体颜色为 af2626
    document.add_paragraph('设置字体颜色:').add_run('颜色').font.color.rgb = RGBColor(0xaf, 0x26, 0x26)

    # 样式叠加: 将字体改到30号并且将字体改成特定颜色;
    doubleStyle =  document.add_paragraph('同时设置文字颜色和字号:').add_run('颜色和尺寸')
    doubleStyle.font.size = Pt(30)
    doubleStyle.font.color.rgb = RGBColor(0xaf, 0x26, 0x26)

    # 添加分页符
    document.add_page_break()


    # 创建 有序列表   
    document.add_paragraph('').add_run('有序列表').font.size = Pt(30)
    document.add_paragraph('把冰箱门打开', style='List Number')
    document.add_paragraph('把大象装进去', style='List Number')
    document.add_paragraph('把冰箱门关上', style='List Number')

    # 创建 无序列表
    document.add_paragraph('').add_run('无序列表').font.size = Pt(30)
    document.add_paragraph('天地匆匆 惊鸿而过 路有千百个', style='List Bullet')
    document.add_paragraph('遑遑无归 闲云逸鹤 人间红尘过', style='List Bullet')
    document.add_paragraph('引势而流 鸿门乱局 各有各选择', style='List Bullet')
    document.add_paragraph('乾震坎艮 坤巽离兑 定一切生克', style='List Bullet')

    # 添加分页符
    document.add_page_break()
    # 添加图片
    document.add_paragraph('').add_run('添加图片').font.size = Pt(30)
    document.add_picture('少女17087938.jpg', width=Inches(5))

    # 添加分页符
    document.add_page_break()

    document.add_paragraph('').add_run('创建表格').font.size = Pt(30)
    # 创建两行两列的表格
    rows_num = 5
    cols_num = 6
    table = document.add_table(rows=rows_num, cols=cols_num, style = 'Table Grid')

    for r in range(rows_num):
        for c in range(cols_num):
            table.cell(r, c).text = "第{r}行{c}列".format(r = r+1, c = c+1)
    # 保存文档
    document.save('Python生成的文档.docx')

if __name__ == '__main__':
    main()

将源码保存为单独的python文件后,安装python-docx, 找一张图片,命名为少女17087938.jpg, 将图片与python文件放到同一个目录, 然后再python3环境下运行python文件即可! 最后附测试图片一张:

少女17087938.jpg

最终效果:
最终效果.png

自动化修改文档

保留格式并替换

实例: 将当前目录下, 所有docx文件内的"海南大学", 替换为"Hainan University", 并将新文件添加前缀new后, 保存到当前目录下

转换前

转换后
终端打印
import docx
import os
import re

# 传入三个参数, 旧字符串, 新字符串, 文件对象
def replace_text(old_text, new_text, file):
    # 遍历文件对象
    for f in file.paragraphs:
        # 如果 旧字符串 在 某个段落 中
        if old_text in f.text:
            print("替换前:", f.text)
            # 将段落存入 inline
            inline = f.runs
            # 遍历 段落 生成 i
            for i in inline:
                # 如果 旧字符串 在 i 中
                if old_text in i.text:
                    # 替换 i.text 内文本资源
                    text = i.text.replace(old_text, new_text)
                    i.text = text
            print("替换后===>", f.text)

def main():
    # 获取当前目录下所有的文件名列表
    old_file_names = os.listdir()

    # 获取所有docx文件名列表
    docx_file_names = []
    for old_file_name in old_file_names:
        if re.match(r'^[^~].*\.docx', old_file_name):
            print(old_file_name)
            docx_file_names.append(old_file_name)

    for docx_file_name in docx_file_names:
        try:
            # 获取文件对象
            file=docx.Document(docx_file_name)
            # 三个参数: 旧的字符串, 新的字符串, 文件对象
            print("开始替换:", docx_file_name)
            replace_text('海南大学', 'Hainan University', file)
            file.save('new_'+docx_file_name)
            print(docx_file_name, "替换成功")
        except:
            print(docx_file_name, "替换失败")
            pass

if __name__ == '__main__':
    main()

关于Python操控PPT:https://www.jianshu.com/p/5b294515b480

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容