使用 Python 自动化生成工作日历 Excel 表格
在日常工作中,我们经常需要记录和统计每天的工作情况,包括早间工作、下午工作、晚上工作,以及遇到的问题点和是否解决等。手动维护这个工作日历既耗时又容易出错,因此我们可以使用 Python 来自动化这个过程。
功能需求
我们希望实现以下功能:
- 允许用户选择生成工作日历的年份和月份。
- 根据选定的年月,自动生成一个 Excel 表格,第一行包含以下标题:
- 日期
- 早间工作
- 下午工作
- 晚上工作
- 问题点
- 是否解决
- 工作比例
- 从选定年月的第一天开始,每天占一行,直到该月最后一天。
- 如果遇到周末或节假日,使用不同的背景色进行区分。
C:\pythoncode\new\weekreport.py
实现过程
为了实现上述功能,我们使用了 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 表格生成器。这不仅可以帮助我们自动化日常工作记录的过程,还可以让我们更方便地查看和分析工作情况。如果您有类似的需求,不妨尝试使用这个脚本!