当前位置:   article > 正文

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

使用 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

然后,我们创建了一个 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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

在这段代码中,我们使用 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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112

在这里插入图片描述

总结

通过使用 Python 的 wxPythonopenpyxl 库,我们实现了一个简单但功能强大的工作日历 Excel 表格生成器。这不仅可以帮助我们自动化日常工作记录的过程,还可以让我们更方便地查看和分析工作情况。如果您有类似的需求,不妨尝试使用这个脚本!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/613622
推荐阅读
相关标签
  

闽ICP备14008679号