使用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
相关产品推荐
相关产品推荐

