python-docx操作word,在指定位置插入图片

python-docx操作word,在指定位置插入图片。

  • 介绍
    • 安装python-docx
    • 导入包
    • 连接要操作的word文档
    • 添加文字
    • 添加图片
    • 添加表格
    • run对象
    • 定位
      • 表格定位
      • 段落定位(文字定位)
    • 整套代码

介绍

本文主要说明定位的方式,我们要在文档中插入一些图片时,python-docx里的add_picture总是插入在文档末尾,所以我们需要定位,有表格定位,段落定位。表格定位是比较精确的,但有时候我们的word里根本不是表格,所以我们只能段落定位。但段落定位后插入图片也还是在文档末尾。利用run对象解决。

安装python-docx

pip install python-docx # 博主安装的是0.8.10

导入包

import docx  # docx用来连接word

连接要操作的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对象(可以理解为可以单独设置格式的段落内对象)。
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

你可能感兴趣的:(文件操作,python)