作品展示
背景需求:
2024年3月5日,搭档指着她的笔记本电脑里面的一个docx页面(有2*2表格)
“你写的那个编程可不可以直接在里面插图片?”
她是工会成员,经常要开展工会活动,并拍照,写通讯,制作包含活动照片的word文本材料。
“拍的照片插入后不见了,要选择选择四周环绕才能出现,而且有些照片尺寸很大,还要调整照片大小”
我瞬间理解她的需求——手动在word里插入图片会遇到调整尺寸、设置图片占位的问题。
“今天就4张图片插进去,我自己做做很快的,如果你有好办法,我就不用改尺寸了!”
“可以做的,我写个代码。你下次用用看。”
思考:
她的需求让我想到了每学期结束时要提交的一份家教资料——《XX班微信及优质指导交流》
存在问题,
在一个docx页面的段落里面,直接插入8张(2张一行)的微信竖版截图,多张图片位置非常容易互相影响而反复移动。不能形成矩阵样式
解决思路:
插入表格,控制图片的占位,把边框隐藏
存在问题:
虽然有了表格单元格框住,图片不会移动了,但是手动插入图片后,图片依旧会“看不见”
——手动插入的图片是嵌入型,只能看见最下面一点点图片,
——手动插入图片长宽更大,并非单元格设置的大小
遗留问题:
痛苦的是,每张手动插入的图片,每张都要分别选择右上角的图片样式按钮-四周环绕。因而8张图片反复插入修改,也是非常烦的时候。
现状:
好在6个月才做一份记录,班主任手动插图也不辛苦。
我的思考:
我作为一位信息员,在掌握了Python在word表格插入图片方法后,哪怕只是一份8张图的word表,我肯定也希望能用代码来快速将图片插入word。
设计过程
素材准备:
word模板
、
微信截图的大小(华为手机的微信截屏大小)——1080*2400.
用程序做8张微信截图大小的彩色图片
'''
目的:制作纯色图 红橙黄绿青蓝紫)模仿8张微信截图
作者:阿夏
时间:2023年3月5日12:07
'''
import numpy as np
import matplotlib.pyplot as plt
import skimage.io as io
from PIL import Image
color=[(255,0, 0),(255, 165, 0),(255, 255, 0),(0, 255, 0),(0, 255, 255),(0, 0, 255),(255, 0, 255),(0, 0, 0)]
# 设置图像大小
width = 1080
height = 2400
# color = (255, 0, 0) # RGB格式表示红色
for i in range(len(color)):
# 创建空白图像对象并填充背景色
img = Image.new('RGB', (width, height), color=color[i])
img.save(r"C:\Users\jg2yXRZ\OneDrive\桌面\中X班微信优质指导交流\jpg\{}.jpg".format('%02d'%i))
jpg文件夹有8张微信截图(用色块替代)
代码设计:
前期我有过提取docx文件的单元格坐标,插入图片的代码,但是这一次我想用AI对话大师写个新的,看看是否能更简短一点。
【教学类-32-04】20231013十二生肖4.0(标记+1位数字+排序+左右分类)(大班:《我是中国人》偏科学-数)-CSDN博客文章浏览阅读86次。【教学类-32-04】20231013十二生肖4.0(标记+1位数字+排序+左右分类)(大班:《我是中国人》偏科学-数)https://blog.csdn.net/reasonsummer/article/details/133807867
以下是多次测试后重新补充的关键词
'''
微信优质家教指导(一页)8图
作者:阿夏
时间:2024年3月4日
'''
from docx import Document
from docx.shared import Inches,Cm
from PIL import Image
import os
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
# 打开Word文档
doc = Document(r'C:\Users\jg2yXRZ\OneDrive\桌面\中X班微信优质指导交流\中X班微信优质指导交流.docx')
# 获取jpg文件夹中的所有图片文件
image_folder = r'C:\Users\jg2yXRZ\OneDrive\桌面\中X班微信优质指导交流\jpg'
image_files = os.listdir(image_folder)
# 遍历每个表格单元格和对应的图片文件
# 遍历每个表格单元格和对应的图片文件
table = doc.tables[0] # 假设要操作的表格是第一个表格
cell_index = 0
for row in table.rows:
for cell in row.cells:
if cell_index >= len(image_files):
break
# 打开并调整图片大小
image_file = os.path.join(image_folder, image_files[cell_index])
image = Image.open(image_file)
image.thumbnail(( Cm(6),Cm(10.5))) # 调整图片大小为4x4厘米
# image.thumbnail((Inches(2), Inches(2))) # 调整图片大小为2x2英寸
# 清空单元格中的段落
for paragraph in cell.paragraphs:
cell._element.remove(paragraph._element)
# 清空单元格中的内容
for paragraph in cell.paragraphs:
for run in paragraph.runs:
run.text = ""
# 将图片插入到单元格中
# cell.add_paragraph().add_run().add_picture(image_file, width=Inches(2), height=Inches(2))
# cell.add_paragraph().add_run().add_picture(image_file, width=Cm(6),height=Cm(10.5))
# 插入图片到单元格中 并居中
paragraph = cell.add_paragraph()
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
run = paragraph.add_run()
run.add_picture(image_file, width=Cm(6), height=Cm(11.5))
cell_index += 1
# # 保存修改后的Word文档
doc.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\中X班微信优质指导交流\中4班微信优质指导交流(插图).docx')
按照第坐标00、01、10、11、20、21、30、31的方式插入从“红”到”黑”的八张图。
图片插入正确,需要优化:
1、不要看到黑色边框、
2、上下图片黏连
处理方式,
在模板里面把边框改成透明
把图片高度改小一点
附加需求——班级、班主任、时间
由于制作这份文本时,会使用以前的模板,
有时候我会插好8张图片后,忘记更改班级、班主任、时间,导致重复打印多张修改。
所以我想让程序自动替换掉这些基础信息。
由于只有那么一份要改,不想用EXCEL和Word{{}}的方法。
第一个思路:在第1行第1个字符插入“大”,反复询问测试后都无法成功。
第二个思路:“Word文本替换”的方法
替换代码解析
合并整体代码
'''
微信优质家教指导(一页)自动插入8张截图、替换班级、教师名字、时间
作者:阿夏
时间:2024年3月4日
'''
from docx import Document
from docx.shared import Inches,Cm
from PIL import Image
import os
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
# 打开Word文档
doc = Document(r'C:\Users\jg2yXRZ\OneDrive\桌面\中X班微信优质指导交流\中X班微信优质指导交流.docx')
# 获取jpg文件夹中的所有图片文件
image_folder = r'C:\Users\jg2yXRZ\OneDrive\桌面\中X班微信优质指导交流\jpg'
image_files = os.listdir(image_folder)
# 遍历每个表格单元格和对应的图片文件
# 遍历每个表格单元格和对应的图片文件
table = doc.tables[0] # 假设要操作的表格是第一个表格
cell_index = 0
for row in table.rows:
for cell in row.cells:
if cell_index >= len(image_files):
break
# 打开并调整图片大小
image_file = os.path.join(image_folder, image_files[cell_index])
image = Image.open(image_file)
image.thumbnail(( Cm(6),Cm(10.5))) # 调整图片大小为4x4厘米
# image.thumbnail((Inches(2), Inches(2))) # 调整图片大小为2x2英寸
# 清空单元格中的段落
for paragraph in cell.paragraphs:
cell._element.remove(paragraph._element)
# 清空单元格中的内容
for paragraph in cell.paragraphs:
for run in paragraph.runs:
run.text = ""
# 将图片插入到单元格中
# cell.add_paragraph().add_run().add_picture(image_file, width=Inches(2), height=Inches(2))
# cell.add_paragraph().add_run().add_picture(image_file, width=Cm(6),height=Cm(11.7))
# 插入图片到单元格中 并居中
paragraph = cell.add_paragraph()
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
run = paragraph.add_run()
run.add_picture(image_file, width=Cm(6), height=Cm(10.5))
cell_index += 1
# # 保存修改后的Word文档
# doc.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\中X班微信优质指导交流\中4班微信优质指导交流(插图).docx')
# 班级、教师、时间的文字替换
original=['X','Y','A','B','T']
new=['中','4','张三','李四光','2024.6.20']
# 遍历所有段落
for i in range(len(original)):
for paragraph in doc.paragraphs:
# 遍历段落中的每个运行对象
for run in paragraph.runs:
# 替换运行对象中的文本
a="{}".format(original[i])
b="{}".format(new[i])
if "{}".format(a) in run.text:
new_text = run.text.replace("{}".format(a) ,"{}".format(b))
# 清空原有运行对象的内容
run.text = ""
# 添加替换后的文本,并保留原有格式
new_run = run
new_run.text = new_text
# 保存修改后的Word文档
doc.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\中X班微信优质指导交流\{}{}班微信优质指导交流({}).docx'.format(new[0],new[1],new[4]))
最终结果
替换了基本信息,保留原来的格式,字号、字体——