Python-如何防止for循环覆盖同一excel工作表
最近我一直在做我的小项目,为我自动生成工作时间电子表格。它只对我来说工作得很好,但当我想生成多个工作表(后来被称为工作表)和/或生成多个电子表格时,它会覆盖旧的工作表 对于打开、编辑和生成电子表格,我使用openpyxl库 我曾尝试将保存部分和生成部分移动到循环之外,等等,但这些都没有帮助我 问题是如何防止for循环覆盖文件而不是生成新文件 下面是该软件的主要部分Python-如何防止for循环覆盖同一excel工作表,python,excel,loops,for-loop,overwrite,Python,Excel,Loops,For Loop,Overwrite,最近我一直在做我的小项目,为我自动生成工作时间电子表格。它只对我来说工作得很好,但当我想生成多个工作表(后来被称为工作表)和/或生成多个电子表格时,它会覆盖旧的工作表 对于打开、编辑和生成电子表格,我使用openpyxl库 我曾尝试将保存部分和生成部分移动到循环之外,等等,但这些都没有帮助我 问题是如何防止for循环覆盖文件而不是生成新文件 下面是该软件的主要部分 cols = [2, 3, 4, 12] row = 9 hrs = 0 nhrs = 0 for worker in work
cols = [2, 3, 4, 12]
row = 9
hrs = 0
nhrs = 0
for worker in workers:
sheet.title = ('{} {}'.format(worker.name, worker.surename))
for day, hday in itertools.zip_longest(days, holidays):
if day.weekday() <= 4 and day not in holydays:
sheet.cell(row=row, column=cols[0]).value = '08:00'
sheet.cell(row=row, column=cols[1]).value = '16:00'
sheet.cell(row=row, column=cols[2]).value = '8 h'
hrs += 8
row += 1
elif day.weekday() > 4 and day not in holidays:
sheet.cell(column=cols[0], row=row).value = ''
row += 1
elif day in holidays:
sheet.cell(column=cols[3], row=row).value = '8 h'
nhrs += 8
row += 1
sheet.cell(column=cols[2], row=40).value = str(hrs) + ' h'
sheet.cell(column=cols[3], row=40).value = str(nhrs) + ' h'
workbook.save('SPREADSHEET_{}.xlsx'.format(native_month))
print('Done')
如果我没弄错的话,你希望每个工人都有一个新的电子表格,对吗 您当前所做的是反复使用同一个图纸对象,因此它会被覆盖。必须在for循环中为每个辅助对象创建一个新图纸。这应该做到:
cols = [2, 3, 4, 12]
row = 9
hrs = 0
nhrs = 0
workbook = Workbook() # assuming you imported openpyxl with *, else adjust
for worker in workers:
sheet = workbook.create_sheet('{} {}'.format(worker.name, worker.surename))
for day, hday in itertools.zip_longest(days, holidays):
if day.weekday() <= 4 and day not in holydays:
sheet.cell(row=row, column=cols[0]).value = '08:00'
sheet.cell(row=row, column=cols[1]).value = '16:00'
sheet.cell(row=row, column=cols[2]).value = '8 h'
hrs += 8
row += 1
elif day.weekday() > 4 and day not in holidays:
sheet.cell(column=cols[0], row=row).value = ''
row += 1
elif day in holidays:
sheet.cell(column=cols[3], row=row).value = '8 h'
nhrs += 8
row += 1
sheet.cell(column=cols[2], row=40).value = str(hrs) + ' h'
sheet.cell(column=cols[3], row=40).value = str(nhrs) + ' h'
workbook.save('SPREADSHEET_{}.xlsx'.format(native_month))
print('Done')
cols=[2,3,4,12]
行=9
小时=0
nhrs=0
工作簿=工作簿()
对于工人中的工人:
工作表=工作簿。创建工作表(“{}{}”。格式(worker.name,worker.surename))
对于天,itertools.zip中的hday最长(天、假日):
如果day.weekday()4和day不在节假日:
sheet.cell(列=列[0],行=行)。值=“”
行+=1
节假日的elif日:
sheet.cell(列=列[3],行=行)。值='8 h'
nhrs+=8
行+=1
单元格(列=cols[2],行=40)。值=str(hrs)+“h”
sheet.cell(列=cols[3],行=40).值=str(nhrs)+'h'
workbook.save('SPREADSHEET_{}.xlsx'.格式(本机月))
打印(‘完成’)
本月的定义在哪里?是否正在更改?您的代码不完整,没有包含,没有创建工作簿,没有向工作簿添加工作表,…Native month是从函数(方法)month_name_Native返回的字符串,它将month作为整数,并以我的母语(塞尔维亚语)返回month name。请在下面的注释中找到代码片段:def month_name_native(month):months=[“未知”、“一月”、“二月”、“市场”、“四月”、“主要”、“六月”、“七月”、“八月”、“九月”、“奥克托巴”,“decemba”]返回月份[month].upper()很好的猜测-应该有助于OP解决他的问题。不幸的是,此代码本身不会运行,因为OP.sad既没有指定工人
,天
也没有指定假日
。是的,这是正确的。唯一的问题是,我正在加载预先制作的电子表格(因为样式)。所以基本上我想要实现的是反复加载相同的模板工作表,并将其保存为单个文件或工作表。您是否尝试过target=workbook.copy_工作表(源)
我使用了target=workbook.copy_工作表(源)
现在处于for循环中,它按预期生成了新的工作表。剩下的唯一问题是如何为每个辅助工重置行,因为现在在第二个辅助工的工作表中,它从第39行左右开始。这非常简单。使用另一个变量代替row
,该变量跟踪每个辅助进程的行(例如addRow+=1
),并在辅助进程for循环的开头初始化为0。然后在.cell方法中使用row=row+addRow
而不是row=row
。附言:感谢您的回答/评论;-)
cols = [2, 3, 4, 12]
row = 9
hrs = 0
nhrs = 0
workbook = Workbook() # assuming you imported openpyxl with *, else adjust
for worker in workers:
sheet = workbook.create_sheet('{} {}'.format(worker.name, worker.surename))
for day, hday in itertools.zip_longest(days, holidays):
if day.weekday() <= 4 and day not in holydays:
sheet.cell(row=row, column=cols[0]).value = '08:00'
sheet.cell(row=row, column=cols[1]).value = '16:00'
sheet.cell(row=row, column=cols[2]).value = '8 h'
hrs += 8
row += 1
elif day.weekday() > 4 and day not in holidays:
sheet.cell(column=cols[0], row=row).value = ''
row += 1
elif day in holidays:
sheet.cell(column=cols[3], row=row).value = '8 h'
nhrs += 8
row += 1
sheet.cell(column=cols[2], row=40).value = str(hrs) + ' h'
sheet.cell(column=cols[3], row=40).value = str(nhrs) + ' h'
workbook.save('SPREADSHEET_{}.xlsx'.format(native_month))
print('Done')