一、简介
比较重要的机房、动力供电等运维场景中,一般需要24小时有人值班,领导往往会在每个月前整理一个Excel值班表格。每次手工制作表格比较浪费时间,所以这里花了一点时间,用Python代码实现自动导出Excel值班表的功能。
实现场景:
共4个人值班,白夜和夜班两班倒,这里假设四个人分别称为为A,B,C,D。
以第一个人A为例,A第一天上白班;第二天白班A休息,然后上夜班;第三天、第四天休息两天;第五天又开始上白班……简单地说“白班–>夜班–>休两天”然后再“白班–>夜班–>休两天”,以此轮流,每个人都一样(全年没有节假日和周末),如下图:
二、实现步骤
1.思路
表头:先根据实际情况,定义一个表头列表,for循环根据行和列规则写入Excel;
日期:获取当月天数后,参考表头规则写入Excel即可;
白班和夜班:首先定义一个循环阶段的所有值班人员为一个列表,然后定义一个规则,每次取第一个人员开始值班,取完后从列表中拿掉,拿掉后放在列表的尾部,以此取值,后续不断循环。
UI界面:写完以上内容到Excel后,可以加入一个图形界面,方便使用,如下简单粗暴的界面:
2.代码
1.使用到的模块:
from xlsxwriter import workbook
import datetime,calendar
from tkinter.ttk import *
from tkinter import *
import tkinter.messagebox
import os
2.UI窗口类:Schedule_Gui
class Schedule_Gui:
def __init__(self,initWindow):
self.initWindow = initWindow
def set_init_window(self):
#self.initWindow = Tk()
self.nw = 0.1
self.nh = 0.2
self.initWindow.title("24h值班表生成工具 - Author: 张琼杰")
self.initWindow.geometry('1000x700')
self.initWindow.resizable(0,0)
self.importExcelButton = Button(self.initWindow,text='导出Excel',width='8',bg='lightblue',command=self.WriteToExcel)
self.importExcelButton.place(relx=0.49,rely=self.nh+0.4)
mainmenu = Menu(self.initWindow)
menuFile = Menu(mainmenu)
mainmenu.add_cascade(label='文件',menu=menuFile)
menuFile.add_command(label='退出',command=self.initWindow.destroy)
self.initWindow.config(menu=mainmenu)
if (os.path.isfile("images\logo.png")):
self.backgroundImage = tkinter.PhotoImage(file=r"images\logo.png",width=300,height=110)
self.imageLabel = Label(self.initWindow, image=self.backgroundImage)
self.initWindow.update()
self.bg_width = self.backgroundImage.width()/self.initWindow.winfo_width()
self.bg_height = self.backgroundImage.height()/self.initWindow.winfo_height()
self.imageLabel.place(relx=1-self.bg_width, rely=0, width=300, height=110)
self.ProLabel = Label(self.initWindow, text='当前月份')
self.ProLabel.place(relx=0.1, rely=self.nh+0.1, relwidth=0.1)
self.ProCombobox = Combobox(self.initWindow, textvariable=vars, values=[''])
self.ProCombobox.place(relx=0.18, rely=self.nh+0.1, relwidth=0.1)
self.ProCombobox.set(value=str(datetime.datetime.now().month)+"月")
self.pathLabel = Label(self.initWindow, text='保存路径')
self.pathLabel.place(relx=0.1, rely=self.nh+0.2, relwidth=0.1)
self.defaultPath = tkinter.StringVar(value='D:\\')
self.pathEntry = Entry(self.initWindow, bd=3,textvariable=self.defaultPath)
self.pathEntry.place(relx=0.18, rely=self.nh+0.2, relwidth=0.3)
def WriteToExcel(self):
if(self.ProCombobox.get() != '' and self.pathEntry.get() != ''):
path = self.pathEntry.get()
try:
if(os.path.exists(path)):
if (path[len(path) - 1] == '\\'):
filePath = path + "24h_Schedule" + ".xlsx"
else:
filePath = path + "\\" + "24h_Schedule" + ".xlsx"
print(filePath)
sche = Schedule_Export()
sche.export_schedule(filePath)
else:
tkinter.messagebox.showerror(title="错误:",message="路径不存在!")
except:
tkinter.messagebox.showwarning(title="警告:",message="此文件可能已打开,请关闭后重试!")
else:
tkinter.messagebox.showinfo(title="提示:",message="请补全内容后重试!")
3.主代码逻辑操作类:Schedule_Export
您暂时无权查看此隐藏内容!
4.调用:
def main():
gui = Tk()
gui.update()
agui = Schedule_Gui(gui)
agui.set_init_window()
gui.mainloop()
if __name__ == "__main__":
main()
3.打包py文件为exe格式文件
参考琼杰笔记文章:Python调用阿里云API接口实现自定义功能【二】——DescribeInstance窗口操作
打包完就可以愉快地使用了,此实现功能比较简单,仅供参考,后续可能在此基础添加其他功能。
评论前必须登录!
注册