python批量插入图片到word文档里并且实现分栏排版

查看 97|回复 10
作者:Eks6666   
[Python] 纯文本查看 复制代码from docx import Document
from docx.shared import Inches
import os
img_folder=input('请输入图片目录路径:')
img_paths = (os.path.join(img_folder, f) for f in os.listdir(img_folder) if f.endswith(('.jpg','.png')))
# 创建一个新的word文档
doc = Document()
width = Inches(2.8)
height = Inches(1.7)
# 将所有图片插入到word文档中
table = doc.add_table(rows=0, cols=2)
for i, img_path in enumerate(img_paths):
        if i % 2 == 0:
                row_cells = table.add_row().cells
        cell = row_cells[i % 2]
        para = cell.add_paragraph()
        run = para.add_run()
        pic = run.add_picture(img_path, width=width, height=height)
        print(f'{os.path.basename(img_path)}已插入到word文档中...')
        para.alignment = 1
print('所有图片已全部插入...')
doc.save('图片.docx')
效果图:

文档, 图片

hfol85   


cai2532 发表于 2024-12-27 17:11
真的很不错,如果能在图片下面再增加图片对应名称效果会更好。楼主教下怎么才能实现这个效果?

基于楼主的创意由AI辅助修改的。希望有用。感谢楼主。
[Python] 纯文本查看 复制代码import tkinter as tk
from tkinter import filedialog
from docx import Document
from docx.shared import Inches
import os
def get_folder_path():
    folder_selected = filedialog.askdirectory()
    folder_path.set(folder_selected)
def get_output_file_path():
    output_file_selected = filedialog.asksaveasfilename(
        defaultextension=".docx",
        filetypes=[("Word文档", "*.docx"), ("所有文件", "*.*")],
        title="选择输出文件的位置和名称"
    )
    output_filename.set(output_file_selected)
def create_document():
    img_folder = folder_path.get()
    output_file = output_filename.get()
   
    if not img_folder:
        status_label.config(text='请先选择图片文件夹。')
        return
    if not output_file:
        status_label.config(text='请先选择输出文件的位置和名称。')
        return
    image_paths = [os.path.join(img_folder, f) for f in os.listdir(img_folder) if f.lower().endswith(('.jpg', '.jpeg', '.png'))]
   
    if not image_paths:
        status_label.config(text='在指定的文件夹中没有找到支持的图片格式。')
        return
    status_label.config(text='正在创建文档...')
    window.update()
   
    doc = Document()
    width = Inches(2.8)
    height = Inches(1.7)
    table = doc.add_table(rows=0, cols=2)
    for i, img_path in enumerate(image_paths):
        if i % 2 == 0:
            row_cells = table.add_row().cells
        cell = row_cells[i % 2]
        para = cell.add_paragraph()
        run = para.add_run()
        try:
            pic = run.add_picture(img_path, width=width, height=height)
            para.alignment = 1
            # 在图片下方添加文件名
            file_name_para = cell.add_paragraph(os.path.basename(img_path))
            file_name_para.alignment = 1
            status_label.config(text=f'{os.path.basename(img_path)} 已插入到 word 文档中...')
            window.update()
        except Exception as e:
            status_label.config(text=f'无法插入 {os.path.basename(img_path)},原因:{e}')
            window.update()
   
    if image_paths and (i + 1) % 2!= 0:
        status_label.config(text='最后一行只有一个图片,如有需要请手动调整格式。')
   
    try:
        doc.save(output_file)
        status_label.config(text=f'所有图片已全部插入,文档保存为 "{os.path.basename(output_file)}"。')
        window.update()
        open_document(output_file)
    except Exception as e:
        status_label.config(text=f'无法保存文档,原因:{e}')
def open_document(file_path):
    try:
        if os.path.isfile(file_path):
            if os.name == 'nt':  # Windows系统
                os.startfile(file_path)
            elif os.name == 'posix':  # macOS或Linux系统
                os.system(f'open "{file_path}"')
            else:
                status_label.config(text='不支持的操作系统,无法自动打开文档。')
    except Exception as e:
        status_label.config(text=f'无法打开文档,原因:{e}')
window = tk.Tk()
window.title('图片插入Word文档工具')
folder_path = tk.StringVar()
output_filename = tk.StringVar()
tk.Label(window, text='图片文件夹路径:').grid(row=0, column=0)
entry_folder_path = tk.Entry(window, textvariable=folder_path, width=40).grid(row=0, column=1)
browse_button_folder = tk.Button(window, text='浏览', command=get_folder_path).grid(row=0, column=2)
tk.Label(window, text='输出文件路径:').grid(row=1, column=0)
entry_output_filename = tk.Entry(window, textvariable=output_filename, width=40).grid(row=1, column=1)
browse_button_output = tk.Button(window, text='浏览', command=get_output_file_path).grid(row=1, column=2)
start_button = tk.Button(window, text='开始', command=create_document).grid(row=2, column=1)
status_label = tk.Label(window, text='', fg='blue')
status_label.grid(row=3, column=1)
window.mainloop()
hfol85   

用AI辅助改了一版带操作界面的。


image.png (8.95 KB, 下载次数: 0)
下载附件
2024-12-27 17:13 上传

aahong   

谢谢楼主的分享,正在需要这种功能
shengforever   

收藏了,排版这块很nice
wkdxz   

很不错的代码,感谢提供分享
智勇1900   

同理可以试试其他功能,也是插入图片
Eks6666
OP
  


shengforever 发表于 2024-12-27 14:40
收藏了,排版这块很nice

感谢铁子的大力支持
china-ray   

这个代码挺好,之前都是手动一张一张排版的。就是不知道针对不同尺寸、横版、竖版的图片也是同样的压缩尺寸吗?
390660860   

谢谢!留存备用
您需要登录后才可以回帖 登录 | 立即注册

返回顶部