使用Openpyxl将日期列表内容设为新建工作表标题的问题咨询
问题根因
- 嵌套循环逻辑错误:外层每次新建工作表后,内层都会遍历全部日期反复修改当前工作表名称,最终所有工作表都会被设置为
dates列表的最后一个日期 - 日期列表长度和工作表复制数量未做匹配校验,容易触发索引异常
修复后可直接运行的代码
from openpyxl import load_workbook from datetime import datetime, timedelta wb = load_workbook('C:/Users/Me/Desktop/Python/Excel/Roster.xlsx') start="24-10-2021" last="02-01-2022" start_date=datetime.strptime(start,"%d-%m-%Y") last_date=datetime.strptime(last,"%d-%m-%Y") dates=[] # 生成周期间隔的日期列表 while start_date <= (last_date - timedelta(days=7)): start_date += timedelta(days=7) dates.append(start_date.strftime("%d-%m-%Y")) original_ws = wb.active # 优先使用日期列表的长度作为要创建的工作表数量,避免数量不匹配 num_of_required_sheet_copies = len(dates) for n in range(num_of_required_sheet_copies): # 创建工作表副本 ws = wb.copy_worksheet(original_ws) # 直接取对应索引的日期作为工作表名,去掉多余的内层遍历循环 ws.title = dates[n] wb.save('C:/Users/Me/Desktop/Python/Excel/New.xlsx')
核心修改说明
- 删除了内层遍历
dates的冗余循环,改用外层循环的索引直接取对应位置的日期赋值给工作表标题,保证每个工作表对应唯一日期 - 将固定的工作表复制数量改为动态取
dates列表长度,避免手动设置的数量和生成的日期数量不匹配导致的异常 - 如果确实需要固定创建10个工作表,可以保留原来的
num_of_required_sheet_copies = 10设置,同时增加边界判断避免索引越界,比如赋值前加判断if n < len(dates),多余的工作表可以自定义命名规则
内容的提问来源于stack exchange,提问作者Python_User_27
相关产品推荐
相关产品推荐

