多种方式实现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相关技术。