APP下载

电子校历自动生成系统的设计与实现

2023-08-11宋佳豪潘梦瑶

现代计算机 2023年11期
关键词:序号学期工作

刘 哲,宋佳豪,潘梦瑶

(延安大学数学与计算机科学学院,延安 716000)

0 引言

高等学校各项工作的良好运转,离不开广大教学管理人员的辛勤付出。然而面对教学工作过程中的复杂性、多样性,大多数工作都是通过人工的方式去手动完成的。其中就包括了一部分内容枯燥、重复率高,实际上又可以通过计算机程序自动完成的工作。教务人员每天都要花费大量的时间和精力去完成这些工作。因此,如果能够通过计算机程序的方式,辅助完成这类工作,可以有效解决教学管理过程中存在的问题,提升教学管理水平[1-3]。而校历文件的制定,是高校教学计划有序执行过程中必不可少的一环。如何能够将其中所蕴含的价值更加充分、高效地利用起来[4-6],具有非常重要的研究价值。

1 实验设计

本次实验使用计算机编程语言Python 3.11进行系统开发,使用Python 标准库Calendar 获取日历相关数据,使用Python 的第三方库xlwt将组织好的数据内容写入目标文件中,并对其进行排版。

1.1 主要组件介绍

Calendar 是Python 中与日历信息相关的一个标准库,该模块提供了丰富的对年、月、日等数据进行操作的函数,使用时无需安装,可以直接通过import 语句导入。模块主要包括三大类:Calendar、TextCalendar和HTMLCalendar。其中,Calendar是其它两个类的基类,可以用来创建一个普通的日历对象。TextCalendar 一般用来创建一个纯文本的日历对象,使用HTMLCalendar 生成HTML 格式的日历对象。

xlwt 是Python 中常见的用来生成Excel 类型文件的第三方工具包,使用时需要通过pip 命令安装后才能导入,推荐通过镜像源的方式进行安装[7],表1 列出了一些质量较高的Python 镜像源。需要注意的是,xlwt主要用于将组织好的数据和相关的文本格式信息写入新建的工作表文件中,不能直接编辑一个已经存在的工作表文件。

表1 常用的国内镜像站

1.2 系统设计

系统的基本生成步骤如图1所示。

图1 系统流程

(1)创建一个空白的Excel 文档,等待数据写入。

(2)按学期中的月份进行遍历。逻辑上,将当前学期的第一个月记为起始月start_month,将当前学期的最后一个月记为结束月end_month,使用函数range(start_month,end_month+1)遍历访问当前学期的月份。

(3)添加工作表,初始化标题行。例如,2022—2023 学年第二学期的起始月是2 月,结束月是7 月。那么,需要按照从“2 月”到“7月”的顺序和命名方式,在工作簿中依次创建每张工作表,用于存放对应的日历数据。每次迭代只创建当前月的日历工作表,并初始化工作表的列标题行,分别是周序号、一、二、……、六、日。其中,“周序号”一列下的数据,取值范围是教学执行计划中的第一周到最后一周的序号,依次递增。

(4)当前月日历数据的获取和整理。创建Calendar 日历对象,通过调用函数monthdayscalendar(year,month),获取当前月的日历数据,整理出相关的中间变量,等待后续程序的使用。

(5)按周次进行遍历。例如,当前迭代月是2023 年3 月,3 月1 日对应星期三,3 月31 日对应星期五。那么,3 月份在日历中会对应5 行数据,按周次遍历应遍历5次,其它月份的遍历依此类推。

(6)数据的写入和格式化。将当前周次的日历数据,按照设定好的排版格式,写入对应的单元格中。例如,2023年3月1日正处于开学后的第一周内。那么,程序应该在对应列标题下的单元格中,写入的数据依次是[‘第1 周’,‘’,‘’,‘1’,‘2’,‘3’,‘4’,‘5’]。

(7)构建剩余月份的日历工作表。重复步骤(2)~(6)。

2 难点与解决方案

本部分选取了实验过程中遇到的一些难点问题,给出解决方案,总结如下。

问题一:如何让日期出现在正确的列标题下。

如何确定每个月的日期数据,与列标题的对应关系。例如,如果当前月的第一天,对应的列标题是周三。那么,同一行中对应列标题是周一和周二的单元格,应该是没有内容的。

通过查询calendar模块的官方文档,以及不断的测试、对比,最终挖掘出了模块中的功能函数monthdayscalendar(year,month)。该函数通过传递实参年和月,能够返回具有如下所示的日期格式数据。

[[0,0,1,2,3,4,5],[6,…,12],[13,…,19],[20,…,26],[27,28,0,0,0,0,0]]

示例中的数据是2023 年2 月的日历数据,其中的数字1~28 代表当前月中实际有的日期,0代表非当前月的日期数据。可以看出,以周为计数单位,当前月的日历数据(外层的大列表),共包含5个完整的周(内层列表),即外层的大列表一共有5个列表类型的元素。而每个内层列表中的元素,按顺序依次对应周一、周二、……、周日。通过这种方式,就可以建立日期数据与列标题之间的映射关系。当将日期数据写入工作表时,如果当前单元格对应的内容是数字0,则跳过。

问题二:教学周序号的确定。

高等院校教学计划的执行、工作安排的制定都是以周为单位进行的。程序自动构建时,如何正确地输出当前周次对应的教学周序号。

正常情况下的逻辑是,设定一个变量week_index代表周序号,将该变量的值初始化为1,并关联到开学第一周的日历数据。当每次输出完一周的日历数据时,让变量week_index 的值加1,然后关联第二周的日历数据,以后的周序号依此类推。如果某个月的最后一天是星期二,对应教学执行计划的第5周。那么下个月的第一天会是星期三。但是,当输出下个月第一周的日历数据时,不能将教学周的序号自动加1。因为当前月的最后一天与下个月的第一天,属于同一个周。

解决办法是,当输出每个月第一周的日历数据时,判断其中是否包含非当前月的日历数据,例如[0,0,1,2,3,4,5]。这种情况下,就认定教学周序号week_index的值不需要加1。

问题三:Excel 文件的行高和列宽的设置问题。

xlwt工具包的官方帮助文档极少,开发的过程中相关功能的实现和函数的使用,主要来源于网络上的教程。但行高和列宽的设置方法,经过测试后均以失败告终。最终,通过阅读工具包的源代码结合之前的测试,行高和列宽的设置代码如表2所示。两个乘号左边的数字是基本尺寸单位,行高和列宽的设置,主要通过修改乘号右边的数字调试后确定。

表2 行高列宽的设置方法

3 实验结果与分析

本次实验主要从两个方面对程序自动构建的电子校历文件进行验证:①日期数据是否正确地显示在对应的列标题下;②教学周的序号与日期数据的关联是否正确。为此,调阅了2020—2021、2021—2022、2022—2023 三个学年的校历文件进行对比。

实验结果表明:通过系统自动生成的不同学年、学期的电子校历文件,与相应的纸质校历中的数据完全匹配,并且构建过程不超过2秒。电子校历文件能有效提升教务人员完成特定事务的工作效率,将教务人员从枯燥的行政工作中解放出来,增加幸福指数。其应用场景广泛多样,例如,每个学期开始时都必须要尽快制作的学期实验教师值班安排表,就可以使用电子校历文件的方式来快速完成,如图2 所示。亦可以将电子校历当作备忘录来使用,记录教学执行计划中相应节点的工作事项。需要时可以方便地查阅以前的工作事项记录,制定新的教学安排。相比于传统纯文本形式的记录,电子校历更加美观大方、一目了然,易于事后翻阅和文件存储。

图2 电子校历形式的值班安排表

4 结语

电子校历自动生成系统在充分调研的基础上,结合教学管理工作中的实际需求进行研究,具有较强的应用价值。在提升工作效率的同时,将教务人员从枯燥的行政工作中解放出来,减轻工作压力,增加幸福指数。

猜你喜欢

序号学期工作
新的学期 新的尝试
期末冲刺高二上学期期末模拟卷
不工作,爽飞了?
八年级(上学期)期末测试题(D)
技术指标选股
技术指标选股
技术指标选股
技术指标选股
我要出舱工作
再说还有工作忙