You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用openpyxl遍历子文件夹批量插入图片到对应Excel工作表遇阻

解决方案

问题分析

原遍历代码存在几个关键问题:

  • count2 仅初始化时递增一次,无法遍历所有子文件夹
  • for files in Path + '\\' + str(count2) 实际是遍历路径字符串的每个字符,而非子文件夹列表
  • 未为每个子文件夹匹配对应的工作表,图片都插入到了同一个工作表中

修正后的完整代码

把创建工作表和插入图片的逻辑整合到一个循环里,确保每个子文件夹对应正确的工作表:

from openpyxl import Workbook
from openpyxl.drawing.image import Image
from openpyxl.utils import get_column_letter
import os
from natsort import natsorted

# 初始化工作簿
wb = Workbook()
main_path = r'C:\Users\wes\Desktop\PhotoLog\Photos'

# 获取所有子文件夹并按自然排序(保证顺序和工作表编号对应)
subfolders = natsorted([f for f in os.listdir(main_path) if os.path.isdir(os.path.join(main_path, f))])

for idx, folder_name in enumerate(subfolders, start=1):
    # 创建对应工作表并设置格式
    ws = wb.create_sheet(title=str(idx))
    ws.page_setup.orientation = ws.ORIENTATION_LANDSCAPE
    ws.page_setup.paperSize = ws.PAPERSIZE_A5
    ws.sheet_view.view = "pageLayout" 

    # 设置行高和列宽(优化原循环,无需嵌套遍历所有行列)
    for row in range(1, 45):
        ws.row_dimensions[row].height = 18
    for col in range(1, 45):
        col_letter = get_column_letter(col)
        ws.column_dimensions[col_letter].width = 3
    
    # 合并单元格(只需执行一次,无需嵌套循环)
    merge_ranges = [
        'A12:C13', 'D12:V13', 'W12:Y13', 'Z12:AR13',
        'A25:C26', 'D25:V26', 'W25:Y26', 'Z25:AR26'
    ]
    for rng in merge_ranges:
        ws.merge_cells(rng)
    
    # 获取当前文件夹下的所有jpg图片并排序
    folder_path = os.path.join(main_path, folder_name)
    image_paths = natsorted([os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.lower().endswith('.jpg')])
    
    # 按布局插入图片
    anchor_positions = ['E2', 'AA2', 'E15', 'AA15']
    for img_idx, img_path in enumerate(image_paths[:4]):  # 最多取4张图
        if img_idx < len(anchor_positions):
            img = Image(img_path)
            # 可选:调整图片大小以适配单元格(如果需要)
            # img.width = 300
            # img.height = 200
            ws.add_image(img, anchor=anchor_positions[img_idx])

# 删除默认的Sheet工作表
if 'Sheet' in wb.sheetnames:
    wb.remove(wb['Sheet'])

# 保存工作簿
wb.save(r'C:\Users\wes\Desktop\PhotoLog\PhotoLog.xlsx')

关键优化点

  • 使用natsorted对子文件夹排序,保证工作表编号和文件夹顺序一致
  • 用os.path.join拼接路径,避免系统路径分隔符问题
  • 把格式设置和图片插入整合到同一个循环,确保每个文件夹对应正确的工作表
  • 提取合并单元格范围到列表,减少重复代码
  • 限制最多插入4张图片,避免超出布局位置
  • 增加图片路径的小写后缀判断,兼容.JPG格式的图片

内容的提问来源于stack exchange,提问作者Wes Sholders

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:58:17