趙龍強
摘 要:本文主要介紹了如何使用Visual Foxpro軟件來研制對Excel文件進行單選題、填充題自動批量閱卷應(yīng)用程序的技術(shù)。該技術(shù)不僅解決了教師對大批量Excel試卷中單選題、填充題的閱卷和登分的繁瑣問題,同時給讀者自己開發(fā)其他應(yīng)用程序提供了案例。
關(guān)鍵詞:Excel 考試系統(tǒng) 自動閱卷
中圖分類號:TP391 文獻標識碼:B 文章編號:1673-8454(2009)03-0091-03
一、問題的提出
筆者于2007年6月在本刊發(fā)表了《采用非編程方法使用Excel研制單選題填空題考試和閱卷系統(tǒng)》,詳細介紹了利用Excel進行單選題和填充題試卷設(shè)計和人工閱卷的方法,收到了許多讀者來信和來電詢問如何解決大批量地自動進行閱卷及成績登錄的問題。筆者進行了程序研制,并且在一年多的教學實踐中進行了檢驗,收到了很好的效果,在此愿與廣大讀者共享。
二、設(shè)計思路
1.程序功能
采用Visual Foxpro軟件對Excel工作表中的單選題、填充題進行批量自動地閱卷和登分。對于Excel文件的單選題填充題試卷的生成設(shè)計思路詳見2007年6月本刊中《采用非編程方法使用Excel研制單選題填空題考試和閱卷系統(tǒng)》一文,在此省略??忌鸢腹ぷ鞅恚鐖D1所示。
2.在VFP中創(chuàng)建成績表和標準答案表
(1)成績表:CJ.dbf,存放所有考生的信息。表結(jié)構(gòu)如表1所示。
(2)標準答案表DA.dbf,存放所有試題的標準答案。表結(jié)構(gòu)如表2所示。
(3)成績表和標準答案表不提供給考生,當閱卷時和閱卷程序一起使用,安全性更好。
3.程序流程圖(見圖2)
三、技術(shù)難點
1.自動閱卷程序涉及兩個應(yīng)用軟件Visual Foxpro和Excel,必須在VFP中正確批量地自動讀取Excel工作表中的數(shù)據(jù),并且將閱卷成績登錄到VFP的成績表中,解決VFP讀取Excel的技術(shù)問題。
2.Excel中的同一個單元格中的數(shù)據(jù)被讀入到VFP中可能具有不同的數(shù)據(jù)類型。例如:考生做填空題,一個考生輸入了“A”,一個考生輸入了“1”,計算機就認為是不同的數(shù)據(jù)類型,而考生不進行填充,即答案空缺,計算機就認為是數(shù)值型而不是字符型空串;由于設(shè)計的VFP標準答案表的“DA”字段是字符型,所以必須將Excel的任何數(shù)據(jù)類型都轉(zhuǎn)換成字符型,只有同樣的數(shù)據(jù)類型才能夠進行正確比較,如表3所示。程序處理時對讀入VFP中的Excel單元格的數(shù)據(jù)使用數(shù)據(jù)類型函數(shù)vartype()測試,判定是否為數(shù)值型,若是,則使用數(shù)值型轉(zhuǎn)換為字符型函數(shù)str()進行轉(zhuǎn)換。
3.考生答案及標準答案中有可能存在大小寫字母問題,我們知道在字符串中小寫字母“a”與大寫字母“A”是不相等的,而考生則有可能混用,必須采用大小寫轉(zhuǎn)換函數(shù)upper( )統(tǒng)一轉(zhuǎn)換成大寫字母,防止因大小寫混寫所帶來的計分錯誤。
4.考生答案和標準答案中空格的處理。答案中含有空格與不含空格或含空格的多少在字符串比較時結(jié)果是不一樣的,若答案左右兩端含有空格可采用alltrim()函數(shù)去掉,若答案字符串中間含有空格則必須通過程序來實現(xiàn)濾掉空格,將濾掉后的答案字符串再比較,確保計分正確。
四、操作方法
將所有以學生姓名為文件名的Excel試卷文件全部復制到同一個文件夾中,同時將成績表CJ.DBF、標準答案表DA.DBF及程序文件KS.exe三個文件復制到同一個文件夾中,雙擊ks.exe文件后,計算機自動批量地閱卷和登分,閱卷界面見圖3,登分界面見圖4。
五、結(jié)束語
本文介紹了使用Visual Foxpro軟件對Excel文件的單選題、填充題進行自動批量閱卷的實用程序的研制技術(shù)。通過對此程序設(shè)計思想的解析、技術(shù)難點的提示及程序清單的提供,希望能對有志于自己開發(fā)其他應(yīng)用程序的讀者提供幫助,并且在此基礎(chǔ)上進一步完善功能。
程序清單:
set talk off
select 1
use cj.dbf
select 2
useda.dbf
selectcj
go top
do while not eof()
*根據(jù)成績表記錄中的學號和姓名組合成Excel文件名
filename1=alltrim(xh)+alltrim(xm)+".xls"
filename="C:"+filename1
if FILE(filename1)
thisform.label2.visible=.t.
thisform.label2.caption="正在批閱:學號"+alltrim(xh)+" 姓名"+alltrim(xm)
copy file&filename1to&filename
*將Excel工作簿設(shè)置為對象且考生信息工作表為當前活動工作表
shufeole=createobject('Excel.application')
shufeole.workbooks.open(filename,.f.,.f.,,"")
shufeole.worksheets("考生信息").activate
*讀取考生工作表中的學號和姓名,判定為數(shù)值型后轉(zhuǎn)換為字符型
xh1=shufeole.cells(2,5).value
if vartype(xh1)="N"
xh1=alltrim(str(xh1))
endif
xm1=shufeole.cells(2,10).value
if vartype(xh1)="N"
xm1=alltrim(str(xm1))
endif
*讀取Excel工作表中的答案
j=6
cj1=0
for j=6to25
*讀入答案,判斷數(shù)據(jù)類型,若是數(shù)值型,則轉(zhuǎn)換成字符型
da1=shufeole.cells(j,3).value
if vartype(da1)="N"
da1=alltrim(str(da1))
endif
*將答案中所有空格過濾掉*
l=""
n=len(da1)
for k=1 to n
if substr(da1,k,1)<>space(1)
l=l+substr(da1,k,1)
endif
endfor
da1=l
*根據(jù)Excel題目的內(nèi)部標識符到答案庫中查找答案,并濾掉答案中空格
selectda
locateforshufeole.cells(j,10).value=id
iffound()
l=""
n=len(da)
for k=1 to n
if substr(da,k,1)<>space(1)
l=l+substr(da,k,1)
endif
endfor
da2=l
endif
*將答案轉(zhuǎn)換為大寫字母后再進行比較
ifupper(da2)=upper(da1)
cj1=cj1+1
endif
endfor
*將成績寫入成績字段
select cj
replace cj with cj1
*關(guān)閉工作簿,刪除臨時文件
shufeole.activeworkbook.saved=.t.
shufeole.workbooks.close
shufeole.quit
releaseshufeole
if file(filename)
deletefile &filename
endif
endif
skip
enddo
close data
thisform.release
quit
return
參考文獻:
[1]邵洋.Visual Foxpro 6.0數(shù)據(jù)庫系統(tǒng)開發(fā)實例導航[M].北京:人民郵電出版社,2002.
[2]宋立智.Visual Foxpro 6.0中文版數(shù)據(jù)庫編程實戰(zhàn)訓練[M].北京:人民郵電出版社,2003.
[3][美]EricWells著.王華譯.Excel5.0應(yīng)用及開發(fā)技術(shù)精解[M].北京:清華大學出版社,1995.