当前位置: 首页 > 办公技巧 > 正文

docx办公技巧(Python学习笔记 | 办公自动化之使用python-docx模块操作Word文档)

  • 叁碗诸角 叁碗诸角
  • 办公技巧
  • 2023-08-22 13:20:20
  • 0

一、python-docx模块安装

Python的语法确实人性化,但是其系统本身也是真难操作,例如版本问题、第三方包下载安装等问题,我电脑安装这个python-docx这个第三方包就遇到了各种奇葩问题,难缠到脑袋疼,最终算是对付能用了,赶紧记录一下吧,避免再次入坑!

1、安装lxml模块

为什么要安装lxml模块呢?


刚开始我使用Pycharm软件为虚拟环境安装python-docx模块,结果安装失败,提示在终端命令行里使用pip尝试安装。打开Windows系统的终端窗口,输入pip install python-docx回车,屏幕一片英文,提示安装失败!经过简略查看,发现该命令行执行后首先系统在安装lxml,这个lxml安装就失败了。经过网上查询了解到,lxml也是python的一个模块,python-docx模块的安装需要依赖这个lxml模块,所以必须先安装lxml。[汗]在终端窗口里继续输入pip install lxml回车,安装又失败![流泪][流泪][流泪]再继续网上查询,在成堆的文章里筛选出一篇,告诉先安装wheel模块(pip install wheel),再下载lxml模块的离线文件(文件格式是whl,安装时需要借助wheel模块),最后再用这个离线文件来安装lxml。最终证明,这篇文章非常牛,成功安装了lxml模块!下载lxml模块离线文件的地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml,一定要根据自己电脑的操作系统和python版本号下载对应文件,如网站上的cp311代表python版本为3.11,amd64就是64位操作系统。使用离线文件安装模块的命令行代码:pip install 本地路径离线文件名(包含扩展名),注意下载的文件不要更改文件名。

2、安装python-docx模块

虽然已经安装了lxml模块,但是在Pycharm里面安装python-docx模块依然出错,所以再次回到操作系统终端窗口,输入:pip install python-docx回车,成功完成安装。

3、为虚拟环境安装python-docx模块


上面安装成功的python-docx是安装在本地公共环境中的,我的项目是在Pycharm里创建的虚拟环境,这里并没有安装,还是无法使用。又是网上一番查询,解决办法是在pip安装语句中加上目标位置参数,以我的电脑为例,命令行代码为:pip install python-docx --target=D:python练习venvLibsite-packages。执行上面语句,系统还是首先在网上下载安装lxml模块,接着就是失败……折腾的我已经无语了!最后灵光乍现,想到了一个笨方法,干脆直接把本地环境中的python-docx文件夹拷贝到D:python练习venvLibsite-packages这个文件夹里不就得了嘛!第三方包安装到电脑上就是文件夹,里面的py文件就是模块。[奸笑]经过验证,需要拷贝两个文件夹:python_docx-0.8.11.dist-info和docx。

二、python-docx模块的使用

1、导入模块

python-docx实际上是一个包,实际需要使用的模块是docx,导入实例如下:


from docx import Document:导入Document类from docx.enum.text import WD_ALIGN_Paragraph:设置对象居中、对齐等from docx.enum.text import WD_TAB_ALIGNMENT,WD_TAB_LEADER:设置制表符from docx.shared import Inches:设置图像大小,单位为英寸from docx.shared import Cm:设置图像大小,单位为厘米from docx.shared import Pt:设置像素、缩进等from docx.shared import RGBColor:设置字体颜色from docx.shared import Length:设置宽度

2、相关概念


Document:表示一个word文档。Paragraph对象:表示word文档中的一个段落Paragraph对象的text属性:表示段落中的文本内容。

3、创建并写入内容

from docx import Documentfrom docx.shared import Cm# 如果不带参数,则创建一个空的docx文档;如果带参数,则打开参数指定的文档doc = Document()# 设置大标题,级别为0;设置小标题,级别分别为1-3doc.add_heading('Python操作Word文档演示', level=0)doc.add_heading('小标题1', level=1)doc.add_heading('小标题2', level=2)doc.add_heading('小标题3', level=3)# 添加段落内容par1 = doc.add_paragraph('这是第一个段落!')par2 = doc.add_paragraph('这是第二个段落!')par3 = doc.add_paragraph('这是第三个段落!')# 为段落添加文字块par1.add_run('这是段落1的文字块')par2.add_run('这是段落2的文字块,后面换行').add_break()# 添加图片,宽度设定为16厘米,高度为9厘米。如果不指定尺寸,则为图片原始尺寸doc.add_picture('办公自动化1.jpg', width=Cm(16), height=Cm(9))# 添加表格,使用二维列表为表格添加内容lst = [['姓名', '语文', '数学'], ['小明', 92, 89], ['小红', 99, 90], ['小花', 94, 96]]# 创建表格对象,5行3列table = doc.add_table(rows=5, cols=3)for row in range(len(lst)): cells = table.rows[row].cells for col in range(len(lst[0])): cells[col].text = str(lst[row][col])# 保存文档内容,必须带参数doc.save('test.docx')

生成的test.docx文档内容如下:


可以看到,创建的表格是没有边框的,python-docx模块里未包含设置边框信息的方法。

4、打开并读取内容

from docx import Document# 创建Document对象,打开文档doc = Document('test.docx')# 遍历输出段落内容print('总段落数:', len(doc.paragraphs))for i in doc.paragraphs: print(i.text)# 按行遍历输出表格内容for table in doc.tables: for row in table.rows: for cell in row.cells: print(cell.text)# 按列遍历输出表格内容for table in doc.tables: for col in table.columns: for cell in col.cells: print(cell.text)


三、综合应用实例

某公司有几十或几百员工,每名员工都有一份word文档的档案信息表,文档格式均相同,见下图:

现在想制作一个综合信息统计表格,要求内容有姓名、性别、出生年月等8项内容,这些内容在员工档案信息表里都有,如果采取手动复制粘贴或者重新录入的形式,工作量太大,还容易出错,这时就可以使用python写一段代码来批量处理,简单快捷!

代码如下:

from docx import Documentfrom pathlib import Path# 自定义函数,返回表格指定行列的单元格内容def result(row, col): cell = table.rows[row].cells return cell[col].textpath = Path('档案信息') # 创建路径对象,档案信息文件夹里是所有档案登记表files = list(path.glob('*.docx')) # 获取档案信息文件夹下所有docx文件,并转换成列表tj_list = [] # 定义统计信息列表# 遍历读取所有档案登记表的所需内容for file in files: # 遍历得到的所有文件 doc = Document(file) # 打开当前文档 table = doc.tables[0] # 指定读取的表格 # 利用自定义函数result读取文档中指定位置的内容,放置到列表中 lst = [result(0, 1), result(0, 3), result(0, 5), result(1, 1), result(2, 1), result(2, 3), result(3, 1), result(4, 5)] tj_list.append(lst) # 将读取的内容列表追加到统计信息列表中# 将读取的所有内容即tj_list的值写入到综合统计表中doc = Document('综合统计表.docx')for table in doc.tables: for row in range(len(tj_list)): cells = table.rows[row 1].cells for col in range(len(tj_list[0])): cells[col].text = str(tj_list[row][col])doc.save('综合统计表.docx')

程序运行后生成的综合信息统计表如下:


最新文章