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练习\venv\Lib\site-packages。
- 执行上面语句,系统还是首先在网上下载安装lxml模块,接着就是失败……折腾的我已经无语了!最后灵光乍现,想到了一个笨方法,干脆直接把本地环境中的python-docx文件夹拷贝到D:\python练习\venv\Lib\site-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 Document
from docx.shared import Cm
# 如果不带参数,则创建一个空的docx文档;如果带参数,则打开参数指定的文档
doc = Document()
# 设置大标题,级别为0;设置小标题,级别分别为1-3
doc.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 Document
from pathlib import Path
# 自定义函数,返回表格指定行列的单元格内容
def result(row, col):
cell = table.rows[row].cells
return cell[col].text
path = 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')
程序运行后生成的综合信息统计表如下: