python:我的任务调度程序不能显示超过 1 个任务

问题描述 投票:0回答:1
import openpyxl as xl
from datetime import date

workbook = xl.load_workbook('Schedule.xlsx')
sheet = workbook['Sheet1']
for column in range(2, sheet.max_column + 1):
    for row in range(2, sheet.max_row + 1):
        date1 = date.today()
        day1 = date1.strftime("%A")
        n = date1.weekday()
        days = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
        day2 = days[n + 1]
        cell = sheet.cell(row, column)
        time = sheet.cell(row, 1).value
        if sheet.cell(1, column).value == day1:
            if cell.value != None:
                reminder1 = f"{time}: {cell.value} "
            else:
                pass
        elif sheet.cell(1, column).value == day2:
            if cell.value != None:
                reminder2 = f"{time}: {cell.value}"
            else:
                pass
        else:
            pass
        
print(f"""REMINDER:
Today:
{reminder1}
Tommorow:
{reminder2}""")

这是我在 python 中的代码。 它从电子表格(“Schedule.xlsx”)获取输入并检查今天或明天是否有任何任务,如果有则发送提醒。 The spreadsheet 问题是如果一天有超过 1 个任务,python 只显示 1 个任务。 (对不起,我知道代码很乱,我是新手。) 谢谢

我尝试使用 for 循环,希望在有超过 1 个任务时重复相同的提醒,但它不起作用。 我也尝试制作列表的任务元素,然后尝试它,但代码变得复杂,很难安排时间完成任务。

reminders
1个回答
0
投票

这是您可以使用的方法,可能需要根据您想要对结果执行的操作进行调整。
首先对你的代码做一些说明

  1. 循环内的代码中设置了静态变量,不需要每次都设置。它们在运行期间不会改变,因此应该只在循环外设置一次。这些例子是
    date
    day1
    day2
    。您可以在我的示例中看到,这些是与代码顶部附近的其他静态项目一起设置的。
  2. 不需要整天循环遍历所有单元格。您只对今天和明天的时间表感兴趣,所以只需检查这两列即可。
  3. 检查非空单元格
    cell.value != None
    时,您不应使用相等运算符。根据您想要的比较,使用
    cell.value is None
    cell.value is not None

代码操作
因为我们知道今天是星期三,所以我们知道我们想要在您的 Excel 工作表中搜索 D 列。
这是静态的周一总是 B,周二总是 C 和周三总是 D 等(除非你修改工作表的布局).
因此,我们知道在哪一列运行循环,无需遍历 B、C 列来寻找正确的日期。单元格值循环设置为使用 iter_rows 仅循环所需的列

sheet.iter_rows(min_col=col, max_col=col, min_row=2, max_row=12) 

min 和 max column 是列号,即天数加 2,因为列从 1 开始。行 min 设置为 2 以跳转标题行,max 为 12,因为这又是一个设置值,行覆盖上午 11:00 至晚上 9:00 的时间。
同样只需要遍历今天的列,我们使用单元格

offset
属性在我们向下移动今天的列时同时从明天的列中获取值。
然后将找到的今天和明天的提醒添加到他们自己的字典中。这些根据从字典中查找的单元格当前行号保存提醒描述和时间
time_dict
.
注意这也可以作为单元格偏移来完成,使用当前列中的负数作为
column=
值来读取A列中相应的单元格

这会产生两个字典,日期名称作为键,值作为子字典,其中时间是键,提醒描述是值,例如

{'Wednesday': {'1:00 PM': 'Running checks on Project 5', '3:00 PM': 'Audit regarding Project 14'}}

然后只需打印出信息或根据需要使用即可。我使用了一个列表,

display_list
来组合两个词典,以便轻松循环遍历相同的打印代码。

注意
如果今天是星期天,代码将失败,因为需要从 H 列返回到 B。不知道是否需要这样做,因为它看起来可能是一个工作日历,但如果需要,可以包括该检查。

import openpyxl as xl
from datetime import date

days_list = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
time_dict = {2: '11:00 AM', 3: '12:00 AM', 4: '1:00 PM', 5: '2:00 PM', 6: '3:00 PM', 7: '4:00 PM', 8: '5:00 PM',
             9: '6:00 PM', 10: '7:00 PM', 11: '8:00 PM', 12: '9:00 PM'}

date = date.today().weekday()
day1 = days_list[date]
day2 = days_list[date + 1]

workbook = xl.load_workbook('Schedule.xlsx')
sheet = workbook['Sheet1']

### Create Dictionary for today and tomorrow
today_dict = {day1: {}}
tomorrow_dict = {day2: {}}
display_list = [today_dict, tomorrow_dict]

### Start loop at todays column from the expected position of today
col = 2 + date
for column in sheet.iter_rows(min_col=col, max_col=col, min_row=2, max_row=12):
    ### Checking cells in today's column
    for cell in column:
        ### Today's column
        if cell.value is not None:
            today_dict['Wednesday'].update({time_dict[cell.row]:cell.value})
        ### Tomorrows column
        elif cell.offset(column=1).value is not None:
            tomorrow_dict['Thursday'].update({time_dict[cell.row]:cell.offset(column=1).value})

### Print the reminders from the dictionaries
print('***Reminder***')
for dict in display_list:
    for sched_day, sched_items in dict.items():
        print(f'Schedule Day: {sched_day}')
        for tm, item in sched_items.items():
            print(f'Time: {tm} - {item}')
    print('')

输出
使用您的示例表将项目移至周三/周四。

***Reminder***
Schedule Day: Wednesday
Time: 1:00 PM - Running checks on Project 5
Time: 3:00 PM - Audit regarding Project 14

Schedule Day: Thursday
Time: 2:00 PM - Meeting with General Manager
© www.soinside.com 2019 - 2024. All rights reserved.