赞
踩
使用 Python 自动化生成工作日历 Excel 表格
在日常工作中,我们经常需要记录和统计每天的工作情况,包括早间工作、下午工作、晚上工作,以及遇到的问题点和是否解决等。手动维护这个工作日历既耗时又容易出错,因此我们可以使用 Python 来自动化这个过程。
我们希望实现以下功能:
为了实现上述功能,我们使用了 Python 的 wxPython
库来创建一个简单的 GUI 程序,并利用 openpyxl
库来生成和操作 Excel 文件。
首先,我们创建了一个 DateInputDialog
类,用于弹出一个对话框,让用户选择年份和月份:
class DateInputDialog(wx.Dialog): def __init__(self, parent): super().__init__(parent, title="选择年月") self.year = None self.month = None # 创建年份和月份选择器 year_choices = [str(i) for i in range(2023, 2026)] self.year_picker = wx.Choice(self, choices=year_choices) self.month_picker = wx.Choice(self, choices=["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]) # 创建确认和取消按钮 btn_sizer = wx.BoxSizer(wx.HORIZONTAL) confirm_btn = wx.Button(self, label="确认") cancel_btn = wx.Button(self, label="取消") btn_sizer.Add(confirm_btn, 0, wx.ALL, 5) btn_sizer.Add(cancel_btn, 0, wx.ALL, 5) # 创建整体布局 sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(wx.StaticText(self, label="选择年份:"), 0, wx.ALL, 5) sizer.Add(self.year_picker, 0, wx.ALL, 5) sizer.Add(wx.StaticText(self, label="选择月份:"), 0, wx.ALL, 5) sizer.Add(self.month_picker, 0, wx.ALL, 5) sizer.Add(btn_sizer, 0, wx.ALL | wx.ALIGN_CENTER, 5) self.SetSizer(sizer) confirm_btn.Bind(wx.EVT_BUTTON, self.on_confirm) cancel_btn.Bind(wx.EVT_BUTTON, self.on_cancel)
然后,我们创建了一个 MyFrame
类,它继承自 wx.Frame
。在这个类中,我们添加了一个"生成 Excel 表格"的按钮,当用户点击该按钮时,会弹出年月选择对话框,并根据用户的选择生成 Excel 表格:
class MyFrame(wx.Frame): def __init__(self, parent, title): super().__init__(parent, title=title, size=(800, 600)) self.panel = wx.Panel(self) self.generate_btn = wx.Button(self.panel, label="生成 Excel 表格") self.generate_btn.Bind(wx.EVT_BUTTON, self.on_generate) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.generate_btn, 0, wx.ALL | wx.ALIGN_CENTER, 20) self.panel.SetSizer(sizer) def on_generate(self, event): dialog = DateInputDialog(self) if dialog.ShowModal() == wx.ID_OK: year = dialog.year month = dialog.month # 创建 Excel 表格 wb = openpyxl.Workbook() ws = wb.active ws['A1'] = "日期" ws['B1'] = "早间工作" ws['C1'] = "下午工作" ws['D1'] = "晚上工作" ws['E1'] = "问题点" ws['F1'] = "是否解决" ws['G1'] = "工作比例" # 填充日期和样式 row = 2 start_date = datetime.date(year, month, 1) end_date = datetime.date(year, month, calendar.monthrange(year, month)[1]) current_date = start_date while current_date <= end_date: ws.cell(row=row, column=1, value=current_date) if current_date.weekday() in [5, 6]: # 周末 ws.cell(row=row, column=1).fill = PatternFill(fgColor="DDDDDD", fill_type="solid") elif current_date in holidays: # 节假日 ws.cell(row=row, column=1).fill = PatternFill(fgColor="FFFF00", fill_type="solid") row += 1 current_date += datetime.timedelta(days=1) # 保存 Excel 表格 wb.save(f"{year}年{month}月工作表.xlsx") wx.MessageBox(f"{year}年{month}月工作表已生成", "提示") dialog.Destroy()
在这段代码中,我们使用 openpyxl
库创建了一个新的 Excel 工作表,并填充了标题行。然后,我们遍历从选定年月的第一天到最后一天,将每一天的日期添加到工作表中。如果遇到周末或节假日,我们会使用不同的背景色进行标记。最终,我们将工作表保存为一个 Excel 文件。
import wx import datetime import openpyxl from openpyxl.styles import PatternFill import calendar # Add this line # Define the holidays holidays = [ datetime.date(2024, 1, 1), # New Year's Day datetime.date(2024, 5, 1), # Labor Day datetime.date(2024, 5, 2), # New Year's Day datetime.date(2024, 5, 3), # Labor Day datetime.date(2024, 5, 4), # Labor Day datetime.date(2024, 5, 5), # Labor Day # Add more holidays as needed ] class DateInputDialog(wx.Dialog): def __init__(self, parent): super().__init__(parent, title="选择年月") self.year = None self.month = None # 创建年份和月份选择器 year_choices = [str(i) for i in range(2023, 2026)] self.year_picker = wx.Choice(self, choices=year_choices) self.month_picker = wx.Choice(self, choices=["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]) # 创建确认和取消按钮 btn_sizer = wx.BoxSizer(wx.HORIZONTAL) confirm_btn = wx.Button(self, label="确认") cancel_btn = wx.Button(self, label="取消") btn_sizer.Add(confirm_btn, 0, wx.ALL, 5) btn_sizer.Add(cancel_btn, 0, wx.ALL, 5) # 创建整体布局 sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(wx.StaticText(self, label="选择年份:"), 0, wx.ALL, 5) sizer.Add(self.year_picker, 0, wx.ALL, 5) sizer.Add(wx.StaticText(self, label="选择月份:"), 0, wx.ALL, 5) sizer.Add(self.month_picker, 0, wx.ALL, 5) sizer.Add(btn_sizer, 0, wx.ALL | wx.ALIGN_CENTER, 5) self.SetSizer(sizer) # 绑定事件 confirm_btn.Bind(wx.EVT_BUTTON, self.on_confirm) cancel_btn.Bind(wx.EVT_BUTTON, self.on_cancel) def on_confirm(self, event): self.year = int(self.year_picker.GetStringSelection()) self.month = int(self.month_picker.GetStringSelection()) self.EndModal(wx.ID_OK) def on_cancel(self, event): self.EndModal(wx.ID_CANCEL) class MyFrame(wx.Frame): def __init__(self, parent, title): super().__init__(parent, title=title, size=(800, 600)) self.panel = wx.Panel(self) # 创建一个按钮,用于弹出选择年月的对话框 self.generate_btn = wx.Button(self.panel, label="生成 Excel 表格") self.generate_btn.Bind(wx.EVT_BUTTON, self.on_generate) # 创建整体布局 sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.generate_btn, 0, wx.ALL | wx.ALIGN_CENTER, 20) self.panel.SetSizer(sizer) def on_generate(self, event): # 弹出选择年月的对话框 dialog = DateInputDialog(self) if dialog.ShowModal() == wx.ID_OK: year = dialog.year month = dialog.month # 创建 Excel 表格 wb = openpyxl.Workbook() ws = wb.active ws['A1'] = "日期" ws['B1'] = "早间工作" ws['C1'] = "下午工作" ws['D1'] = "晚上工作" ws['E1'] = "问题点" ws['F1'] = "是否解决" ws['G1'] = "工作比例" # 填充日期和样式 row = 2 start_date = datetime.date(year, month, 1) end_date = datetime.date(year, month, calendar.monthrange(year, month)[1]) current_date = start_date while current_date <= end_date: ws.cell(row=row, column=1, value=current_date) if current_date.weekday() in [5, 6]: # 周末 ws.cell(row=row, column=1).fill = PatternFill(fgColor="DDDDDD", fill_type="solid") elif current_date in holidays: # 节假日 ws.cell(row=row, column=1).fill = PatternFill(fgColor="FFFF00", fill_type="solid") row += 1 current_date += datetime.timedelta(days=1) # 保存 Excel 表格 wb.save(f"{year}年{month}月工作表.xlsx") wx.MessageBox(f"{year}年{month}月工作表已生成", "提示") dialog.Destroy() if __name__ == "__main__": app = wx.App() frame = MyFrame(None, "Excel 表格生成") frame.Show() app.MainLoop()
通过使用 Python 的 wxPython
和 openpyxl
库,我们实现了一个简单但功能强大的工作日历 Excel 表格生成器。这不仅可以帮助我们自动化日常工作记录的过程,还可以让我们更方便地查看和分析工作情况。如果您有类似的需求,不妨尝试使用这个脚本!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。