python实验室预约系统(基于xlsx表)(石山代码)

前提紧要

1、需在程序同目录下创建一个实验室名称表classInfo.xlsx,格式如下:

2、需在程序同目录下创建一个学生信息表stuNo.xlsx,形如:

3、需在程序同目录下创建一个预约信息表clstme.xlsx,形如:

4、该导的包:openpyxl、os、pandas、matplotlib等

5、然后运行这个垃圾程序即可
演示视频:【基于py实现的教室预约系统】 https://www.bilibili.com/video/BV1K24y1R7Wx/?share_source=copy_web&vd_source=fa6ceda0e61840db504a95bcd25f6d74

import openpyxl
from openpyxl import Workbook, load_workbook
import os
import pandas as pd
import matplotlib.pyplot as plt
from pandas.plotting import table
# 解决 画图中文 方块问题
from pylab import mpl

res = []    #缓存个人已约信息

def init():
    print("欢迎光~临!")

#初始化本人预约信息
def inityue(instu):
    wb = load_workbook('clstme.xlsx')
    # 打开sheet, (一般打开一个已经存在的文件后,我们希望直接操作其中的某个表格)
    # 我们可以get所有表格的名字,再从中选择某个表格
    sheet_list = wb.sheetnames
    ws = wb[sheet_list[0]]
    # 或者直接用表格的名字
    ws = wb['Sheet1']
    for r in range(2, ws.max_row+1):
        for c in range(2, ws.max_column+1): #深入到每一个单元格子
            #ws.cell(r, c).value.splitlines()
            vle = str(ws.cell(r, c).value).splitlines() #一个单元格子有若干行,将每行作为一个列表对象
            for i in range(len(vle)):#到此,即是分析每一个预约数据!vle[i]
                if instu in vle[i]:
                    res.append([vle[i],"星期:" + str(c - 1),"时段:" + str(r - 1)])

#登录界面
def comin():
    print("请输入您的学号:(输入0退出,测试账号为114514,姓名:IKUN)")
    inno = input()  #获得学号
    if inno == "0":
        return 1    #退出返回1
    else:
        print("请输入您的姓名:")
        instu = input() #获得姓名

        #获取工作簿对象
        wb=openpyxl.load_workbook("stuNo.xlsx")
        #获得工作簿的表名后,就可以获得表对象
        ws=wb["Sheet1"]
        #获取该表相应的行数
        ros=ws.max_row

        #for判断是否在学生库中
        for c in range(1,ros + 1):
            if instu == ws.cell(row = c,column = 2).value and inno == ws.cell(row=c,column=1).value:
                inityue(instu)#缓存本人预约信息
                #query(instu)
                menu(inno,instu)#跳转到菜单界面
                return 1    #进入菜单后退出,直接退出系统
        print("该用户不存在!请检查输入是否正确!")
        return 0    #重新输入

#菜单界面
def menu(inno, instu):
    while 1:    #重复询问下次操作
        print("请输入操作:")
        print("1:预约实验室")
        print("2:显示目前全部的预约信息")
        print("3:查询所有教室")
        print("4:查询预约情况")
        print("5:修改预约信息")
        print("6:退出系统")
        x = input()
        if x == '1':
            while booking(instu):   #当booking返回1时,表明没运行到底,继续运行
                continue
        elif x == '2': show() #显示目前全部的预约信息
        elif x == '3': sowrom()   #显示所有教室
        elif x == '4': query()    #查询本人已约信息
        elif x == '5': rebook(instu)  #修改本人预约信息
        elif x == '6':
            exitt() #退出
            break   #break循环访问操作,退出系统
        else:
            print("输入错误!请重新输入\n")

#预约教室
def booking(instu):
    print("请输入需预约的教室:(退出请按0,输出所有教室请按1)")
    room = input()
    if(room == '0'):
        return 0    #停止运行
    if(room == '1'):
        sowrom()
        return 1    #继续运行

    #下面判断教室是否存在
    wb=openpyxl.load_workbook("classInfo.xlsx")
    #获得工作簿的表名后,就可以获得表对象
    ws=wb["Sheet"]
    #获取该表相应的行数
    ros=ws.max_row
    flag = 0
    for i in range(1,ros + 1):
        if ws.cell(row = i,column = 1).value == room:
            flag = 1
            break   #找到直接break,无需继续找
    if flag == 0:
        print("教室不存在!请重新输入")
        return 1

    print("请选择星期:(直接输入对应数字)")
    day = input()
    #input默认输入格式为str,非整数直接转str会报错。需先判断是否能转。
    if not day.isnumeric():
        print("星期输入有误!请重新输入!")
        return 1
    day = int(day)
    if day not in range(1,8):
        print("星期输入有误!请重新输入")
        return 1
    else:
        print("请输入时段:(1上午、2下午、3晚上)")
        tme = input()
        #input默认输入格式为str,非整数直接转int会报错。需先判断是否能转。
        if not tme.isnumeric():
            print("时段输入有误!请重新输入!")
            return 1
        tme = int(tme)
        if tme not in range(1,4):
            print("时段输入有误!请重新输入")
            return 1
        #开始预约
        else:
            wb = load_workbook('clstme.xlsx')
            # 打开sheet, (一般打开一个已经存在的文件后,我们希望直接操作其中的某个表格)
            # 我们可以get所有表格的名字,再从中选择某个表格
            sheet_list = wb.sheetnames
            ws = wb[sheet_list[0]]
            # 或者直接用表格的名字
            ws = wb['Sheet1']
            vle = str(ws.cell(tme + 1, day + 1).value).splitlines() #一个单元格子有若干行,将每行作为一个列表对象
            for i in range(len(vle)):#到此,即是分析每一个预约数据!vle[i]
                if room in vle[i]:
                    print("该时段已有人预约!请重新输入!")
                    return 1

            #在clstme表中加上预约信息
            cel = str(ws.cell(tme + 1, day + 1).value)  #获得原来的单元格值
            nul = str(ws.cell(1, 1).value)  #获得空白单元格做对比
            #print(cel,len(cel))
            if cel == nul:
                cel = str(room) + "," + str(instu)  #单元格为空,没必要加换行符
            else:
                cel += "\n" + str(room) + "," + str(instu)  #单元格已有数据,在后面加上换行符
            ws.cell(tme + 1,day + 1,cel)    #赋新值
            wb.save(filename='clstme.xlsx')

            #更新预约缓存
            res.append([str(room +  "," + instu), "星期:" + str(day), "时段:" + str(tme)])

            print("您已预约成功!")
            return 0

#显示全部教室
def sowrom():
    wb=openpyxl.load_workbook("classInfo.xlsx")
    #获得工作簿的表名后,就可以获得表对象
    ws=wb["Sheet"]
    #获取该表相应的行数
    ros=ws.max_row
    for i in range(1,ros + 1):
        print(ws.cell(row = i,column = 1).value)

#显示全部预约信息(以图片的方式)
def show():
    # #直接打开文件展示,有着安全风险。
    # file = "clstme.xlsx"
    # os.startfile(file)

    mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']    # 指定默认字体:解决plot不能显示中文问题
    mpl.rcParams['axes.unicode_minus'] = False
    # figsize 指定figure的宽和高,单位为英寸;
    # dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80      1英寸等于2.5cm,A4纸是 21*30cm的纸张
    fig = plt.figure(figsize=(9, 10), dpi=900)
    # frameon:是否显示边框
    ax = fig.add_subplot(161, frame_on=False,)
    # 隐藏x轴 y轴
    ax.xaxis.set_visible(False)  # hide the x axis
    ax.yaxis.set_visible(False)  # hide the y axis

    datas = pd.read_excel('clstme.xlsx')
    datas = datas.iloc[:, 0:]

    print(datas)
    print("请等待图片生成...")
    # 生成图片
    table(ax, datas, loc='center')  # where df is your data frame
    # 保存图片
    plt.savefig('photo.jpg')
    os.startfile("photo.jpg")
    return

#查询本人已约信息
def query():
    for i in range(len(res)):
        print(str(i + 1) + "、" + str(res[i]))
    print("时段:(1上午、2下午、3晚上)")
    return

#重约教室
def rebook(instu):
    if len(res) == 0:
        print("您当前没有预约教室,请先预约!")
        return
    else:
        print("请输入你想修改哪一条预约信息:")
        print("[""str"",""x"",""y""]表示在星期x时段y时已预约str教室")
        query()

        x = int(input())
        if x not in range(1, len(res) + 1):
            print("输入有误!,请重新输入")
            rebook(instu)
        else:
            x = x - 1
            days = int(res[x][1][len(res[x][1]) - 1])
            tmes = int(res[x][2][len(res[x][2]) - 1])
            roms = ""
            for i in range(len(res[x][0])):###
                if res[x][0][i] != ',':
                    roms += res[x][0][i]
                else:
                    break

            #print(days,tmes,roms)
            while booking(instu):
                continue

            #把原来的信息删除
            wb = load_workbook('clstme.xlsx')
            # 打开sheet, (一般打开一个已经存在的文件后,我们希望直接操作其中的某个表格)
            # 我们可以get所有表格的名字,再从中选择某个表格
            sheet_list = wb.sheetnames
            ws = wb[sheet_list[0]]
            # 或者直接用表格的名字
            ws = wb['Sheet1']
            yuan = ws.cell(tmes + 1, days + 1).value
            if "\n" in yuan:
                shan = "\n" + roms + "," + instu
            else:
                shan = roms + "," + instu
            #print(yuan,type(yuan),shan,type(shan))
            xin = yuan.replace(shan, '')
            if xin == yuan:
                shan = roms + "," + instu + "\n"
            xin = yuan.replace(shan, '')
            ws.cell(tmes + 1, days + 1,xin)
            wb.save(filename='clstme.xlsx')

            #更改预约缓存
            tp = roms + "," + instu
            for i in range(len(res)):
                if tp in res[i]:
                    res.pop(i)
                    break

            return
#退出函数
def exitt():
    print("栓Q")

#主程序
while comin() == 0:
    continue
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值