当前位置:   article > 正文

使用python实现班级考勤小软件_exe小应用_入门小demo_基于python的网页版考勤系统

基于python的网页版考勤系统


前言

考勤小软件
在大学中,班委考勤需要对每一个同学的情况进行登记,以便在期末的时候能够反馈给相关的老师上课考勤情况。
通常我们班委使用的都是Excel表格进行汇总,当数据量变多了,容易发生差错,而且这个工作重复性高,花费时间多。在这个背景下,我便诞生做一个小软件的想法。


一、运行的环境

本篇文章使用的语言为:python
使用的软件为:PyCharm
使用的库主要为:openpyxl、PyQt5


二、效果图

首先初始化表格,输入这个学期的每个课程名称,我这里输入的是:

python linux mysql php java

初始化
这里同学的名字是代码中写定的一个列表,可以根据自己的需求更改
左上角输入的字符串格式应该如下:

7/24 星期一
课程1
应到:45
实到:44
请假:王靓仔
迟到:康靓仔 张靓仔
旷课:无

打开软件

在这里插入图片描述
点击处理后:
在这里插入图片描述
对应的我们在查询窗口输入:

张靓仔

在这里插入图片描述
同时,在对应目录下我们也可以直接访问生成的data.xlsx文件:
在这里插入图片描述

在这里插入图片描述

三、代码详情

1.导入相关库

import calendar
import datetime
import os
import re
import sys
from PyQt5.QtCore import Qt
from PyQt5 import QtGui
from PyQt5.QtWidgets import QWidget, QLabel, QLineEdit, QPushButton, QApplication, QMainWindow, QTextEdit, \
    QDesktopWidget, QTableWidget, QTableWidgetItem, QGridLayout, QHeaderView
from openpyxl.reader.excel import load_workbook
from openpyxl.workbook import Workbook
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.初始化

代码如下:


class ExcelWindow(QWidget):  # 格式化
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle("初始化表格")
        self.setGeometry(100, 100, 400, 200)
        self.label = QLabel("请输入这个学期的课程名称(以空格分隔):", self)
        self.label.move(20, 20)
        self.edit = QLineEdit(self)
        self.edit.setGeometry(20, 50, 360, 40)
        self.button = QPushButton("开始操作", self)
        self.button.setGeometry(100, 110, 200, 40)
        self.button.clicked.connect(self.start_operation)
        icon = QtGui.QIcon("icon.png")  # 替换为你的图标文件名
        self.setWindowIcon(icon)

    def start_operation(self):
        # 使用sys.executable获取运行的exe文件路径
        current_dir = os.path.dirname(sys.executable)
        # 拼接 "data.xlsx" 的完整路径
        xlsx_path = os.path.join(current_dir, 'data.xlsx')
        workbook = Workbook()  # 创建一个新的文件
        name_ = ["xxx", "xxx", "xxx", "xxx", "xxx", "xxx","xxx"]  # 获取同学姓名
        courses = self.edit.text().split()  # 获取用户输入的课程名称并按空格分隔成列表
        # 创建新工作表
        stat_sheet = workbook.create_sheet('统计')

        # 初始化标题行
        stat_sheet.cell(row=1, column=1, value='姓名')
        stat_sheet.cell(row=1, column=2, value='请假总次数')
        stat_sheet.cell(row=1, column=3, value='迟到总次数')
        stat_sheet.cell(row=1, column=4, value='旷课总次数')
        for i, name in enumerate(name_, start=2):
            stat_sheet.cell(row=i, column=1, value=name)
        jk = 5
        for course in courses:
            sheet = workbook.create_sheet(course)  # 创建工作表,并以课程名命名
            stat_sheet.cell(row=1, column=jk, value=course)
            jk += 1
            stat_sheet.cell(row=1, column=jk, value='请假次数')
            jk += 1
            stat_sheet.cell(row=1, column=jk, value='迟到次数')
            jk += 1
            stat_sheet.cell(row=1, column=jk, value='旷课次数')
            jk += 1
            # 初始化第一行从B列开始往右每个单元格为同学的姓名
            for i, names in enumerate(name_, start=2):
                sheet.cell(row=1, column=i, value=names.strip())
            # 初始化A列从第二行开始往下分别为当前系统时间往后六个月的每一天
            today = datetime.datetime.today().date()  # 获取当前计算机时间
            dates = []
            for i in range(6 * 30):
                date = today + datetime.timedelta(days=i)
                month_days = calendar.monthrange(date.year, date.month)[
                    1]  # 获取当前日期所在月份的天数
                while date.day > month_days:  # 如果日期超过当月天数,则向后推一天
                    date += datetime.timedelta(days=1)
                dates.append(date)
            for i, date in enumerate(dates, start=2):
                sheet.cell(row=i, column=1, value=date.strftime("%m/%d"))
        default_sheet = workbook.get_sheet_by_name('Sheet')  # 删除默认的Sheet工作表
        workbook.remove_sheet(default_sheet)

        workbook.save(filename=xlsx_path)  # 保存工作簿
        workbook.close()  # 关闭工作簿
        self.close()  # 关闭窗口
  • 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

3.让初始窗口居中

def execute_code():
    app = QApplication([])
    window = ExcelWindow()
    screen_width = QDesktopWidget().screenGeometry().width()  # 获取屏幕大小
    screen_height = QDesktopWidget().screenGeometry().height()  # 计算窗口左上角坐标使其位于屏幕正中央
    x = (screen_width - window.width()) // 2
    y = (screen_height - window.height()) // 2
    window.move(x, y)  # 移动窗口到屏幕正中央
    window.show()
    app.exec_()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

4.数据处理


class MainWindow(QMainWindow):  # 录入信息
    name_ = ["xxx", "xxx", "xxx", "xxx", "xxx", "xxx", "xxx"]

    def __init__(self):
        super().__init__()
        self.setWindowTitle("录入信息")
        self.setWindowIcon(QtGui.QIcon("icon.png"))  # 替换为你的图标文件名

        self.label = QLabel("请输入字符串:")
        self.text_edit = QTextEdit()
        self.button = QPushButton("处理")
        self.statistics_button = QPushButton("统计")
        self.info_label = QLabel("执行情况:")
        self.info_edit = QTextEdit()
        self.info_labels = QLabel("查看个人:")
        self.query_text = QLineEdit()
        self.query_button = QPushButton("查询")
        self.info_edits = QTableWidget()
        self.info_edits.setColumnCount(4)
        self.info_edits.verticalHeader().setVisible(False)
        self.info_edits.horizontalHeader().setVisible(False)
        self.info_edits.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.info_edits.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)

        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        layout = QGridLayout(central_widget)
        layout.addWidget(self.label, 0, 0)
        layout.addWidget(self.text_edit, 1, 0, 3, 1)
        layout.addWidget(self.button, 4, 0)

        layout.addWidget(self.statistics_button, 5, 0)
        layout.addWidget(self.info_label, 6, 0)
        layout.addWidget(self.info_edit, 7, 0)

        layout.addWidget(self.info_labels, 0, 1)
        layout.addWidget(self.query_text, 0, 2)
        layout.addWidget(self.query_button, 0, 5)

        layout.addWidget(self.info_edits, 1, 1, 7, 6)

        self.button.clicked.connect(self.process_string)
        self.statistics_button.clicked.connect(self.statistics_)
        self.query_text.returnPressed.connect(self.table_content)
        self.query_button.clicked.connect(self.table_content)
        self.statistics_()

        self.adjustSize()
    

    def table_content(self):
        name = self.query_text.text()  # 获取文本框中的输入字符串
        if name not in self.name_:
            self.query_text.clear()
            self.info_edits.clear()
            self.info_edits.setItem(0, 0, QTableWidgetItem(name))
            self.info_edits.setItem(0, 1, QTableWidgetItem("被吃掉了"))
            self.info_edits.setItem(0, 2, QTableWidgetItem('嗷呜~'))
            self.update_info(f'查无此人')
            self.update_info(self.formatted_time)
            self.update_info(f'__________________')

            return
        self.query_text.clear()
        wb = load_workbook(xlsx_path)
        stat_sheet = wb['统计']
        sheet_count = len(wb.sheetnames) + 1
        self.info_edits.setRowCount(sheet_count)
        item = QTableWidgetItem('姓名/课程')
        item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.info_edits.setItem(0, 0, item)
        item = QTableWidgetItem('请假')
        item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.info_edits.setItem(0, 1, item)
        item = QTableWidgetItem('迟到')
        item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.info_edits.setItem(0, 2, item)
        item = QTableWidgetItem('旷课')
        item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.info_edits.setItem(0, 3, item)

        ll = 1
        jj = 0
        for row in range(2, stat_sheet.max_row + 1):
            if stat_sheet.cell(row=row, column=1).value == name:
                for col in range(1, stat_sheet.max_column + 1):
                    value = stat_sheet.cell(row=row, column=col).value
                    item = QTableWidgetItem(str(value))
                    item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
                    self.info_edits.setItem(ll, jj, item)

                    jj += 1
                    if jj % 4 == 0:
                        ll += 1
                        jj = 0
                break
        self.update_info(f'完成查询')
        self.update_info(self.formatted_time)
        self.update_info(f'__________________')
        wb.close()

        self.info_edits.resizeRowsToContents()
    current_time = datetime.datetime.now()
    formatted_time = current_time.strftime('%y-%m-%d %H:%M:%S')
    def process_string(self):
        input_string = self.text_edit.toPlainText()  # 获取文本框中的输入字符串
        self.text_edit.clear()  # 清除文本框内容
        result = list(map(str, input_string.split("\n")))  # 调用处理字符串的函数
        current_time = datetime.datetime.now()
        formatted_time = current_time.strftime('%y-%m-%d %H:%M:%S')

        def extract_numbers(input_string):
            numbers = re.findall(r'\d+', input_string)
            return numbers

        def edit_excel_cell(sheet_name, value1, date_to_find, content):
            # 使用sys.executable获取运行的exe文件路径
            current_dir = os.path.dirname(sys.executable)
            # 拼接 "data.xlsx" 的完整路径
            xlsx_path = os.path.join(current_dir, 'data.xlsx')
            if os.path.exists(xlsx_path):  # 如果文件存在,则读取它
                workbook = load_workbook(filename=xlsx_path)
                if sheet_name in workbook.sheetnames:
                    sheet = workbook[sheet_name]  # 查找与给定值1相等的单元格
                    for row in range(1, sheet.max_row + 1):
                        for column in range(1, sheet.max_column + 1):
                            cell_value = sheet.cell(
                                row=row, column=column).value
                            if cell_value == value1:
                                break
                        else:
                            continue
                        break
                    else:
                        self.update_info("未找到与给定值1相等的单元格,请检查输入。")
                        self.update_info(formatted_time)
                        return
                    row_num = None
                    for row in sheet.iter_rows(min_row=2, max_row=sheet.max_row, min_col=1, max_col=1):
                        cell = row[0]
                        if cell.value == date_to_find.strftime("%m/%d"):
                            row_num = cell.row
                            break

                    if row_num is not None:
                        column_to_edit = column
                    else:
                        self.update_info("找不到指定日期,请检查输入。")
                        self.update_info(formatted_time)
                        return
                    sheet.cell(row=row_num, column=column_to_edit,
                               value=content)
                    workbook.save(filename=xlsx_path)  # 保存工作簿
                    self.update_info("单元格内容已编辑并保存成功。")
                    self.update_info(formatted_time)
                else:
                    self.update_info("指定的工作表不存在,请检查输入。")
                    self.update_info(formatted_time)
                workbook.close()  # 关闭工作簿
            else:
                self.update_info("Excel文件不存在,请先创建并保存。")
                self.update_info(formatted_time)
        try:
            da_te_ = extract_numbers(result[0])
            index_0 = da_te_[0]
            index_2 = da_te_[1]
            course = result[1]
            attend = list(result[4].split(":")[1].split(" "))
            late = list(result[5].split(":")[1].split(" "))
            absent = list(result[6].split(":")[1].split(" "))
            new_list = [index_0, index_2, course, attend] + [late] + [absent]
            self.data = new_list  # 存储数据到self.data
            date_to_find = datetime.date(
                2023, int(self.data[0]), int(self.data[1]))
            if self.data[3][0] == '无':
                pass
            else:
                for i in self.data[3]:
                    edit_excel_cell(self.data[2], i, date_to_find, "请假")
            if self.data[4][0] == '无':
                pass
            else:
                for i in self.data[4]:
                    edit_excel_cell(self.data[2], i, date_to_find, "迟到")
            if self.data[5][0] == '无':
                pass
            else:
                for i in self.data[5]:
                    edit_excel_cell(self.data[2], i, date_to_find, "旷课")
        except:
            self.update_info(f'输入的数据错误')
            self.update_info(formatted_time)
        self.update_info(f'__________________')
    def statistics_(self):
        # 统计代码
        wb = load_workbook(xlsx_path)

        stat_sheet = wb['统计']
        row_ = 2

        for name in self.name_:
            absent_count = 0
            late_count = 0
            skip_count = 0
            ren = 5
            # 遍历所有表格统计次数
            for sheet in wb.worksheets:
                if sheet.title == '统计':
                    continue
                absent_counts = 0
                late_counts = 0
                skip_counts = 0
                for col in range(2, sheet.max_column + 1):
                    cell = sheet.cell(row=1, column=col)
                    if cell.value != name:
                        continue

                    for row in range(2, sheet.max_row + 1):
                        cell_value = sheet.cell(row=row, column=col).value
                        if cell_value == '请假':
                            absent_count += 1
                            absent_counts += 1
                        elif cell_value == '迟到':
                            late_count += 1
                            late_counts += 1
                        elif cell_value == '旷课':
                            skip_count += 1
                            skip_counts += 1
                stat_sheet.cell(row=row_, column=ren, value=sheet.title)
                ren +=1
                stat_sheet.cell(row=row_, column=ren, value=absent_counts)
                ren += 1
                stat_sheet.cell(row=row_, column=ren, value=late_counts)
                ren += 1
                stat_sheet.cell(row=row_, column=ren, value=skip_counts)
                ren += 1

            # 写入统计结果
            stat_sheet.cell(row=row_, column=2, value=absent_count)
            stat_sheet.cell(row=row_, column=3, value=late_count)
            stat_sheet.cell(row=row_, column=4, value=skip_count)

            row_ += 1
        wb.save(filename=xlsx_path)
        # 在界面显示统计信息
        # 获取行数列数
        rows = stat_sheet.max_row

        # 设置界面表格行数
        self.info_edits.setRowCount(rows)
        # 填充数据
        for r in range(1, rows + 1):
            for c in range(1, 5):
                value = stat_sheet.cell(row=r, column=c).value
                item = QTableWidgetItem(str(value))
                item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
                self.info_edits.setItem(r - 1, c - 1, item)
        # 保存工作簿
        self.update_info(f'完成统计')
        self.update_info(self.formatted_time)
        self.update_info(f'__________________')
        wb.save(filename=xlsx_path)
        wb.close()

    def close_window(self):
        self.close()  # 关闭窗口

    def update_info(self, message):
        self.info_edit.moveCursor(QtGui.QTextCursor.Start)  # 将光标移动到文本框开头
        self.info_edit.insertPlainText(message + "\n")  # 插入新的文本
  • 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
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271

5.定义数据处理窗口函数

def processing_content():
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()
  • 1
  • 2
  • 3
  • 4
  • 5

6.获取文件存储位置

current_dir = os.path.dirname(sys.executable)  # 使用sys.executable获取运行的exe文件路径
xlsx_path = os.path.join(current_dir, 'data.xlsx')  # 拼接 "data.xlsx" 的完整路径
  • 1
  • 2

7.代码触发逻辑

if os.path.exists(xlsx_path):
    processing_content()
else:
    execute_code()
    processing_content()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

四.打包成exe文件

首先我们要安装相应的库 Pyinstaller,可以直接在cmd使用pip命令

pip install pyinstaller 
  • 1

当然一般情况,我们国内网速比较慢,需要进行换源操作,这里换清华源:

pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple/
  • 1

然后我们再到文件相应的目录下,在地址框输入cmd
在这里插入图片描述

然后再输入:pyinstaller -F -w 后面加你的文件名

在这里插入图片描述

五.总结

这个小软件实现了openpyxl库和PyQt5库的简单运用,能让我们初步认识openpyxl库和PyQt5库。如果有不足的地方,还请各位大佬指点。

六.完整代码

import calendar
import datetime
import os
import re
import sys
from PyQt5.QtCore import Qt
from PyQt5 import QtGui
from PyQt5.QtWidgets import QWidget, QLabel, QLineEdit, QPushButton, QApplication, QMainWindow, QTextEdit, \
    QDesktopWidget, QTableWidget, QTableWidgetItem, QGridLayout, QHeaderView
from openpyxl.reader.excel import load_workbook
from openpyxl.workbook import Workbook



class ExcelWindow(QWidget):  # 格式化
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle("初始化表格")
        self.setGeometry(100, 100, 400, 200)
        self.label = QLabel("请输入这个学期的课程名称(以空格分隔):", self)
        self.label.move(20, 20)
        self.edit = QLineEdit(self)
        self.edit.setGeometry(20, 50, 360, 40)
        self.button = QPushButton("开始操作", self)
        self.button.setGeometry(100, 110, 200, 40)
        self.button.clicked.connect(self.start_operation)
        icon = QtGui.QIcon("icon.png")  # 替换为你的图标文件名
        self.setWindowIcon(icon)

    def start_operation(self):
        # 使用sys.executable获取运行的exe文件路径
        current_dir = os.path.dirname(sys.executable)
        # 拼接 "data.xlsx" 的完整路径
        xlsx_path = os.path.join(current_dir, 'data.xlsx')
        workbook = Workbook()  # 创建一个新的文件
        name_ = ["xxx", "xxx", "xxx", "xxx", "xxx", "xxx", "xxx"]  # 获取同学姓名
        courses = self.edit.text().split()  # 获取用户输入的课程名称并按空格分隔成列表
        # 创建新工作表
        stat_sheet = workbook.create_sheet('统计')

        # 初始化标题行
        stat_sheet.cell(row=1, column=1, value='姓名')
        stat_sheet.cell(row=1, column=2, value='请假总次数')
        stat_sheet.cell(row=1, column=3, value='迟到总次数')
        stat_sheet.cell(row=1, column=4, value='旷课总次数')
        for i, name in enumerate(name_, start=2):
            stat_sheet.cell(row=i, column=1, value=name)
        jk = 5
        for course in courses:
            sheet = workbook.create_sheet(course)  # 创建工作表,并以课程名命名
            stat_sheet.cell(row=1, column=jk, value=course)
            jk += 1
            stat_sheet.cell(row=1, column=jk, value='请假次数')
            jk += 1
            stat_sheet.cell(row=1, column=jk, value='迟到次数')
            jk += 1
            stat_sheet.cell(row=1, column=jk, value='旷课次数')
            jk += 1
            # 初始化第一行从B列开始往右每个单元格为同学的姓名
            for i, names in enumerate(name_, start=2):
                sheet.cell(row=1, column=i, value=names.strip())
            # 初始化A列从第二行开始往下分别为当前系统时间往后六个月的每一天
            today = datetime.datetime.today().date()  # 获取当前计算机时间
            dates = []
            for i in range(6 * 30):
                date = today + datetime.timedelta(days=i)
                month_days = calendar.monthrange(date.year, date.month)[
                    1]  # 获取当前日期所在月份的天数
                while date.day > month_days:  # 如果日期超过当月天数,则向后推一天
                    date += datetime.timedelta(days=1)
                dates.append(date)
            for i, date in enumerate(dates, start=2):
                sheet.cell(row=i, column=1, value=date.strftime("%m/%d"))
        default_sheet = workbook.get_sheet_by_name('Sheet')  # 删除默认的Sheet工作表
        workbook.remove_sheet(default_sheet)

        workbook.save(filename=xlsx_path)  # 保存工作簿
        workbook.close()  # 关闭工作簿
        self.close()  # 关闭窗口


def execute_code():
    app = QApplication([])
    window = ExcelWindow()
    screen_width = QDesktopWidget().screenGeometry().width()  # 获取屏幕大小
    screen_height = QDesktopWidget().screenGeometry().height()  # 计算窗口左上角坐标使其位于屏幕正中央
    x = (screen_width - window.width()) // 2
    y = (screen_height - window.height()) // 2
    window.move(x, y)  # 移动窗口到屏幕正中央
    window.show()
    app.exec_()


class MainWindow(QMainWindow):  # 录入信息
    name_ = ["xxx", "xxx", "xxx", "xxx", "xxx", "xxx", "xxx"]

    def __init__(self):
        super().__init__()
        self.setWindowTitle("录入信息")
        self.setWindowIcon(QtGui.QIcon("icon.png"))  # 替换为你的图标文件名

        self.label = QLabel("请输入字符串:")
        self.text_edit = QTextEdit()
        self.button = QPushButton("处理")
        self.statistics_button = QPushButton("统计")
        self.info_label = QLabel("执行情况:")
        self.info_edit = QTextEdit()
        self.info_labels = QLabel("查看个人:")
        self.query_text = QLineEdit()
        self.query_button = QPushButton("查询")
        self.info_edits = QTableWidget()
        self.info_edits.setColumnCount(4)
        self.info_edits.verticalHeader().setVisible(False)
        self.info_edits.horizontalHeader().setVisible(False)
        self.info_edits.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.info_edits.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)

        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        layout = QGridLayout(central_widget)
        layout.addWidget(self.label, 0, 0)
        layout.addWidget(self.text_edit, 1, 0, 3, 1)
        layout.addWidget(self.button, 4, 0)

        layout.addWidget(self.statistics_button, 5, 0)
        layout.addWidget(self.info_label, 6, 0)
        layout.addWidget(self.info_edit, 7, 0)

        layout.addWidget(self.info_labels, 0, 1)
        layout.addWidget(self.query_text, 0, 2)
        layout.addWidget(self.query_button, 0, 5)

        layout.addWidget(self.info_edits, 1, 1, 7, 6)

        self.button.clicked.connect(self.process_string)
        self.statistics_button.clicked.connect(self.statistics_)
        self.query_text.returnPressed.connect(self.table_content)
        self.query_button.clicked.connect(self.table_content)
        self.statistics_()

        self.adjustSize()
    

    def table_content(self):
        name = self.query_text.text()  # 获取文本框中的输入字符串
        if name not in self.name_:
            self.query_text.clear()
            self.info_edits.clear()
            self.info_edits.setItem(0, 0, QTableWidgetItem(name))
            self.info_edits.setItem(0, 1, QTableWidgetItem("被吃掉了"))
            self.info_edits.setItem(0, 2, QTableWidgetItem('嗷呜~'))
            self.update_info(f'查无此人')
            self.update_info(self.formatted_time)
            self.update_info(f'__________________')

            return
        self.query_text.clear()
        wb = load_workbook(xlsx_path)
        stat_sheet = wb['统计']
        sheet_count = len(wb.sheetnames) + 1
        self.info_edits.setRowCount(sheet_count)
        item = QTableWidgetItem('姓名/课程')
        item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.info_edits.setItem(0, 0, item)
        item = QTableWidgetItem('请假')
        item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.info_edits.setItem(0, 1, item)
        item = QTableWidgetItem('迟到')
        item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.info_edits.setItem(0, 2, item)
        item = QTableWidgetItem('旷课')
        item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.info_edits.setItem(0, 3, item)

        ll = 1
        jj = 0
        for row in range(2, stat_sheet.max_row + 1):
            if stat_sheet.cell(row=row, column=1).value == name:
                for col in range(1, stat_sheet.max_column + 1):
                    value = stat_sheet.cell(row=row, column=col).value
                    item = QTableWidgetItem(str(value))
                    item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
                    self.info_edits.setItem(ll, jj, item)

                    jj += 1
                    if jj % 4 == 0:
                        ll += 1
                        jj = 0
                break
        self.update_info(f'完成查询')
        self.update_info(self.formatted_time)
        self.update_info(f'__________________')
        wb.close()

        self.info_edits.resizeRowsToContents()
    current_time = datetime.datetime.now()
    formatted_time = current_time.strftime('%y-%m-%d %H:%M:%S')
    def process_string(self):
        input_string = self.text_edit.toPlainText()  # 获取文本框中的输入字符串
        self.text_edit.clear()  # 清除文本框内容
        result = list(map(str, input_string.split("\n")))  # 调用处理字符串的函数
        current_time = datetime.datetime.now()
        formatted_time = current_time.strftime('%y-%m-%d %H:%M:%S')

        def extract_numbers(input_string):
            numbers = re.findall(r'\d+', input_string)
            return numbers

        def edit_excel_cell(sheet_name, value1, date_to_find, content):
            # 使用sys.executable获取运行的exe文件路径
            current_dir = os.path.dirname(sys.executable)
            # 拼接 "data.xlsx" 的完整路径
            xlsx_path = os.path.join(current_dir, 'data.xlsx')
            if os.path.exists(xlsx_path):  # 如果文件存在,则读取它
                workbook = load_workbook(filename=xlsx_path)
                if sheet_name in workbook.sheetnames:
                    sheet = workbook[sheet_name]  # 查找与给定值1相等的单元格
                    for row in range(1, sheet.max_row + 1):
                        for column in range(1, sheet.max_column + 1):
                            cell_value = sheet.cell(
                                row=row, column=column).value
                            if cell_value == value1:
                                break
                        else:
                            continue
                        break
                    else:
                        self.update_info("未找到与给定值1相等的单元格,请检查输入。")
                        self.update_info(formatted_time)
                        return
                    row_num = None
                    for row in sheet.iter_rows(min_row=2, max_row=sheet.max_row, min_col=1, max_col=1):
                        cell = row[0]
                        if cell.value == date_to_find.strftime("%m/%d"):
                            row_num = cell.row
                            break

                    if row_num is not None:
                        column_to_edit = column
                    else:
                        self.update_info("找不到指定日期,请检查输入。")
                        self.update_info(formatted_time)
                        return
                    sheet.cell(row=row_num, column=column_to_edit,
                               value=content)
                    workbook.save(filename=xlsx_path)  # 保存工作簿
                    self.update_info("单元格内容已编辑并保存成功。")
                    self.update_info(formatted_time)
                else:
                    self.update_info("指定的工作表不存在,请检查输入。")
                    self.update_info(formatted_time)
                workbook.close()  # 关闭工作簿
            else:
                self.update_info("Excel文件不存在,请先创建并保存。")
                self.update_info(formatted_time)
        try:
            da_te_ = extract_numbers(result[0])
            index_0 = da_te_[0]
            index_2 = da_te_[1]
            course = result[1]
            attend = list(result[4].split(":")[1].split(" "))
            late = list(result[5].split(":")[1].split(" "))
            absent = list(result[6].split(":")[1].split(" "))
            new_list = [index_0, index_2, course, attend] + [late] + [absent]
            self.data = new_list  # 存储数据到self.data
            date_to_find = datetime.date(
                2023, int(self.data[0]), int(self.data[1]))
            if self.data[3][0] == '无':
                pass
            else:
                for i in self.data[3]:
                    edit_excel_cell(self.data[2], i, date_to_find, "请假")
            if self.data[4][0] == '无':
                pass
            else:
                for i in self.data[4]:
                    edit_excel_cell(self.data[2], i, date_to_find, "迟到")
            if self.data[5][0] == '无':
                pass
            else:
                for i in self.data[5]:
                    edit_excel_cell(self.data[2], i, date_to_find, "旷课")
        except:
            self.update_info(f'输入的数据错误')
            self.update_info(formatted_time)
        self.update_info(f'__________________')
    def statistics_(self):
        # 统计代码
        wb = load_workbook(xlsx_path)

        stat_sheet = wb['统计']
        row_ = 2

        for name in self.name_:
            absent_count = 0
            late_count = 0
            skip_count = 0
            ren = 5
            # 遍历所有表格统计次数
            for sheet in wb.worksheets:
                if sheet.title == '统计':
                    continue
                absent_counts = 0
                late_counts = 0
                skip_counts = 0
                for col in range(2, sheet.max_column + 1):
                    cell = sheet.cell(row=1, column=col)
                    if cell.value != name:
                        continue

                    for row in range(2, sheet.max_row + 1):
                        cell_value = sheet.cell(row=row, column=col).value
                        if cell_value == '请假':
                            absent_count += 1
                            absent_counts += 1
                        elif cell_value == '迟到':
                            late_count += 1
                            late_counts += 1
                        elif cell_value == '旷课':
                            skip_count += 1
                            skip_counts += 1
                stat_sheet.cell(row=row_, column=ren, value=sheet.title)
                ren +=1
                stat_sheet.cell(row=row_, column=ren, value=absent_counts)
                ren += 1
                stat_sheet.cell(row=row_, column=ren, value=late_counts)
                ren += 1
                stat_sheet.cell(row=row_, column=ren, value=skip_counts)
                ren += 1

            # 写入统计结果
            stat_sheet.cell(row=row_, column=2, value=absent_count)
            stat_sheet.cell(row=row_, column=3, value=late_count)
            stat_sheet.cell(row=row_, column=4, value=skip_count)

            row_ += 1
        wb.save(filename=xlsx_path)
        # 在界面显示统计信息
        # 获取行数列数
        rows = stat_sheet.max_row

        # 设置界面表格行数
        self.info_edits.setRowCount(rows)
        # 填充数据
        for r in range(1, rows + 1):
            for c in range(1, 5):
                value = stat_sheet.cell(row=r, column=c).value
                item = QTableWidgetItem(str(value))
                item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
                self.info_edits.setItem(r - 1, c - 1, item)
        # 保存工作簿
        self.update_info(f'完成统计')
        self.update_info(self.formatted_time)
        self.update_info(f'__________________')
        wb.save(filename=xlsx_path)
        wb.close()

    def close_window(self):
        self.close()  # 关闭窗口

    def update_info(self, message):
        self.info_edit.moveCursor(QtGui.QTextCursor.Start)  # 将光标移动到文本框开头
        self.info_edit.insertPlainText(message + "\n")  # 插入新的文本

def processing_content():
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()


current_dir = os.path.dirname(sys.executable)  # 使用sys.executable获取运行的exe文件路径
xlsx_path = os.path.join(current_dir, 'data.xlsx')  # 拼接 "data.xlsx" 的完整路径
if os.path.exists(xlsx_path):
    processing_content()
else:
    execute_code()
    processing_content()

  • 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
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358
  • 359
  • 360
  • 361
  • 362
  • 363
  • 364
  • 365
  • 366
  • 367
  • 368
  • 369
  • 370
  • 371
  • 372
  • 373
  • 374
  • 375
  • 376
  • 377
  • 378
  • 379
  • 380
  • 381
  • 382
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/431840
推荐阅读
相关标签
  

闽ICP备14008679号