需求
一、8个考场共416名考生参考,每个考场有:语文、数学、英语、政治、历史、地理、生物,共计7个科目的成绩表
二、按照考号汇总每个考生7个科目的考试成绩
每个考场每个科目的每个考生的成绩表格式
汇总完成效果
WPS JS代码实现过程
function CommandButton1_Click() {
Application.ScreenUpdating = false
//获取文件路径
let suffix = 'Excel Files(*.xls;*.xlsx;*.csv), *.xls;*.xlsx;*.csv';
let pths = Application.GetOpenFilename(suffix, 1, '可选多个文件', undefined, true);
if (!pths) return Columns('A:M').ClearContents()
//获取时间戳,记录程序运行时间
let start = Date.now()
//获取每个学生各科目的成绩汇总数据
let data = getSubjectSplit(pths)
let ros = data.length + 1
//写入数据
Columns('A:M').ClearContents()
Range('A2').Resize(data.length, data[0].length).Value2 = data
Range('M2').Value2 = '总分'
Range('M3').Formula = '=SUM(D3:L3)'
Range('M3:M' + ros).FillDown()
Range('M3:M' + ros).Value2 = Range('M3:M' + ros).Value2
Application.ScreenUpdating = true
let end = (Date.now() - start) / 1000
alert('完成,用时:' + end + 's')
}
//按考号分类汇总各科目成绩
function getSubjectSplit(pths) {
const obj = {}
pths.forEach(pth => {
let wb = Workbooks.Open(pth) //打开工作簿
let data = wb.ActiveSheet.Range('A1').CurrentRegion.Value2 //获取数据
let subject = data[0][4] //科目
data.shift() //去表头
wb.Close()
//按考号分类汇总各科目成绩
data.forEach(i => {
let num = i[0] //考号
if (obj[num]) {
obj[num][subject] = i[4] //记录对应科目的分数
} else {
obj[num] = {}
obj[num]['考号'] = i[0]
obj[num]['班级'] = i[1]
obj[num]['姓名'] = i[3]
obj[num][subject] = i[4]
}
})
})
const data = [['考号', '班级', '姓名', '语文', '数学', '英语', '政治', '历史', '地理', '生物', '物理', '化学']] //定义表头
for (let o in obj) {
let arr = []
data[0].forEach(i => arr.push(obj[o][i]))
data.push(arr)
}
return data
}
动图效果