手里明明有一份學(xué)生成績Excel表格疾渴,卻還得一一手動把它們輸入到教務(wù)系統(tǒng)千贯?類似這樣的簡單重復(fù)枯燥操作,其實你都可以一鍵讓電腦自動替你完成搞坝。
痛點
期末了搔谴,學(xué)生們考完試,都愉愉快快放假回家了桩撮。
老師們呢敦第?暫時還不能休息。
因為考試成績店量,要在一定時間節(jié)點之前芜果,錄入系統(tǒng)。
在我們學(xué)校融师,這個時限是2周右钾。否則系統(tǒng)一旦切換到下學(xué)期課程,本學(xué)期的成績就無法錄入了旱爆。
辛辛苦苦判完卷子舀射,老師手里往往已經(jīng)有了一份Excel,包含了全部的分?jǐn)?shù)信息疼鸟。
有人可能不解后控?為什么先要弄份Excel出來呢?
因為現(xiàn)在出題空镜,都是有嚴(yán)格的規(guī)范要求的浩淘。
題型不能單一,題量不能太小吴攒,分值不能過于集中……
即便用論文或者報告結(jié)課张抄,也需要給出詳細(xì)的分項成績。
所以洼怔,期末給各項小題分別打分之后署惯,老師們需要跟小學(xué)生一樣,訓(xùn)練連續(xù)加減法镣隶。
對于我自己的課來說极谊,還更加麻煩。因為期末的卷面成績不一定等于期末成績安岂,這里還有一個系數(shù)轉(zhuǎn)換問題轻猖。
平時上機(jī)課優(yōu)勝的同學(xué),領(lǐng)先完成了MOOC證書的同學(xué)域那,承擔(dān)了額外課程任務(wù)的同學(xué)……這些學(xué)生都有系數(shù)加分咙边。最終的系數(shù)要乘以卷面成績,放到期末成績上。
所以败许,算成績的時候要有乘法小數(shù)運(yùn)算王带。
只是乘完了還不行。因為平時成績占40分市殷,期末成績占60分愕撰。我平時成績就是按照40分算的”簧ィ可是系統(tǒng)錄入的時候盟戏,卻需要把它轉(zhuǎn)換成百分制绪妹,這樣才能保證平時比例加上期末比例剛好是1甥桂,否則是需要寫情況說明的。
因此邮旷,我還需要把平時成績做除法轉(zhuǎn)換黄选,從40分制轉(zhuǎn)換為百分制。
另外婶肩,由于輸入成績必須是整數(shù)办陷,因此中間出現(xiàn)的任何小數(shù)部分,都需要四舍五入處理……
這些算術(shù)題律歼,你真的愿意每個都手算嗎民镜?
就算你愿意,你真的還能像十歲時那樣险毁,算得那么快制圈,那么好嗎?
你行我佩服畔况,反正我做不到鲸鹦。
出于對學(xué)生負(fù)責(zé)的態(tài)度,我都是弄一個Excel表格跷跪,運(yùn)用公式替我計算馋嗜,最后得出總成績。
順便說一句吵瞻,預(yù)先算出總成績是很必要的葛菇。
在某些特殊情境下(例如預(yù)計掛科率過高),你得在保證名次順序的情況下橡羞,合理變動成績眯停。在某些專業(yè),這種操作需要運(yùn)用到開方運(yùn)算尉姨,就更是紙筆算力所不能及的了庵朝。
終于,老師們手里有一份最終版成績了。
只要把這些Excel表格里面的成績輸入到系統(tǒng)九府,就算見到勝利曙光了椎瘟。
每當(dāng)這個時候,我都在教務(wù)系統(tǒng)的界面上侄旬,尋找“導(dǎo)入Excel”按鈕肺蔚。
但是,我一次次確認(rèn)儡羔,面前的教務(wù)系統(tǒng)沒有這項功能宣羊。
系統(tǒng)設(shè)計者,是家國內(nèi)知名的軟件企業(yè)汰蜘。設(shè)計師們在用產(chǎn)品傳達(dá)給教師用戶一個信息:
小樣兒的仇冯,別找了,老老實實手動錄入成績吧族操!
為了建設(shè)合諧社會苛坚,此處省略描述我心理活動的若干字詞。
把Excel表格里面的成績色难,手動搬家到教務(wù)系統(tǒng)這個事兒泼舱,不僅讓人煩惱,而且還很容易出錯枷莉。特別是一旦抄串行了娇昙,又沒有及時發(fā)現(xiàn)而提交,后果不堪設(shè)想笤妙。
忍了冒掌。
好在一般我期末錄入的成績數(shù)量不超過100人。加上本人眼睛還沒花危喉,在校準(zhǔn)數(shù)據(jù)宋渔,避免串行上還是能夠勉強(qiáng)做到的。
但是辜限,其他老師的工作量皇拣,就未必只有這些了。
有的老師教的是通修課薄嫡,好幾個班氧急,數(shù)百人。成績好容易都計算出來了毫深,還得手動一一錄入到系統(tǒng)吩坝。
每年到這個時候,許多老師想想成績輸入這回事兒哑蔫,都會覺得頭痛钉寝。
可是把成績從Excel搬家到教務(wù)系統(tǒng)弧呐,真的就必須手動操作嗎?
自動
答案是否定的嵌纲。
即便系統(tǒng)沒有提供導(dǎo)入功能俘枫。
因為這種數(shù)據(jù)搬家過程,根本就不需要什么酷炫的高科技逮走,只需要讓電腦傻傻地重復(fù)執(zhí)行操作就可以了鸠蚪。
如果讓你把Excel表格的內(nèi)容完整錄入到系統(tǒng)中,需要幾步师溅?
- 把光標(biāo)移動到Excel的指定位置茅信;
- 拷貝該數(shù)據(jù);
- 切換到網(wǎng)絡(luò)瀏覽器(成績系統(tǒng)Web頁面)墓臭;
- 粘貼該數(shù)據(jù)蘸鲸;
- 把光標(biāo)移動到下一個位置做準(zhǔn)備;
- 切換回Excel里面起便;
- 光標(biāo)移動到下一項棚贾;
- 返回第一步,循環(huán)執(zhí)行榆综。
看,跟把大象裝冰箱一樣容易铸史。對不對鼻疮?
這個成績錄入操作清單,下文中將被簡稱為“清單”琳轿。
請注意判沟,其中每一個動作,都對應(yīng)著操作系統(tǒng)的一個響應(yīng)操作崭篡。
既然我們可以羅列一個清單出來挪哄,那么讓電腦自動化替我們執(zhí)行操作,也就有了基礎(chǔ)琉闪。
我們需要一種特殊編程環(huán)境迹炼,可以表達(dá)與處理清單中的所有動作。
它可以模擬用戶的按鍵輸入颠毙,可以調(diào)用操作系統(tǒng)的窗口切換功能斯入,還得能重復(fù)執(zhí)行若干次動作蛀蜜。
有沒有這樣的編程環(huán)境呢?
環(huán)境
當(dāng)然有磅摹。而且還有很多滋迈。
Windows上,有AutoHotkey杀怠;macOS上厅克,有AppleScript赔退。
但是它們都是單平臺工具,而且都需要學(xué)習(xí)專用的操作語言(雖然并不復(fù)雜)证舟,這樣你的技能就會被局限在某一種操作系統(tǒng)上女责,不能通用。
今天我推薦給你的這一種編程環(huán)境墙基,叫做Sikuli刷喜。
它基于Java編寫愧怜,因此跨平臺毫無問題所踊。而且它使用的語言,是Jython折汞。
這個詞兒盖腿,看著是不是眼熟奸忽?
對,它是一種基于Java的Python變種栗菜,所以叫做Jython疙筹。
這樣一來禁炒,只要你有Python的編程基礎(chǔ)幕袱,就可以非常輕易地使用Sikuli編程悠瞬,來處理各種圖形界面的操作了浅妆。
用這么強(qiáng)悍的工具來錄入個成績凌外,確實是典型的大炮轟蚊子。
不過能轟蚊子摄欲,也是好事兒胸墙。
我們來看看如何安裝Sikuli劳秋。
首先你需要到這個地址下載Sikuli的最新版本胖齐。本文寫作的時候呀伙,最新版本是1.1.1剿另。
點擊右側(cè)的“Get Version 1.1.1”雨女,找到下載地址阳准。前面說過野蝇,Sikuli是跨平臺的工具,基于Java帮寻。它的下載文件是jar格式的赠摇。
下載之后藕帜,你還需要安裝JDK 8耘戚,以提供Java底層運(yùn)行環(huán)境收津。注意一定是版本8,因為版本9目前還不支持长捧。
JDK 8的下載地址在這里串结。
我用的是macOS平臺肌割,下面的安裝過程以蘋果系統(tǒng)的安裝方式來演示帐要。如果你用的是Windows或者Linux榨惠,請參考對應(yīng)的文檔說明來安裝對應(yīng)Java環(huán)境赠橙。
在macOS下面期揪,JDK 8的安裝文件横侦,是dmg格式绰姻。雙擊該文件狂芋,出現(xiàn)以下圖標(biāo):
雙擊對話框中的pkg圖標(biāo)帜矾,開始安裝屡萤。
安裝成功后死陆,會有以下提示:
JDK 8安裝后措译,咱們就可以使用剛剛下載的jar文件领虹,來安裝Sikuli了求豫。
我們到終端里蝠嘉,切換到下載目錄蚤告,執(zhí)行以下語句:
java -jar sikulixsetup-1.1.1.jar
屏幕上會顯示一大堆文字提示罩缴,然后出現(xiàn)以下對話框层扶。
勾選其中第一個分類镜会,然后點擊其中的第一小分項戳表。之后繼續(xù)。
遇到提示圃郊,詢問下載地址持舆。請選擇“是”逸寓。
然后就會出現(xiàn)不同的文件下載提醒:
繼續(xù)下載:
下載完畢以后竹伸,安裝過程繼續(xù)提示是否安裝Jython 2.7.0勋篓。
選擇是生巡。
Jython下載完畢孤荣,安裝過程順利結(jié)束盐股,會彈出以下對話框:
好了疯汁,至此我們的環(huán)境安裝配置過程就完成了幌蚊。
演示
下面溃卡,咱們來演示一下用Sikuli自動錄入成績的使用效果瘸羡。
我建立了一個github項目,用于給你演示自動化程序錄入卷仑。
請點擊這個鏈接锡凝,下載壓縮包磕谅。然后在本地解壓膊夹。作為咱們的演示目錄放刨。
目錄中进统,除了說明文件(README.md)之外螟碎,一共只有三個文件。
- scorelist.xlsx俭缓,是我們的成績單文件华坦;
- score-input.html惜姐,是一個模擬成績登錄系統(tǒng)頁面歹袁;
- demo-score-input.sikuli寝优,是我們即將調(diào)用的Sikuli腳本源文件倡勇。
先看看我們的成績單文件妻熊。
為保護(hù)真實世界的學(xué)生隱私扔役,這里我們沒法用真名和真實學(xué)號亿胸,所以模擬了一份成績單。
我們也不能把學(xué)校的教務(wù)系統(tǒng)原原本本展示出來,所以只依樣畫葫蘆突颊,做了個最簡單的成績錄入頁面潘悼。
請確保使用Google Chrome瀏覽器打開該html文件治唤。
這里只有10個學(xué)生的信息船惨。我們需要錄入他們的平時成績和期末成績辞槐。由于沒有備注信息需要錄入榄檬,所以這一列應(yīng)該都空著鹿榜。
我們演示一下Sikuli的執(zhí)行過程舱殿。
進(jìn)入Sikuli沪袭,啟動過程需要幾秒鐘。中間你會看到這樣的提示:
進(jìn)入主界面:
我們定位到演示目錄埠啃,打開其中的demo-score-input.sikuli文件碴开。
打開后潦牛,我們就能看到腳本內(nèi)容了:
對于已經(jīng)等得不耐煩的老師巴碗,咱們先來介紹一下用法:
首先我們到Excel里面良价,把光標(biāo)定位到第一個同學(xué)的平時成績明垢。
然后到Chrome瀏覽器里痊银,把光標(biāo)同樣定位在第一個同學(xué)的平時成績錄入框溯革。
然后切換到Sikuli里致稀,執(zhí)行運(yùn)行按鈕:
好了,操作完畢矛绘。
點擊運(yùn)行按鈕后刃永,你會看到如這段視頻展示的情景:
注意斯够,這個視頻中,除了開始的點擊運(yùn)行按鈕是人在操作外裸违,后面所有的動作,都是計算機(jī)自動執(zhí)行的涌穆,直到成績?nèi)夸浫胪戤叀?/p>
是不是看得眼花繚亂宿稀,躍躍欲試了祝沸?
代碼
別著急罩锐。
為了讓你自己能夠通過對腳本細(xì)微修改卤唉,滿足實際分?jǐn)?shù)錄入的需要桑驱,我們來簡單閱讀一下代碼熬的。
放心押框,代碼并不長强戴。
第一行代碼骑歹,我們指定了n的數(shù)值。
n = 10
在Excel里扁掸,每一個學(xué)生的成績谴分,包括平時和期末牺蹄,作為一條記錄沙兰。
這樣的記錄一共有10條鼎天,所以這里我們設(shè)定一共需要循環(huán)處理的條目數(shù)為10次斋射。
假設(shè)你班上有50人罗岖,可以將其設(shè)定為50呀闻,以此類推捡多。
緊接著垒手,是一條循環(huán)語句:
for i in range(n):
這就是告訴Sikuli科贬,我們要循環(huán)執(zhí)行內(nèi)部的全部語句榜掌,執(zhí)行次數(shù)由前面的n指定。
我們把循環(huán)內(nèi)部的代碼分成了4個部分憎账,一一來看套硼。
首先,是從Excel里面拷貝平時成績胞皱。
switchApp("Microsoft Excel")
sleep(0.1)
type("c", Key.CMD)
sleep(0.1)
type("c", Key.CMD)
type(Key.RIGHT)
sleep(0.2)
注意我們采用switchApp()
函數(shù)來指定切換到哪一個應(yīng)用邪意。
應(yīng)用的名稱怎么設(shè)置呢九妈?
很簡單,在macOS下面雾鬼,把鼠標(biāo)移動到屏幕下方Dock上面的對應(yīng)圖標(biāo)上,看到的提示就是應(yīng)用的正式名稱策菜。照著寫就可以晶疼。
其中出現(xiàn)了3條sleep()
語句。它們并不是實際執(zhí)行什么內(nèi)容又憨,而是讓電腦歇一下冒晰,不要急于執(zhí)行下面的語句。
這是因為竟块,有些操作需要一定的響應(yīng)時間。
如果上一步操作的結(jié)果還沒有響應(yīng)耐齐,你就急匆匆緊接著執(zhí)行下面的動作浪秘,可能會把原先的計劃打亂,導(dǎo)致操作失誤埠况。例如還沒有拷貝好內(nèi)容耸携,就進(jìn)行粘貼,顯然是不行的辕翰。
因此夺衍,幾乎每一步操作后,我們都加上一個休眠時間喜命,單位為秒沟沙。
另外出現(xiàn)的一個函數(shù)為type()
。
以這一句為例:
type("c", Key.CMD)
我們讓Sikuli替我們按下鍵盤上的c鍵壁榕,同時還要按下控制按鍵Cmd矛紫。
在macOS里面,Cmd + c用來拷貝數(shù)據(jù)牌里。如果你在Windows下颊咬,需要將其修改為Ctrl鍵。
這樣一解釋牡辽,這一段代碼的含義就很清晰了喳篇。
我們做了以下動作:
- 切換到了Excel;
- 執(zhí)行了拷貝态辛;
- 又執(zhí)行了一遍拷貝麸澜;
- 光標(biāo)右移一格(到了期末成績)
每一步之間,我們都讓Sikuli休眠一會兒因妙,以保證系統(tǒng)成功響應(yīng)痰憎。
這里解釋一下票髓,為什么進(jìn)行了2步拷貝。
因為在macOS里面铣耘,Excel, Word這些應(yīng)用有時候用快捷鍵進(jìn)行拷貝操作時洽沟,會出現(xiàn)沒有成功拷貝的情況。所以為了保險起見蜗细,我不得不經(jīng)常強(qiáng)迫癥一樣按下同樣的操作鍵兩次裆操。
這里,我們讓Sikuli一樣執(zhí)行保守操作炉媒。
好了踪区,有了上面的知識基礎(chǔ),我們再來看看下面這段Web瀏覽器頁面操作代碼:
switchApp("Google Chrome")
sleep(0.1)
type("a", Key.CMD)
type("v", Key.CMD)
type(Key.TAB)
sleep(0.2)
怎么樣吊骤,很容易就理解了吧缎岗?
梳理一下,我們做了以下操作:
- 切換到了Chrome瀏覽器白粉;
- 選中當(dāng)前文本框內(nèi)容传泊;
- 把剪貼板里面的平時成績粘貼;
- 按TAB鍵鸭巴,切換到下一個輸入文本框(期末成績)眷细。
之后,我們又回到Excel繼續(xù)操作:
switchApp("Microsoft Excel")
sleep(0.1)
type("c", Key.CMD)
sleep(0.1)
type("c", Key.CMD)
type(Key.DOWN)
sleep(0.1)
type(Key.LEFT)
sleep(0.2)
這一段代碼鹃祖,我們做了以下動作:
- 切換到了Excel溪椎;
- 執(zhí)行了拷貝;
- 又執(zhí)行了一遍拷貝恬口;
- 光標(biāo)下移一格(到了新記錄的期末成績)校读;
- 光標(biāo)左移一格(到了新記錄的平時成績)。
然后楷兽,我們又回到了Chrome地熄。
switchApp("Google Chrome")
sleep(0.1)
type("a", Key.CMD)
type("v", Key.CMD)
type(Key.TAB)
sleep(0.1)
type(Key.TAB)
sleep(0.2)
最后這段代碼,我們做了以下操作:
- 切換到了Chrome瀏覽器芯杀;
- 選中當(dāng)前文本框內(nèi)容端考;
- 把剪貼板里面的平時成績粘貼;
- 按TAB鍵揭厚,切換到下一個輸入文本框(備注)却特;
- 按TAB鍵,切換到下一個輸入文本框(新記錄的平時成績)筛圆。
好了,這就是全部需要循環(huán)的代碼了太援。在Excel和Chrome里扳碍,光標(biāo)都指向了下一條記錄的平時成績位置。
這樣再次循環(huán)的時候笋敞,就是下一條記錄的輸入了。依此類推夯巷。
如果你使用的系統(tǒng)輸入界面,和我們的系統(tǒng)有區(qū)別趁餐,也可以根據(jù)上述命令的含義,自行調(diào)整細(xì)節(jié)后雷,以便成功輸入。
只是千萬不要忘了喷面,在語句之間用sleep()
來稍作停頓。
小結(jié)
本文我為你展示了如何利用Sikuli編程環(huán)境和自動化Jython腳本走孽,把原本枯燥的成績錄入動作,變成一鍵搞定琳状。
回顧一下磕瓷,我們介紹了以下內(nèi)容:
- 不同操作系統(tǒng)平臺上的幾個典型自動化腳本工具;
- 如何安裝JDK運(yùn)行環(huán)境念逞;
- 如何安裝Sikuli困食;
- 如何執(zhí)行Sikuli腳本;
- 如何閱讀和修改Sikuli腳本中的Jython代碼翎承。
還是那句話硕盹,用這么強(qiáng)悍的自動化腳本工具來輸入個考試成績,簡直是委屈了它叨咖。
其實瘩例,Sikuli具有基本圖標(biāo)識別和像素級定位操作能力,被廣泛應(yīng)用于軟件測試甸各、桌面監(jiān)控等領(lǐng)域垛贤。
如果你對它感興趣,推薦你從官方的文檔開始趣倾,深入閱讀學(xué)習(xí)聘惦。
討論
除了輸入成績以外,你還遇到過哪些需要重復(fù)執(zhí)行枯燥操作指令的場景儒恋?你覺得Sikuli能否幫助你有效接管這些繁復(fù)的機(jī)械動作善绎?除了Sikuli黔漂,你還用過哪些好用的自動化腳本工具?歡迎留言禀酱,把你的經(jīng)驗和思考分享給大家炬守,我們一起交流討論。
如果你對我的文章感興趣比勉,歡迎點贊劳较,并且關(guān)注我的專欄,以便收到后續(xù)作品更新通知浩聋。
如果本文可能對你身邊的親友有幫助观蜗,也歡迎你把本文通過微博或朋友圈分享給他們。讓他們一起參與到我們的討論中來衣洁。