![417d63eee7ccd85305c370d68f39a517.png](https://i-blog.csdnimg.cn/blog_migrate/fe88664ec93e55a78617b5d4cb0a329e.jpeg)
日常需要经常处理Word文档,发现了一个新的Python包:Python-docx,处理docx十分方便。
而且这个包和pandas包结合使用,可以在word插入excel表格,节省了很多复制、粘贴、调整表格样式的时间,真的很方便!
但是要注意:Python-docx只能处理docx、docx、docx文件!
下面给大家介绍一下如何使用Python-docx吧,抛砖引玉~
0. 学习思路
一、 基础!安装Python-docx,并对照”官方帮助说明“了解包的对象和基本函数;
这里建议在python交互模式下进行,可以直观的看到返回值和报错。
二、 出题!自己定义一个问题并解决,来加深对包的理解。
题目:”创建一个docx文件,要求输入2个表格,并且这个表格有填充的数字,表格前有相应标题。“
三、 进阶!试试包的更多函数,看会触发什么效果。
结合pandas,学习表格和字体、字号、颜色的处理
![d1504627d86f3239c942a932981a893b.png](https://i-blog.csdnimg.cn/blog_migrate/a302488a30e24d71ce130c731c447247.jpeg)
一、 基础
1.1 使用conda安装python-docx:
conda install -c conda-forge python-docx
没有了解过conda的同学,可以看看 Anaconda国内镜像停止后,怎么办?(已恢复),文中有简单介绍。
1.2 简要了解Python-docx:
官方帮助说明:https://python-docx.readthedocs.io/en/latest/index.html#
1 打开/读取文档
第一步当然是创建文档并打开啦~
from docx import Document
import os
path = "a.docx"
os.system("touch %s" %path) # 调用shell命令创建a.docx文件
documentNew = Document() # 不指定路径是创建文件
documnet = Document(path) # 指定路径是读取文件
w(゚Д゚)w 发现报错 PackageNotFoundError :
docx.opc.exceptions.PackageNotFoundError: Package not found ...
原来是因为a.docx中没有任何内容。打开a.docx之后输入几个字符,再重试以上代码,就不会报错了。
2 插入标题
使用 add_heading() 或add_paragraph()添加标题:
document.add_heading('Document Title', 0)
# 方法1
document.add_heading('Heading 1', level=1) # 用level设置,level为0-5,对应不同级别的标题
# 方法2
document.add_paragraph('Heading 1', style="Heading 1") # 用style来设置不同级别的标题
3. 插入段落
段落是word文档中最基本的对象之一。插入段落主要使用的函数是:
- add_paragraph() #添加段落
- add_run() #追加文字
#插入段落, 同时设置粗体和斜体~
p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True #粗体
p.add_run(' and some ')
p.add_run('italic.').italic = True #斜体
![73ec2290914f0cf97fc682ef44da291c.png](https://i-blog.csdnimg.cn/blog_migrate/014d9b1d886e0d003a106531398c3908.png)
段落还可以使用style设置风格。
# 圆点列表
document.add_paragraph(
'first item in unordered list', style='List Bullet'
)
# 序号列表
document.add_paragraph(
'first item in ordered list', style='List Number'
)
# 引用
document.add_paragraph('Intense quote', style='Intense Quote')
![a64cbee3d0992d5840d2737cabf2620d.png](https://i-blog.csdnimg.cn/blog_migrate/91716405f47b315256455adf7f038039.jpeg)
4 插入图片
from docx.shared import Inches
document.add_picture('image-filename.png', width=Inches(1.0))
5 分页符
document.add_page_break()
6 插入表格
主要使用的函数:
- add_table() # 新建表格
- add_row() # 添加行
- add_col() # 添加列
- table.cell(i, j).text() # 往表格中添加内容
- table.rows() # 行数
- table.cols() # 列数
records = (
(3, '101', 'Spam'),
(7, '422', 'Eggs'),
(4, '631', 'Spam, spam, eggs, and spam')
)
# 新建1行3列的表
table = document.add_table(rows=1, cols=3) # row行, col列
# 使用table 的rows()和columns()得到这个表格的行数和列数
print(len(table.rows))
print(len(table.columns))
# 添加标题行
hdr_cells = table.rows[0].cells # 注意 table.rows(0)表示第1行
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
# 将records中的数据添加到新建的table中
for qty, id, desc in records:
row_cells = table.add_row().cells
row_cells[0].text = str(qty)
row_cells[1].text = id
row_cells[2].text = desc
如果熟悉pandas,那你肯定知道创建的dataframe默认会自带标题行。但是python-docx不同,需要自行添加标题行。这里要注意一下,不过别紧张不需要死记硬背,出现问题多调试就行~
7 保存文件
document.save(path) # 指定路径
二、 做题!
至此,官方文档的示例学的差不多了,基本上就是对标题、段落、表格和图片的处理。
下面来做一个简单的题目:
创建一个docx文件,要求输入2个三行七列的三线表。
表格1:标题栏为数字1到7。表格前有相应标题“1. 表格1”,标题的字体为等线,且为斜体。
表格2:标题栏为大写字母A到G。表格前有相应标题“2. 表格2”, 标题的字号为12,且为粗体。
希望你先自己写一下,有问题多搜索。然后再来看看我的答案,对比下思路的不同。这样学的更快,有问题也可以互相交流学习~
![b276efffd142ebf0cf87c71c5d45792c.png](https://i-blog.csdnimg.cn/blog_migrate/b388475efa3f9869bcf9f71f3a64867b.jpeg)
实现代码:
#!/bin/usr/env python
from docx import Document
from docx.shared import Pt # 设置字号
document = Document()
# 表格1
# 标题1,字体为等线,且为斜体
title1 = document.add_heading(u'1.表格1', level=1)
title1.style.font.name = u'等线' # 设置中文字体前面要有u
title1.italic = True
table1 = document.add_table(rows=3,cols=7) # 3行7列
# 设置表格标题栏
for i in range(7):
table1.cell(0,i).text = str(i+1)
table1.style="Light Shading" # 风格为三线表
# 表格2
# 标题2,字号为12,且为粗体
title2 = document.add_paragraph(u'2.表格2',style="heading 1")
title2.style.font.size = Pt(12)
title2.bold = True
table2 = document.add_table(rows=3,cols=7) # 3行7列
headLine = ["A","B","C","D","E","F","G"]
# 设置表格标题栏
for i in range(7):
table2.cell(0,i).text = headLine[i]
table2.style="Light Shading" # 风格为三线表
# 储存
document.save("test.docx")
最终结果↓ :
![56ffe83e5147080c801691a14a56700e.png](https://i-blog.csdnimg.cn/blog_migrate/1aa2ad78e5d3fac7dbf1b3ce54a11ee7.jpeg)
三、进阶
3.1 表格样式模板:
参考官方文档:python-docx:Table styles in default template (表格默认样式模板)
其中常用的有 Light Shading(三线表)↓ :
![a0251591f9f0fdf80b1b6d16225eb8c0.png](https://i-blog.csdnimg.cn/blog_migrate/da19025d7501bb373b7a142ffa387cdf.png)
Table Grid(网格型)↓ :
![308c1d68b4088d8f65143b90e6ce9168.png](https://i-blog.csdnimg.cn/blog_migrate/ad6c995bc98924937063ff6dc11a8603.png)
Light Grid(浅色网格)↓ :
![0891ade5b26c7af7a90f55ce8e6cd5ec.png](https://i-blog.csdnimg.cn/blog_migrate/69e8bc087c6c5d06d57f3744161a2c1b.png)
Medium List 1(中等深浅列表1) ↓:
![59b1a03e22acb0944c7ab51298bd518a.png](https://i-blog.csdnimg.cn/blog_migrate/dc10e71aba1eb4bad1bd2c80cc2d9eb6.png)
Medium List 2(中等深浅列表2) ↓ :
![5a15a0237b182c014a0e951869672a62.png](https://i-blog.csdnimg.cn/blog_migrate/4b43397f7bd6e0fd04c94200844e3d38.png)
可以点击查看 python---word表格样式设置. 蜗v牛. CSDN 查看更多样式示例。但是现在的Python-docx包代码有些更新,样式和该链接中的图例部分有出入。使用时需要自行调试~
3.2 自定义表格样式
先试试下面的代码~
from docx import Document # 输出docx
from docx.shared import Pt # 设置字号
from docx.shared import Cm # 设置宽度,单位是cm
from docx.shared import RGBColor # 设置字体颜色
document = Document()
table = document.add_table(6,2, style="Normal Table")
colHeadLine = ["A","B","C","D","E","F"]
for i in range(6):
# 给单元格赋值的同时修改样式,不影响整个表格
cell = table.cell(i,0)
cell.width = Cm(2) # 设置单元格宽度为2cm
run = cell.paragraphs[0].add_run(colHeadLine[i])
run.font.color.rgb = RGBColor(0,100,0)
run.font.name = u'等线'
run.italic = True
table.columns[0].width=Cm(3)
# 修改整个表格的字体样式
table.style.font.size = Pt(10)
# 保存
document.save("test.docx")
3.2.1 表格自动适应窗口大小:
table.autofit = True
3.2.2 自定义表格宽度或高度:
a. 方法1:
table.cell(row,col).width = Cm(4) #
table.cell(row,col).height = Cm(4)
b. 方法2:
特别需要注意的是,column和row后面是有s的!
官方文档中有无s标注错误,害得我还以为不能这样操作,捂脸.jpg。
table.columns[0].width=Cm(2) # 不起效,不知道为什么
table.rows[0].height=Cm(2) # 起效
3.2.3 对齐
a. 表格对齐:
table.alignment = WD_TABLE_ALIGNMENT.CENTER #居中
table.alignment = WD_TABLE_ALIGNMENT.LEFT #靠左
table.alignment = WD_TABLE_ALIGNMENT.RIGHT #靠右
b. 文字对齐:
# 水平方向
table.cell(row,col).paragraphs[0].paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER
table.cell(row,col).paragraphs[0].paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT
table.cell(row,col).paragraphs[0].paragraph_format.alignment = WD_ALIGN_PARAGRAPH.RIGHT
# 垂直方向
table.cell(row,col).vertical_alignment = WD_ALIGN_VERTICAL.CENTER
table.cell(row,col).vertical_alignment = WD_ALIGN_VERTICAL.TOP
table.cell(row,col).vertical_alignment = WD_ALIGN_VERTICAL.BOTTOM
3.3 add_run() 设置字体、字号和颜色
from docx import Document
from docx.shared import Pt # 设置字号
from docx.shared import RGBColor # 设置字体颜色
document = Document()
p = document.add_paragraph('A plain paragraph')
run = p.add_run(' is plain') # 注意is之前的空格
run.font.name = u'等线' #设置字体
run.font.size = Pt(10.5) # 设置字号
run.font.color.rgb = RGBColor(250,0,0) # 设置字体颜色
# 保存
document.save("test.docx")
![b74ca0085a177bd233533174f0679ca2.png](https://i-blog.csdnimg.cn/blog_migrate/43209653bdc6f9e78fe012b8e8aa5949.png)
3.4 结合pandas的iloc函数,将dataframe写入word
import pandas as pd
from docx import Document # 输出docx
from docx.shared import Pt # 设置字号
document = Document()
df = pd.read_csv(a.csv, sep="t")
rowNum = df.shape[0] + 1 # 行数,加标题栏
colNum = df.shape[1] # 列数
table = document.add_table(rows=rowNum, cols=colNum, style = "Light Grid")
table.cell(0,0).text = "a"
table.cell(0,1).text = "b"
table.cell(0,2).text = "c"
table.cell(0,3).text = "d"
for i in range(1, rowNum):
for j in range(colNum):
cell = table.cell(i,j)
cell.text = str(df.iloc[i-1,j])
table.autofit = True
table.style.font.name = u'等线'
table.style.font.size = Pt(12)
document.save(outPutDocx)
一个示例 ↓ :
![d469343604387414509174f9e8e8fc69.png](https://i-blog.csdnimg.cn/blog_migrate/737c9b9f4c65cb4964ef5dd3bd4fc9a1.png)
四、总结
- 如何创建和读取文档
- 插入标题、段落、图片、分页符和表格
- 进阶学习,表格和段落的字体、字号、颜色的处理
后续如果发现更多有趣的用法,也会更新本文~
觉得有用别忘记点赞呀~
感谢O(∩_∩)O~
以上!
阅读更多:
梨酱:[论文写作 1] 如何用word批量制作三线表?zhuanlan.zhihu.com![298667c450639061fc492ad1c1aaaec3.png](https://i-blog.csdnimg.cn/blog_migrate/0dfdbfd00e684b8534f756a9f3528885.jpeg)
![3979de7b724e350b6f02b2dde6c9606a.png](https://i-blog.csdnimg.cn/blog_migrate/2877d7b45f22e24e2973e86a12e6b9e4.jpeg)
![145791444374d88c02a5321df1e8b068.png](https://i-blog.csdnimg.cn/blog_migrate/4ffc241cc2f409b542f5642bd7920a13.jpeg)
参考:
- python错误:docx.opc.exceptions.PackageNotFoundError: Package not found at 'new.docx'解决办法. 向东的笔记本. CSDN
- python---word表格样式设置. 蜗v牛. CSDN
- python-docx,what can it do.
- Python读写docx文件. CSDN.
- 利用python批量处理Word文件——正文、标题. xtfge0915.
- 利用python-docx批量处理Word文件—图片. Giser张博. CSDN.
- 利用python-docx批量处理Word文件——表格. Giser张博. CSDN.
- 利用python-docx批量处理Word文件——表格(二)样式控制. Giser张博. CSDN.