心路历程
朋友让我做几十份报告。数据来源于excel表格。为此,计划先手动做一个word模板,根据源数据,修改文档指定内容。查找了一些关于docx的使用方法,讲的比较多,尝试过程中也走了些弯路。所以想写一份更加清晰易懂的帮助文档。 必须要说,我是python新手,第一次发文章,主要是写给自己的笔记。
安装python-docx 包
cmd:
pip install python-docx
Tip
:
打开cmd窗口时,记得以administrator 模式打开,否则可能会提醒‘permission denied’ 导致无法安装库文件
word文件基础操作
关于docx库的详细使用方法,可以查看网站介绍:
官方文档
1.打开与保存文档
import docx
dir_tar_file_name = r'D:\workspace\self\Report-01.docx'
wd = docx.Document(dir_tar_file_name)
# 保存文件
wd.save(dir_tar_file_name)
docx 模块库只能处理 .docx 格式文件,如果时doc格式的,需要提前转换。
所有对文档的编辑工作需要在word关闭的状态下进行,否则会引发错误。
docx中对象类型
a. paragraph 段落对象
paragraph 很好理解,就是段落的意思。包括标题和按序号排版的内容。
举个例子
获取paragraph的方式:
wd = docx.Document(dir_tar_file_name)
para=wd.paragraphs
print('总共有 %s 段文字' %(len(para)))
for i in para:
print(i.text)
运行结果,可以看到每一个段落分割符切分一个paragraph. 获取段落文本即其text属性。
新建paragraph
new_paragraph=wd.add_paragraph('新增一个段落内容')
#在段落前插入一段
add_before_para=new_paragraph.insert_paragraph_before('在刚才那段话前插入这段话')
b. table 表格对象
word中经常会有表格,以下是获取表格文本对象的方式:
tables->table->columns/rows->cells->text
tables=wd.tables
print('总共有%s个表格'%(len(tables)))
print('第一个表有%s行,%s列'%(len(tables[0].rows),(len(tables[0].columns))))
print('******按列打印*******')
for col in tables[0].columns:
for row in col.cells:
print (row.text)
print('******按行打印******')
for row in tables[0].rows:
for col in row.cells:
print(col.text)
Result:
以下 是修改tables的常用方法:
#新建一个表格
table=rew_record.add_table(rows=2,cols=2)
#获取第二个单元格
cell=table.cell(0,1)
cell.text='填在第一行第二列'
#获取第二行单元格
second_cells=table.rows[1].cells
second_cells[0].text='一'
second_cells[1].text='二'
#新增一行
cells=table.add_row().cells
cells[0].text='1'
cells[1].text='2'
c. picture 图片对象
获取图片
docx并不擅长处理picture对象,暂时无法获取文档中的图片需要借助其他工具,知道一个思路可以借鉴:
将文档后缀改为zip,然后打开,会发现所有的图片都在word->media文件夹下,所以可以需要处理zip格式文件的方法。
添加图片
from docx.shared import Inches
#导入Inches为了调整图片尺寸,默认尺寸往往过大
#可以设置width/height
wd.add_picture(r'C:\Users\\timg1.jpg',width=Inches(1.0))
d. style 格式对象
style即文档中的段落/字体格式,style 对象对应着word中的Styles工具栏内容。如下图:
表格格式的name可以通过modify看到
修改段落文本格式最简单的方法是重新给对象指定style名,和人为操作类似。所以需要提前把文本模板的格式创建并固定下来,免去后面再去更改字体或字体大小的麻烦。
方法就是在styles中,create a New style
这里面可以把style的作用域进行设置:paragraph/character/Table/List ,如果一个段落中有多种文本格式,需要使用character style。暂时不需要理解,等遇到实际问题了再回头看这句话。
** 获取文档的所有格式**
#获取styles,注意 仅能get到文档中所使用过的类型
styles=wd.styles
for style in styles:
print(style.name)
获取段落,或表格的格式属性,并替换到其他格式。
#修改第二段的格式,设置为2级标题
para[1].style=styles['Heading 2']
#修改表格格式
tables[0].style=style['Table Grid']
编辑style 属性
编辑的是style的属性,不是仅仅修改指定文档的格式
修改字体大小/斜体/加粗
from docx.shared import Pt
style1.font.size =Pt(12) #设为12号字
style1.font.italic=True #斜体
style1.font.bold=True #加粗
style1.font.underline=True #下划线
段落中的多style格式处理-run 对象
如果段落中有多种格式,对paragraph.text修改会把格式覆盖掉,docx根据style类型不同将一段文字按run进行切割。
for run in wd.paragraphs[3].runs:
print(run.text)
result:
例如:下面这段文字
把表格中的统计数据,填写到文档中,并把小于30的值加上下划线。
#需要提前设定两个style类型
if int(run.text[0:2])<=30:
run.style=styles['Style_under1']
else:
run.style=styles['Style_Nounder']
大概整理这些,有其他常见问题我再补充。