赵龙强
摘 要:本文主要介绍了如何使用Visual Foxpro软件来研制对Excel文件进行单选题、填充题自动批量阅卷应用程序的技术。该技术不仅解决了教师对大批量Excel试卷中单选题、填充题的阅卷和登分的繁琐问题,同时给读者自己开发其他应用程序提供了案例。
关键词:Excel 考试系统 自动阅卷
中图分类号:TP391 文献标识码:B 文章编号:1673-8454(2009)03-0091-03
一、问题的提出
笔者于2007年6月在本刊发表了《采用非编程方法使用Excel研制单选题填空题考试和阅卷系统》,详细介绍了利用Excel进行单选题和填充题试卷设计和人工阅卷的方法,收到了许多读者来信和来电询问如何解决大批量地自动进行阅卷及成绩登录的问题。笔者进行了程序研制,并且在一年多的教学实践中进行了检验,收到了很好的效果,在此愿与广大读者共享。
二、设计思路
1.程序功能
采用Visual Foxpro软件对Excel工作表中的单选题、填充题进行批量自动地阅卷和登分。对于Excel文件的单选题填充题试卷的生成设计思路详见2007年6月本刊中《采用非编程方法使用Excel研制单选题填空题考试和阅卷系统》一文,在此省略。考生答案工作表,如图1所示。
2.在VFP中创建成绩表和标准答案表
(1)成绩表:CJ.dbf,存放所有考生的信息。表结构如表1所示。
(2)标准答案表DA.dbf,存放所有试题的标准答案。表结构如表2所示。
(3)成绩表和标准答案表不提供给考生,当阅卷时和阅卷程序一起使用,安全性更好。
3.程序流程图(见图2)
三、技术难点
1.自动阅卷程序涉及两个应用软件Visual Foxpro和Excel,必须在VFP中正确批量地自动读取Excel工作表中的数据,并且将阅卷成绩登录到VFP的成绩表中,解决VFP读取Excel的技术问题。
2.Excel中的同一个单元格中的数据被读入到VFP中可能具有不同的数据类型。例如:考生做填空题,一个考生输入了“A”,一个考生输入了“1”,计算机就认为是不同的数据类型,而考生不进行填充,即答案空缺,计算机就认为是数值型而不是字符型空串;由于设计的VFP标准答案表的“DA”字段是字符型,所以必须将Excel的任何数据类型都转换成字符型,只有同样的数据类型才能够进行正确比较,如表3所示。程序处理时对读入VFP中的Excel单元格的数据使用数据类型函数vartype()测试,判定是否为数值型,若是,则使用数值型转换为字符型函数str()进行转换。
3.考生答案及标准答案中有可能存在大小写字母问题,我们知道在字符串中小写字母“a”与大写字母“A”是不相等的,而考生则有可能混用,必须采用大小写转换函数upper( )统一转换成大写字母,防止因大小写混写所带来的计分错误。
4.考生答案和标准答案中空格的处理。答案中含有空格与不含空格或含空格的多少在字符串比较时结果是不一样的,若答案左右两端含有空格可采用alltrim()函数去掉,若答案字符串中间含有空格则必须通过程序来实现滤掉空格,将滤掉后的答案字符串再比较,确保计分正确。
四、操作方法
将所有以学生姓名为文件名的Excel试卷文件全部复制到同一个文件夹中,同时将成绩表CJ.DBF、标准答案表DA.DBF及程序文件KS.exe三个文件复制到同一个文件夹中,双击ks.exe文件后,计算机自动批量地阅卷和登分,阅卷界面见图3,登分界面见图4。
五、结束语
本文介绍了使用Visual Foxpro软件对Excel文件的单选题、填充题进行自动批量阅卷的实用程序的研制技术。通过对此程序设计思想的解析、技术难点的提示及程序清单的提供,希望能对有志于自己开发其他应用程序的读者提供帮助,并且在此基础上进一步完善功能。
程序清单:
set talk off
select 1
use cj.dbf
select 2
useda.dbf
selectcj
go top
do while not eof()
*根据成绩表记录中的学号和姓名组合成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工作簿设置为对象且考生信息工作表为当前活动工作表
shufeole=createobject('Excel.application')
shufeole.workbooks.open(filename,.f.,.f.,,"")
shufeole.worksheets("考生信息").activate
*读取考生工作表中的学号和姓名,判定为数值型后转换为字符型
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
*读入答案,判断数据类型,若是数值型,则转换成字符型
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
*根据Excel题目的内部标识符到答案库中查找答案,并滤掉答案中空格
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
*将答案转换为大写字母后再进行比较
ifupper(da2)=upper(da1)
cj1=cj1+1
endif
endfor
*将成绩写入成绩字段
select cj
replace cj with cj1
*关闭工作簿,删除临时文件
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数据库系统开发实例导航[M].北京:人民邮电出版社,2002.
[2]宋立智.Visual Foxpro 6.0中文版数据库编程实战训练[M].北京:人民邮电出版社,2003.
[3][美]EricWells著.王华译.Excel5.0应用及开发技术精解[M].北京:清华大学出版社,1995.