劉 哲,宋佳豪,潘夢瑤
(延安大學數學與計算機科學學院,延安 716000)
高等學校各項工作的良好運轉,離不開廣大教學管理人員的辛勤付出。然而面對教學工作過程中的復雜性、多樣性,大多數工作都是通過人工的方式去手動完成的。其中就包括了一部分內容枯燥、重復率高,實際上又可以通過計算機程序自動完成的工作。教務人員每天都要花費大量的時間和精力去完成這些工作。因此,如果能夠通過計算機程序的方式,輔助完成這類工作,可以有效解決教學管理過程中存在的問題,提升教學管理水平[1-3]。而校歷文件的制定,是高校教學計劃有序執行過程中必不可少的一環。如何能夠將其中所蘊含的價值更加充分、高效地利用起來[4-6],具有非常重要的研究價值。
本次實驗使用計算機編程語言Python 3.11進行系統開發,使用Python 標準庫Calendar 獲取日歷相關數據,使用Python 的第三方庫xlwt將組織好的數據內容寫入目標文件中,并對其進行排版。
Calendar 是Python 中與日歷信息相關的一個標準庫,該模塊提供了豐富的對年、月、日等數據進行操作的函數,使用時無需安裝,可以直接通過import 語句導入。模塊主要包括三大類:Calendar、TextCalendar和HTMLCalendar。其中,Calendar是其它兩個類的基類,可以用來創建一個普通的日歷對象。TextCalendar 一般用來創建一個純文本的日歷對象,使用HTMLCalendar 生成HTML 格式的日歷對象。
xlwt 是Python 中常見的用來生成Excel 類型文件的第三方工具包,使用時需要通過pip 命令安裝后才能導入,推薦通過鏡像源的方式進行安裝[7],表1 列出了一些質量較高的Python 鏡像源。需要注意的是,xlwt主要用于將組織好的數據和相關的文本格式信息寫入新建的工作表文件中,不能直接編輯一個已經存在的工作表文件。

表1 常用的國內鏡像站
系統的基本生成步驟如圖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)。
本部分選取了實驗過程中遇到的一些難點問題,給出解決方案,總結如下。
問題一:如何讓日期出現在正確的列標題下。
如何確定每個月的日期數據,與列標題的對應關系。例如,如果當前月的第一天,對應的列標題是周三。那么,同一行中對應列標題是周一和周二的單元格,應該是沒有內容的。
通過查詢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 行高列寬的設置方法
本次實驗主要從兩個方面對程序自動構建的電子校歷文件進行驗證:①日期數據是否正確地顯示在對應的列標題下;②教學周的序號與日期數據的關聯是否正確。為此,調閱了2020—2021、2021—2022、2022—2023 三個學年的校歷文件進行對比。
實驗結果表明:通過系統自動生成的不同學年、學期的電子校歷文件,與相應的紙質校歷中的數據完全匹配,并且構建過程不超過2秒。電子校歷文件能有效提升教務人員完成特定事務的工作效率,將教務人員從枯燥的行政工作中解放出來,增加幸福指數。其應用場景廣泛多樣,例如,每個學期開始時都必須要盡快制作的學期實驗教師值班安排表,就可以使用電子校歷文件的方式來快速完成,如圖2 所示。亦可以將電子校歷當作備忘錄來使用,記錄教學執行計劃中相應節點的工作事項。需要時可以方便地查閱以前的工作事項記錄,制定新的教學安排。相比于傳統純文本形式的記錄,電子校歷更加美觀大方、一目了然,易于事后翻閱和文件存儲。

圖2 電子校歷形式的值班安排表
電子校歷自動生成系統在充分調研的基礎上,結合教學管理工作中的實際需求進行研究,具有較強的應用價值。在提升工作效率的同時,將教務人員從枯燥的行政工作中解放出來,減輕工作壓力,增加幸福指數。