Python 自动化:处理 Word(笔记)

P

这也是 Automate The Boring Stuff With Python 上面的内容,书里面本来是和上一部分 PDF 相关内容放在一起的。

处理 Word 文件的库叫做 python-docx, 然而这个库导入的时候叫做 docx; 对的名字并不一致。安装的时候使用 pip install python-docx, 而导入的时候使用:

import docx

这里也要说明一下 Word 里面的结构:

  • 整个文档是 Document
  • Document 当中包括不同数量的 Paragraph 对象
  • 每一个 Paragraph 对象当中有若干个 Run

至于 Run 则是一个 Paragraph 当中,遇到格式改变时候的部分;例如:

This is a big and sweet apple.

这里面就有 5 个 Run, 分别是 “This is a “, “big”, ” and “, “sweet” 和 ” apple.”

打开文件抽取文字

doc = docx.Document('demo.docx') # 打开一个 Word 文件
print(len(doc.paragraphs)) # 计算有多少个 Paragraph
print(doc.paragraphs[0].text) # 显示第一个 Paragraph 的文字
print(doc.paragraphs[1].text) # 显示第二个 Paragraph 的文字
print(len(doc.paragraphs[1].runs)) # 显示第二个 Paragraph 有多少个 Run
print(doc.paragraphs[1].runs[0].text) # 显示第二个 Paragraph 的第一个 Run 的文字
print(doc.paragraphs[1].runs[1].text) # 显示第二个 Paragraph 的第二个 Run 的文字
print(doc.paragraphs[1].runs[2].text) # 显示第二个 Paragraph 的第三个 Run 的文字
print(doc.paragraphs[1].runs[3].text) # 显示第二个 Paragraph 的第四个 Run 的文字

打开文件抽取所有文字

def getText(filename): # 定义函数,需要 filename 作为输入
    doc = docx.Document(filename) # 打开目标 Word 文件
    fullText = [] # 创建一个空白列表用于储存文字
    for paragraph in doc.paragraphs: # 遍历文档当中的每一个 Paragraph
        fullText.append(paragraph.text) # 把 Paragraph 的文字新加到空白列表当中
    return '\n'.join(fullText) # 把整个列表用回车连接起来

print(getText('demo.docx')) # 调用函数

改变样式

Word 当中的样式包括三种:

  • Paragraph 样式,应用到 Paragraph 对象
  • Character 样式,应用到 Run 对象
  • Linked 样式,应用到 Paragraph 和 Run 对象;然而应用到 Run 对象的时候,应该在样式名称后面加上 Char, 例 runObj.style = ‘Quote Char

python-docx 没办法创建样式,只能设定自带和文档里面特有的样式;如果需要,在 Word 里面新建一个样式然后再去引用。

Word 自带以下样式:

  • ‘Normal’
  • ‘Body Text’
  • ‘Body Text 2’
  • ‘Body Text 3’
  • ‘Caption’
  • ‘Heading 1’
  • ‘Heading 2’
  • ‘Heading 3’
  • ‘Heading 4’
  • ‘Heading 5’
  • ‘Heading 6’
  • ‘Heading 7’
  • ‘Heading 8’
  • ‘Heading 9’
  • ‘Intense Quote’
  • ‘List’
  • ‘List 2’
  • ‘List 3’
  • ‘List Bullet’
  • ‘List Bullet 2’
  • ‘List Bullet 3’
  • ‘List Continue’
  • ‘List Continue 2’
  • ‘List Continue 3’
  • ‘List Number ‘
  • ‘List Number 2’
  • ‘List Number 3’
  • ‘List Paragraph’
  • ‘MacroText’
  • ‘No Spacing’
  • ‘Quote’
  • ‘Subtitle’
  • ‘TOC Heading’
  • ‘Title’

至于 Run 对象的属性还有更多:

  • bold: 粗体
  • italic: 斜体
  • underline: 下划线
  • strike: 删除线
  • double_strike: 双重删除线
  • all_caps: 全部大写(注意这个是看起来全部大写,实际上的文字还是本来的大小写)
  • small_caps: 小型大写(本来小写的字母变成大写字母的样子,但是比普通大写字母要小)
  • shadow: 添加阴影
  • outline: 添加外边框
  • rtl: 从右到左的书写顺序
  • imprint: 阴文,刻入的效果
  • emboss: 阳文,浮起来的效果
doc = docx.Document('demo.docx') # 打开指定文件
print(doc.paragraphs[0].text) # 查看第一个 Paragraph 的文字
print(doc.paragraphs[0].style) # 查看第一个 Paragraph 的样式
doc.paragraphs[0].style = 'Normal' # 把第一个 Paragraph 的样式设置为 Normal
print(doc.paragraphs[1].text) # 查看第二个 Paragraph 的文字
for run in doc.paragraphs[1].runs: # 遍历第二个 Paragraph 的每一个 Run
    print(run.text) # 查看文字
doc.paragraphs[1].runs[0].style = 'QuoteChar' # 把第二个 Paragraph 的第一个 Run 的样式设置为 Quote, 因为应用在 Run 上面的缘故所以需要后面加上 Char
doc.paragraphs[1].runs[1].underline = True # 把第二个 Paragraph 的第二个 Run 设置下划线
doc.paragraphs[1].runs[4].underline = True # 把第二个 Paragraph 的第五个 Run 设置下划线
doc.save('restyled.docx') # 保存文件

写入 Word 文件

新嘉 Paragraph 用 add_paragraph

doc = docx.Document() # 新建一个 Document 对象
doc.add_paragraph('Hello, world!') # 增加一个 Paragraph, 并指定其内容
doc.save('helloworld.docx') # 保存文件

新加 Run 用 add_run

doc = docx.Document() # 新建一个 Document 对象
doc.add_paragraph('Hello world!') # 增加一个 Paragraph, 并指定其内容 -> 只能增加在 Document 的最后
paragraphObject1 = doc.add_paragraph('This is asecond paragraph.') # 增加一个 Paragraph, 并指定其变量名和内容
paragraphObject2 = doc.add_paragraph('This is a yet another paragraph.') # 增加一个 Paragraph, 并指定其变量名和内容
paragraphObject1.add_run(' This text is being added to the second paragraph.') # 给指定 Paragraph 变量增加一个 Run, 并指定其内容 -> 只能增加在 Paragraph 的最后
doc.add_paragraph('Hello, world!', 'Title') # 增加一个 Paragraph, 并指定其内容和样式
doc.save('multipleParagraphs.docx') # 保存文件

新加标题用 add_heading

doc = docx.Document() # 新建一个 Document 对象
for i in range(5): # 从 0 到 4 遍历
    doc.add_heading(f'Header {i}', i) # 增加标题;0 则和 Title 样式一样
doc.save('headings.docx') # 保存文件

新加分页符用 add_break(docx.enum.text.WD_BREAK.PAGE)

doc = docx.Document() # 新建一个 Document 对象
doc.add_paragraph('This is on the first page!') # 写入一个 Paragraph
doc.paragraphs[0].runs[0].add_break(docx.enum.text.WD_BREAK.PAGE) # 在第一个 Paragraph 的第一个 run 后面加入一个分页符;如果参数则是普通的分隔符
doc.add_paragraph('This is on the second page!') # 在第二页写入一个 Paragraph
doc.save('twoPage.docx') # 保存文件

新加图片用 add_picture

doc = docx.Document() # 新建一个 Document 对象
doc.add_picture('zophie.png', width = docx.shared.Inches(1), height = docx.shared.Cm(4)) # 插入一个图片,并指定尺寸
doc.save('zophie.docx') # 保存文件

新加表格用 add_table

from docx.enum.table import WD_TABLE_ALIGNMENT
doc = docx.Document() # 新建一个 Document 对象
table = doc.add_table(3,4) # 增加一个 3 行乘以 4 列的 table
table.alignment = WD_TABLE_ALIGNMENT.CENTER # 中间对齐 table
table.cell(1,2).add_paragraph('hello!') # 第 2 行第 3 列另起一行写入文字
table.cell(2,3).text ='world!' # 第 3 行第 4 列写入文字
doc.save(table.docx') # 保存文件

平时 Word 需要用得比较多还是和表格打交道,还是得多看一下表格怎么处理格式等等了。

About the author

secangel

双子座 AB 型,资深女校男生

Add comment

About Author

secangel

双子座 AB 型,资深女校男生

Keep In Touch