本文主要说明定位的方式,我们要在文档中插入一些图片时,python-docx里的add_picture总是插入在文档末尾,所以我们需要定位,有表格定位,段落定位。表格定位是比较精确的,但有时候我们的word里根本不是表格,所以我们只能段落定位。但段落定位后插入图片也还是在文档末尾。利用run对象解决。
pip install python-docx # 博主安装的是0.8.10
import docx # docx用来连接word
doc = docx.Document(file_dir_path)
例:
doc = docx.Document(r"D:\test.docx") # 连接test.docx文档
doc.add_paragraph('text....')
doc.add_picture(r'D:\图片.png')
tab = doc.add_table(rows=4, cols=4) # 添加一个4行4列的空表
cell = tab.cell(1, 3) # 获取第二行三列的表格对象(索引是从0开始的)
# 在单元格中添加文本:
cell.text='要添加的文字'
如果希望同一段落中的文本格式不同,就需要使用Run对象(可以理解为可以单独设置格式的段落内对象)。
run = paragraph = doc.add_paragraph('文字内容').add_run('文字内容')
run.bold = True # 设置字体为粗体
chg_font(run, fontname='微软雅黑', size=Pt(12)) # 设置字体和字号
首先你的word里必须有表格,才能定位,表格定位是精确的
for i, p in enumerate(doc.paragraphs): # 遍历所有的段落
print(str(i) + ":"+ str(p.text))
if len(p.text) != 0:
for i in range(len(p.runs)): # p.runs代表p这个段落下所有文字的列表
print(p.runs[i].text) # 当打印时,发现p.runs把段落自动分解了
if '你要定位的内容' in p.text:
p.runs[-1].add_break() # 添加一个折行
p.runs[-1].add_picture(photo_dit_path) # 在runs的最后一段文字后添加图片
import sys
import docx
import os
'''
遍历目录在wrod里插入图片。
'''
def file_name_walk(file_dir, kwword):
"""
返回要求文件的绝对路径(短边右边测试报告)
:param file_dir: 目录
:param kwword: 文件编号
:return:
"""
for root, dirs, files in os.walk(file_dir):
# print("root", root) # 当前目录路径
# print("dirs", dirs) # 当前路径下所有子目录
# print("files", files) # 当前路径下所有非目录子文件
for f in files:
if kwword in f:
return root + "\\" + f
# 拿到图片的名字,并按逗号分隔
def photo_name_walk(photo_dir,file_dir, suffix='.png'):
"""
从图片名字里拿到能找到word的编号(或者名字)
:param photo_dir: 图片路径
:param file_dir: 要插入wrod文件的路径
:param suffix: 文件后缀
:return:
"""
for root, dirs, files in os.walk(photo_dir):
for f in files:
if os.path.splitext(f)[1] == suffix:
photo_name = os.path.splitext(f)[0]
# 对photo按照逗号进行分割
file_number = photo_name.split(',')[0] # 利用file_number找到对应的word文档
position_number = photo_name.split(',')[1] # 利用position找到文档要插入的地方
# photo 的绝对路径
photo_dit_path = root + "\\" + f
# 找到word的绝对路径
file_dir_path = file_name_walk(file_dir, file_number)
# 在word里插入图片
word_main(file_dir_path, photo_dit_path, position_number)
def word_main(file_dir_path, photo_dit_path, position_number):
'''
在word里插入图片
:param file_dir_path: 文件绝对路径
:param photo_dit_path: 图片绝对路径
:param position_number: 要定位的地方,在该word中找position_number这串字符串
:return:
'''
doc = docx.Document(file_dir_path)
for i, p in enumerate(doc.paragraphs): # 遍历所有的段落
print(str(i) + ":"+ str(p.text))
if len(p.text) != 0:
for i in range(len(p.runs)): # p.runs代表p这个段落下所有文字的列表
print(str(i)+':::::')
print(p.runs[i].text) # 当打印时,发现p.runs把段落自动分解了
if position_number in p.text:
p.runs[-1].add_break() # 添加一个折行
p.runs[-1].add_picture(photo_dit_path) # 在runs的最后一段文字后添加图片
# os.remove(photo_dit_path)
doc.save(file_dir_path) # 保存文件
break
file_dir = sys.argv[1]
# print('file_dir', file_dir)
photo_dir = sys.argv[2]
# print('photo_dir', photo_dir)
photo_name_walk(photo_dir, file_dir)
[参考文档]
[1]: https://www.cnblogs.com/xied/p/12619571.html