自学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 模块转换文件格式的流程为:
- 打开文档处理应用程序
- 用应用程序打开文件
- 另存为目标格式的目标文件
- 关闭文件、关闭应用
常用的 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 参数 | 说明 |
---|---|---|
doc | 0 | |
dot | 1 | 97-2003模板 |
txt | 2,3,4,5,7 | |
rtf | 6 | |
htm | 8,10 | 网页 |
mht | 9 | 单个页面 |
xml | 11 | 2003 xml |
docx | 12,16 | |
docm | 13 | 启用宏的 |
dotx | 14 | 启用宏的 |
dotm | 15 | 启用宏的 |
17 | ||
例如转换 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 文档
发布评论