自学Python第十三天- 一些有用的模块:使用 python-docx 处理 word 文档

  • 使用 win32com 库转换 doc 为 docx
    • win32com 的安装
    • 转换文件格式
      • 使用 office word 转换文件格式
      • 使用 wps word 转换文件格式
  • 使用 python-docx 进行 word 操作
    • python-docx 的安装和引入
    • 使用 python-docx 的基础知识
    • 创建空文档
      • 添加文档标题
      • 设置全局字体
      • 文档添加段落,段落添加字块
      • 字块样式设置
      • 段落样式设置
      • 文档添加表格
        • 表格添加行列
      • 文档添加图片
      • 添加列表
      • 添加分页
      • 保存文档
    • 获取已有文档
      • 获取段落
        • 段落文本的内容
      • 获取字块
        • 字块的内容
      • 获取表格
    • 修改文档内容
      • 添加段落
        • 在添加段落下插入复制的表格
      • 修改文本
      • 插入或修改字块
    • 删除文档内容
      • 删除目标段落
      • 删除目标表格、行、列

python 自动化办公经常遇到需要处理 word 文档,可以使用 python-docx 库来编辑处理。需要注意的是,此库只能处理 docx 文件,而不能处理 doc 文件。这里需要使用 win32com 库的 client 模块来转换一下。

使用 win32com 库转换 doc 为 docx

win32com 的安装

win32com 是第三方库,可以使用 pip 进行安装

pip install pypiwin32

转换文件格式

使用 client 模块转换文件格式的流程为:

  1. 打开文档处理应用程序
  2. 用应用程序打开文件
  3. 另存为目标格式的目标文件
  4. 关闭文件、关闭应用

常用的 word 文档处理程序有 office word 和 wps word

使用 office word 转换文件格式

from win32com import client as wc

def doc2docx(filename):		
    """转换doc文件成为docx"""
    word = wc.Dispatch("word.Application")  # 打开word应用程序
    doc = word.Documents.Open(filename)  # 打开word文件
    doc.SaveAs("{}x".format(filename), 12)  # 另存为 .docx
    doc.Close()
    word.Quit()

此例中,使用文件路径均是绝对路径,据说相对路径会出错,没有进行测试。

SaveAs 的第二个参数是12,表示保存为docx格式。其实 参数为 16 也能另存为 docx 格式,但是网上有说 16 的格式 python-docx 打开会出错,没有测试。另如果需要存为其他格式,参数一中修改文件名,参数二可以使用如下:

扩展名SaveAs 参数说明
doc0
dot197-2003模板
txt2,3,4,5,7
rtf6
htm8,10网页
mht9单个页面
xml112003 xml
docx12,16
docm13启用宏的
dotx14启用宏的
dotm15启用宏的
PDF17
例如转换 docx 为 PDF,可以使用:
doc.SaveAs( "{}.pdf".format(filename[:-5]), 17)

使用 wps word 转换文件格式

使用 wps word 转换文件格式的思路和流程是一样的,只是具体实现不同。

from win32com import client as wc

def doc2docx(filename):		
    """转换doc文件成为docx"""
	word = wc.gencache.EnsureDispatch('kwps.application')
	doc = word.Documents.Open(filename)
	doc.SaveAs2("{}x".format(filename), 12)
    doc.Close()
    word.Quit()

由于没有使用 wps 所以并没有经过测试。这个例子是参考其他的文章。

wps 转换 doc 为 docx

使用 python-docx 进行 word 操作

python-docx 的安装和引入

python-docx 是第三方库,需要安装。

pip install python-docx

引入 python-docx 的 Document ,需要注意的是,安装的名称为 python-docx,引入时使用名称 docx

from docx import Document as Doc

另需要注意的是,修改时最好一步一存,否则等于白做。

使用 python-docx 的基础知识

python-docx 是这样定义 word 文档的结构的:

另外表格(Table)不同于段落(Paragraph),表格的处理类似 Excel 使用行(Row)、列(Column)、单元格(Cell)来处理。

创建空文档

可以使用不带参数创建 Document 对象来建立空文档

from docx import Document as Doc
doc = Doc()

添加文档标题

doc.add_heading('这里设置文档标题', 0)  
doc.add_heading('我是一级标题', level=1)

设置全局字体

有了空文档后,可以设置全局字体。

from docx.oxml.ns import qn
doc.styles['Normal'].font.name = 'Times New Roman'
doc.styles['Normal'].element.rPr.rFonts.set(dns.qn('w:eastAsia'), u'宋体')

这样设置是对应了 word 里的一项设置:

文档添加段落,段落添加字块

para = doc.add_paragraph('这里是段落添加的文本')		# 给文档添加段落(直接添加段落文字)
run = para.add_run('字块中写入的文本')	# 给段落中添加字块,并写入文本内容

字块样式设置

font = run.font		# 获取字块的字体对象

# 字块加粗
font.bold = True
# 字块斜体
font.italic = True
# 字块下划线
font.underline = True
# 删除线
font.strike = True
# 阴影
font.shadow = True
# 设置字体大小
from docx.shared import Pt
font.size = Pt(20)		# 字体大小20像素
# 设置字体颜色
font.color.rgb = RGBColor(0xFF,0x00,0x00)
# 字块字体设置
font.name = 'Times New Roman'
run.element.rPr.rFonts.set(dns.qn('w:eastAsia'), u'宋体')
# 字块背景色设置
from docx.enum.text import WD_COLOR_INDEX
font.highlight_color = WD_COLOR_INDEX.YELLOW

段落样式设置

# 设置段落水平居中对齐
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
para_format = para.paragraph_format
para_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
# 设置首行缩进
from docx.shared import Inches
para_format.first_line_indent = Inches(0.3)		# 首航缩进0.3英寸
# 行间距
para_format.line_spacing = 5.0
# 段前段后间距
para_format.space_before = Pt(12)
para_format.space_after = Pt(12)

文档添加表格

# 添加表格,设置行列
table = doc.addtable(rows=1, cols=3)
# 获取第一行所有单元格
t_cells = table.rows[0].cells
# 第一行单元格赋值
t_cells[0] = '姓名'
table.cell(0, 1) = '性别'
t_cells[2] = '出生日期'

表格添加行列

# 在最下方添加行
row_cells = table.add_row().cells
# 在最右方添加列
col = table.add_column(Cm(5))	# 添加列一定要写列宽

文档添加图片

from docx.shared import Cm
doc.add_picture(picFilename, width=Cm(5.2), height=Cm(5.3))		# 宽度为 5.2 厘米,高度为 5.3 厘米

添加列表

# 添加有序列表
doc.add_paragraph('有序列表1', style='List Number')
doc.add_paragraph('有序列表2', style='List Number')
# 添加无序列表
doc.add_paragraph('无序列表1', style='List Bullet')
doc.add_paragraph('无序列表2', style='List Bullet')

添加分页

分页就是分页符,作用是另起一页。

doc.add_page_break()

保存文档

doc.save(filename)

注意:再次强调,修改、写入操作时最好一步一存。

获取已有文档

from docx import Document as Doc
doc = Doc(filename)

获取段落

Document.paragraphs 包含了所有的段落信息,包括格式和文本等。可以使用 text 来获取文本:

for para in doc.paragraphs:
	print(para.text)

段落文本的内容

测试一下段落的文本内容

    op = []
    for para in fbDocx.paragraphs:
        op.append(para.text)
    print(op)

    with open('./test.txt', 'w', encoding='utf-8') as txt:
        txt.writelines(op)

由结果可以看出来,所有段落文本并没有换行符、分页符等操作符,并且如果为了对其而输入的空格也均存在(所以word里的对其还是推荐使用样式、缩进等,而别用空格来对齐)。可以使用 String.strip() 方法来去除段落前后的空格。

获取字块

一个段落由一个或多个字块组成,所以可以从单个段落中提取字块。

paragraph = doc.paragraphs[4]
for run in paragraph.runs:
	print(run.text.strip())

字块的内容

由测试可以看出,字块是由不同的样式进行分隔的。例如有些汉字呈现中文字体,但是英文字体不同也算是不同的字块。标点也一样,如果字体和之前的文字相同,则属于同一字块,反之则属于不同字块。

获取表格

可以使用 Document.tables 获取文档中的全部表格

tab1 = doc.tables[0]

然后就可以和添加表格及 EXCEL 表格一样进行操作了。

修改文档内容

添加段落

可以在目标段落之前添加新段落

new_para = fbDocx.paragraphs[4].insert_paragraph_before(text='添加新段落的文本')

在添加段落下插入复制的表格

# 复制表格
tab = doc.tables[0]
from copy import deepcopy
new_tab = deepcopy(tab)

para = doc.paragraphs[4]
new_para = para.insert_paragraph_before(text='插入新段落')
new_para._p.addnext(new_tab._element)	# 新的段落下插入复制的表格

修改文本

可以通过直接修改段落或字块的 Text 来修改文本内容

插入或修改字块

python-docx 无法直接插入字块,或将字块分开、合并。如果真需要类似操作,则需要将所有字块添加至新的段落,在添加过程中进行操作,然后将旧段落删除。

删除文档内容

删除目标段落

虽然可以使用 paragraph.clear() 方法来删除段落,但实际上此方法是清空段落信息,段落本身并没有删除。要彻底删除使用这个方法:

para = doc.paragraphs[4]
para._element.getparent().remove(para._element)
para._element._p = para._element = None		# 清除一些指针,防止访问出错。

删除目标表格、行、列

表格的删除类似删除段落

tab = doc.tables[1]
tab._element.getparent().remove(tab._element)

行的删除同表格,但是列不行,因为列没有定义 _element 。虽然可以使用单元格 (cell) 进行删除,但是由于表格中的cell是按行存储,每行存储的cell的数量并没有变化,所以当删除单元格后,后续的单元格会补上。那么此时表格的存储形式将不是WORD文档表现出的效果

更多推荐

自学Python第十三天- 一些有用的模块:使用 python-docx 处理 word 文档