Python3,多种方式实现Word自动插入图片,尤其最后一种,值得推荐。

多种方式实现Word文档自动插入图片

1、引言

小屌丝:鱼哥,帮个忙。
小鱼:双十一购买啥了?
小屌丝:别打岔。
小鱼:你说啥?
小屌丝:大宝剑。
小鱼:这个可以, 正好天冷了, 出去放松放松。
小屌丝:… 你这是选择性的听不清啊。
小鱼:也不是,自动过滤。
小屌丝:帮个忙,完事去spa。
小鱼:这个可以,你说吧
小屌丝:就是把图片自动插入Word文档里面。
小鱼:就这!
在这里插入图片描述

小屌丝:还是足疗的动力大。
小鱼:唉,别这么说,我就是想单纯的分享点知识。
小屌丝:… 你说的都对。

2、代码示例

为了提升一些难度, 我们把图片插入Word文档,每行展示4个图片,

2.1 安装

这里我们用到三方库docx,PIL库
老规矩,第一步 安装

pip install python-docx pillow

其它安装方式,直接看这两篇:

Python3,选择Python自动安装第三方库,从此跟pip说拜拜!!
Python3:我低调的只用一行代码,就导入Python所有库!

安装完成,就可以写代码了。

2.2 实例

2.2.1 Demo1

# -*- coding:utf-8 -*-
# @Time   : 2023-11-08
# @Author : Carl_DJ

'''
实现功能:
	图片自动插入Word文档,
	每行插入4张图片
'''
from docx import Document  
from docx.shared import Inches  
from PIL import Image  
import io  
import random  
  
# 创建一个新的Word文档对象  
doc = Document()  
  
# 图片文件夹路径  
img_folder = "./data/images"  
  
# 获取文件夹中的所有图片文件  
img_files = [f for f in os.listdir(img_folder) if f.endswith(".png") or f.endswith(".jpg")]  
  
# 每行应插入的图片数量  
img_per_line = 4  
  
# 总图片数不够一行也要插入  
if len(img_files) < img_per_line:  
    img_per_line = len(img_files)  
  
# 随机选择图片并插入到文档中  
for i in range(0, len(img_files), img_per_line):  
    images = [Image.open(os.path.join(img_folder, f)) for f in img_files[i:i + img_per_line]]  
    widths, heights = zip(*(i.size for i in images))  
    total_width = sum(widths)  
    max_height = max(heights)  
    new_img = Image.new('RGB', (total_width, max_height), color = 'white')  
    x_offset = 0  
    for img in images:          
        new_img.paste(img, (x_offset,0))  
        x_offset += img.width  
    new_img_io = io.BytesIO()      
    new_img.save(new_img_io, format='PNG')   
    image = doc.add_picture(new_img_io, width=Inches(1.0)) # 你也可以设置图片的高度和宽度,这里设置为1英寸宽  
    doc.add_paragraph().add_run().add_picture(image) # 在新的一行添加图片  
      
# 保存文档  
doc.save("output.docx")


2.2.2 Demo2

# -*- coding:utf-8 -*-
# @Time   : 2023-11-08
# @Author : Carl_DJ

'''
实现功能:
	图片自动插入Word文档,
	每行插入4张图片
'''
from docx import Document
from PIL import Image
import os

# 创建一个新的Word文档
doc = Document()

# 获取图像目录中的所有文件名
image_dir = "./data/images"  
images = [f for f in os.listdir(image_dir) if os.path.isfile(os.path.join(image_dir, f))]

# 将每个图像插入到文档中
row_num = 0
col_num = 0
for i, image_name in enumerate(images):
    # 打开图像
    img = Image.open(os.path.join(image_dir, image_name))
    
    # 将图像转换为BytesIO对象
    byte_arr = io.BytesIO()
    img.save(byte_arr, format='PNG')
    byte_arr.seek(0)
    
    # 插入图像
    run = doc.add_run()
    inline_shape = run.add_picture(byte_arr, width=Cm(2), height=Cm(2))
    
    col_num += 1
    
    # 如果当前行已经满了(即插入了4张图片),则开始新的一行
    if col_num == 4:
        row_num += 1
        col_num = 0
        
# 保存文档
doc.save('output.docx')


3、总结

Demo1和Demo2 各有千秋,
Demo2写法更简洁,更直观。
其实在平时工作中,并不需要特别复杂的代码逻辑即可实现的功能,那一定不要写的太花哨,否则,后期的维护, 其他同学接手你的代码,确实很痛苦。

当然, 参数化,还是有必要的。
今天的分享就到这里。
每天掌握一个自动化小技巧,提升工作效率,省下的时间去SPA,是香的哦。

在这里插入图片描述

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 51认证讲师等
  • 认证金牌面试官
  • 职场面试及培训规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)测评一、二等奖获得者

关注小鱼,带你学习更多更专业更前言的Python相关技术。

猜你喜欢

转载自blog.csdn.net/wuyoudeyuer/article/details/134444068