使用 Python 自动化生成工作日历 Excel 表格

使用 Python 自动化生成工作日历 Excel 表格

在日常工作中,我们经常需要记录和统计每天的工作情况,包括早间工作、下午工作、晚上工作,以及遇到的问题点和是否解决等。手动维护这个工作日历既耗时又容易出错,因此我们可以使用 Python 来自动化这个过程。
在这里插入图片描述

功能需求

我们希望实现以下功能:

  1. 允许用户选择生成工作日历的年份和月份。
  2. 根据选定的年月,自动生成一个 Excel 表格,第一行包含以下标题:
    • 日期
    • 早间工作
    • 下午工作
    • 晚上工作
    • 问题点
    • 是否解决
    • 工作比例
  3. 从选定年月的第一天开始,每天占一行,直到该月最后一天。
  4. 如果遇到周末或节假日,使用不同的背景色进行区分。
    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 的 wxPythonopenpyxl 库,我们实现了一个简单但功能强大的工作日历 Excel 表格生成器。这不仅可以帮助我们自动化日常工作记录的过程,还可以让我们更方便地查看和分析工作情况。如果您有类似的需求,不妨尝试使用这个脚本!

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值