处理 Word 文件的库叫做 python-docx, 然而这个库导入的时候叫做 docx; 对的名字并不一致。安装的时候使用 pip install python-docx, 而导入的时候使用:
import docx
这里也要说明一下 Word 里面的结构:
整个文档是 Document
Document 当中包括不同数量的 Paragraph 对象
每一个 Paragraph 对象当中有若干个 Run
至于 Run 则是一个 Paragraph 当中,遇到格式改变时候的部分;例如:
This is a bigand sweetapple.
这里面就有 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 ' '.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 需要用得比较多还是和表格打交道,还是得多看一下表格怎么处理格式等等了。