Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-如何防止for循环覆盖同一excel工作表_Python_Excel_Loops_For Loop_Overwrite - Fatal编程技术网

Python-如何防止for循环覆盖同一excel工作表

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

最近我一直在做我的小项目,为我自动生成工作时间电子表格。它只对我来说工作得很好,但当我想生成多个工作表(后来被称为工作表)和/或生成多个电子表格时,它会覆盖旧的工作表

对于打开、编辑和生成电子表格,我使用openpyxl库

我曾尝试将保存部分和生成部分移动到循环之外,等等,但这些都没有帮助我

问题是如何防止for循环覆盖文件而不是生成新文件

下面是该软件的主要部分

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')