无忧启动论坛

 找回密码
 注册
搜索

求教,Excel表格问题

查看数: 4484 | 评论数: 63 | 收藏 5
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2024-1-11 12:20

正文摘要:

本帖最后由 123oo456 于 2024-1-11 12:38 编辑 有三张表,分别是学生的3科成绩,现在想把这3张表合并成一张表,每个学生显示3科成绩,已知学号和学生姓名一致,班级排名可以忽略不计,求教怎么操作。 请根据表格 ...

回复

hehuiying 发表于 2024-4-19 15:55:03
谢谢分享
此生有求 发表于 2024-1-24 17:27:55
大神还是多,以后有不懂有指望了
无犹启动 发表于 2024-1-24 17:25:33
学习学习
xsg123456 发表于 2024-1-21 19:52:18
本帖最后由 xsg123456 于 2024-2-1 15:48 编辑
123oo456 发表于 2024-1-21 17:22
你好,最近一直在研究你给的那段代码,就是前几天解决EXCEL汇总的那段代码,实际工作中遇到问题,如果有 ...
  1. function main(){
  2.         //主程序
  3.         let  files = ["语文","数学","英语"]
  4.         let data = sjqx(files).map(v=>(v.splice(4,1),v))
  5.         data.unshift(["学号","姓名","得分","座号","科目"])
  6.         let res = flhz(data)
  7.         Range("a1").ClearContents()
  8.         Range("a1").Resize(res.length,res[0].length).Value2 = res
  9.        
  10. }


  11. function flhz(data){
  12.         //分类汇总
  13.         let [rowN,colN,row,col,res] = [0,0,{},{},[]]
  14.         data.forEach((cur) =>{
  15.                 if(!row[cur[1]]){
  16.                         row[cur[1]] = rowN ++
  17.                         res.push([cur[0],cur[1],cur[3]])
  18.                 }
  19.                 if(!col[cur[4]]) {
  20.                         col[cur[4]] = 3 + colN ++
  21.                         res[0][col[cur[4]]] = cur[4]
  22.                         res[row[cur[1]]][col[cur[4]]]= cur[2]
  23.                 } else{
  24.                         res[row[cur[1]]][col[cur[4]]]= cur[2]
  25.                 }
  26.                
  27.         })
  28.         res = res.map(v=>(v[3]=v[6]+v[4]+v[5],v)).sort((a,b)=>b[3]-a[3])
  29.         return res
  30. }

  31. function readLine(arr){
  32.         //一行重复数据切割
  33.         let tmp = []
  34.         while(arr.length>0){
  35.                 if (arr.length>5) {
  36.                         tmp.push(arr.splice(0,5))
  37.                 }else{
  38.                         tmp.push(arr.splice(0))
  39.                 }
  40.         }
  41.         return tmp
  42. }

  43. function sjqx(files){
  44.         //数据清洗
  45.         let path = ThisWorkbook.Path
  46.         let data =[]
  47.         files.forEach(name =>{
  48.                 let wb = Application.Workbooks.Open( path + `\\${name}.xlsx`)
  49.                 let tmp = wb.Sheets("Sheet1").Range("a2").CurrentRegion.Value2.slice(1)
  50.                 tmp = tmp.map(v => readLine(v)).flat().filter(v => v[0])
  51.                 tmp = tmp.map (v => [...v,name])
  52.                 data.push(...tmp)
  53.                 wb.Close()               
  54.    })
  55.    return data
  56. }
复制代码

xsg123456 发表于 2024-1-21 19:35:02
本帖最后由 xsg123456 于 2024-1-21 19:54 编辑
123oo456 发表于 2024-1-21 17:22
你好,最近一直在研究你给的那段代码,就是前几天解决EXCEL汇总的那段代码,实际工作中遇到问题,如果有 ...


js网上一大堆教程,比如菜鸟教程。至于wps 有关api,官网open.wps.cn。您说的情况代码修改在下楼
promrhxq 发表于 2024-1-21 17:31:56
Excel表格   前来学习了
maowang 发表于 2024-1-21 17:31:09
fg
123oo456 发表于 2024-1-21 17:22:37
xsg123456 发表于 2024-1-11 22:56
给你做 原表不动 新表自动生成  自动总分 排名 的一键版

你好,最近一直在研究你给的那段代码,就是前几天解决EXCEL汇总的那段代码,实际工作中遇到问题,如果有学生缺考一门或者两门就会造成无法统计,需要怎么修改呢,还请大佬指教一下。
另外学习wps的js在哪里有资料可以参考学习,纯属个人爱好,解决一些生活中的小问题的,都需要学习什么
123oo456 发表于 2024-1-13 08:02:21
tanchenglong 发表于 2024-1-12 16:40
WPS最新版,直接带工作汇总功能,速度更快

对基础表格有要求的,这种的实现不了。
tanchenglong 发表于 2024-1-12 16:40:18
WPS最新版,直接带工作汇总功能,速度更快
xsg123456 发表于 2024-1-12 10:21:51
20121666 发表于 2024-1-12 08:54
需要慢慢消化,谢谢,主要是不常接触,自己又笨。以后有问题还请多指教。

这种不规范的表,没法子,只有编程对付
xsg123456 发表于 2024-1-12 10:19:24
likeyouli 发表于 2024-1-12 08:42
这是啥 ?  有的地方像vba,感觉又不是

wps支持vba宏的同时也支持js宏,因此可以跨平台使用,国产linux系统可以运行js宏,我们称他为jsa
20121666 发表于 2024-1-12 09:55:00
ppll2030 发表于 2024-1-12 09:50
简单的办法就是统一报表格式。需要数据,就下发一份统一模板填写。
如果你说得上话就这么办,说不上就让 ...

主要是我们部门只是配合完成,有些工作是临时的。
ppll2030 发表于 2024-1-12 09:50:41
20121666 发表于 2024-1-12 09:04
文件中只是一个例子,各个单位的报表非常多,看到的只是冰山一角,都这样改一遍不现实。所以才请教各位高 ...

简单的办法就是统一报表格式。需要数据,就下发一份统一模板填写。
如果你说得上话就这么办,说不上就让说得上话的人去办
在我们单位,数据岗的表格只要不统一,一律发回重做。
影响统计时间的,责任到当地领导。
当然,如果你的例子已经是统一模板,可以考虑用复杂点的vba汇总了。
不管什么办法,都不是万能呢。就比如你的英语表格,是顶行填写的,语文和数学却又留空一行。
填写位置不统一,这个对于自动化也算是个坑了。
zlzx01 发表于 2024-1-12 09:13:55
好帖!!!!!
20121666 发表于 2024-1-12 09:04:34
ppll2030 发表于 2024-1-11 21:52
https://www.123pan.com/s/fvglVv-DX2Nv.html
三张成绩表最好统一一列。这样有利于统计、汇总和查漏。
汇 ...

文件中只是一个例子,各个单位的报表非常多,看到的只是冰山一角,都这样改一遍不现实。所以才请教各位高手看看有什么简单的解决办法。
车丁 发表于 2024-1-12 08:59:39
学习使用XLOOKUP或VLOOKUP函数,你会发现很多数据都非常方便处理,不过要新版本的OFFICE才支持XLOOKUP。XLOOKUP比VLOOKUP好用,
20121666 发表于 2024-1-12 08:56:13
lixiangliuyi 发表于 2024-1-12 00:09
语数外都排版整齐不要分成3版,

然后以语文(随便那个为模板),新建列数学英语成绩

基层单位报表就这样的,不是一天两天的事。很难改变。
20121666 发表于 2024-1-12 08:54:57
xsg123456 发表于 2024-1-11 22:56
给你做 原表不动 新表自动生成  自动总分 排名 的一键版

需要慢慢消化,谢谢,主要是不常接触,自己又笨。以后有问题还请多指教。
20121666 发表于 2024-1-12 08:51:26
likeyouli 发表于 2024-1-11 17:17
你也在县里上班啊,,咱们一样
  我学习vba 就是因为经常罗罗数据,,下边报上来的数据,最麻烦的是报 ...

就是呗,上报信息一点都不规范,主要是不认真,还不听话。
likeyouli 发表于 2024-1-12 08:42:32

这是啥 ?  有的地方像vba,感觉又不是
lixiangliuyi 发表于 2024-1-12 00:09:53
语数外都排版整齐不要分成3版,

然后以语文(随便那个为模板),新建列数学英语成绩
C#引用epplus,写个方法,根据姓名去其他的表中查找对应的成绩并输出在模板对应的成绩栏目,再写个for循环搞定。
xsg123456 发表于 2024-1-11 22:56:17
本帖最后由 xsg123456 于 2024-1-11 23:27 编辑

给你做 原表不动 新表自动生成  自动总分 排名 的一键版

  1. function collectAll(){
  2. Application.ScreenUpdating = false
  3. let path = ThisWorkbook.Path,
  4.      files = ["语文","数学","英语"],
  5.      obj = {} , res = []
  6. files.forEach(name =>{
  7.   let wb = Application.Workbooks.Open( path + `\\${name}.xlsx`)
  8.   let tmp = wb.Sheets("Sheet1").Range("a2").CurrentRegion.Value2.slice(1)
  9.   tmp.forEach(v => {
  10.    let key = [v[0] , v[1]]
  11.    obj[key] = obj[key]? [...obj[key],v[2]] : [v[2]]
  12.    key = [v[5] , v[6] ]
  13.    obj[key] = obj[key]? [...obj[key],v[7]] : [v[7]]
  14.    key = [v[10] , v[11]]
  15.    obj[key] = obj[key]? [...obj[key],v[12]] : [v[12]]
  16.   })
  17.   wb.Close()
  18. })
  19. let res1 = Object.keys(obj).map(v=>v.split(",")),
  20.   res2 = Object.values(obj).map(v => [...v,v.reduce((p,c) => p*1+c*1)])
  21. res1.unshift(["学号","姓名"])
  22. res2.unshift(["语文","数学","英语","总分"])
  23. res = res1.map((v,i)=> [v[0],v[1],...res2[i]]).sort((a,b)=>b[5]-a[5]).filter(v => v[0])
  24. res = res.map((v,i) => {
  25.   if (i == 0) {
  26.    return [...v,"班级排名"]
  27.   }else{
  28.    return [...v,i]
  29.   }
  30. })
  31.     Range("a2").CurrentRegion.ClearContents()
  32. Range("a2").Resize(res.length,res[0].length).Value2 = res
  33. Application.ScreenUpdating = true   
  34. }
复制代码
成绩表.7z (24.45 KB, 下载次数: 20)

15126222223 发表于 2024-1-11 22:15:45
ppll2030 发表于 2024-1-11 21:52
https://www.123pan.com/s/fvglVv-DX2Nv.html
三张成绩表最好统一一列。这样有利于统计、汇总和查漏。
汇 ...

你做的思路不错。
JOINT 发表于 2024-1-11 22:00:28
谢谢分享
ppll2030 发表于 2024-1-11 21:52:38
https://www.123pan.com/s/fvglVv-DX2Nv.html
三张成绩表最好统一一列。这样有利于统计、汇总和查漏。
汇总表是根据学号匹配各科成绩的。只要把对应的三科成绩复制到对应的工作表里即可。
如果非要横向三组排列的排版。建议检查无误后,复制一份副本重新排版。
xsg123456 发表于 2024-1-11 21:30:58
本帖最后由 xsg123456 于 2024-1-11 21:51 编辑

成绩表.7z (24.33 KB, 下载次数: 14)


终于传上了附件
忘记说了,wps下开启宏即可食用
xsg123456 发表于 2024-1-11 21:25:06



xsg123456 发表于 2024-1-11 21:13:49
本帖最后由 xsg123456 于 2024-1-11 22:08 编辑
  1. function collectAll(){
  2. let path = ThisWorkbook.Path,
  3. files = ["语文","数学","英语"],
  4. obj = {}
  5. files.forEach(name =>{
  6. let wb = Application.Workbooks.Open( path + `\\${name}.xlsx`)
  7. let tmp = wb.Sheets("Sheet1").Range("a2").CurrentRegion.Value2.slice(1)
  8. tmp.forEach(v => {
  9. let key = [v[0] , v[1] , v[3]]
  10. obj[key] = obj[key]? [...obj[key],v[2]] : [v[2]]
  11. key = [v[5] , v[6] , v[8]]
  12. obj[key] = obj[key]? [...obj[key],v[7]] : [v[7]]
  13. key = [v[10] , v[11] , v[13]]
  14. obj[key] = obj[key]? [...obj[key],v[12]] : [v[12]]
  15. })
  16. wb.Close()
  17. })
  18. let res1 = Object.keys(obj).map(v=>v.split(",")),
  19. res2 = Object.values(obj)
  20. res1.unshift(["学号","姓名","班号"])
  21. res2.unshift(files)
  22. res = res1.map((v,i)=> [v[0],v[1],...res2[i],v[2]]).sort((a,b)=>a[0]-b[0]).filter(v => v[0])
  23. Range("a2").CurrentRegion.ClearContents()
  24. Range("a2").Resize(res.length,res[0].length).Value2 = res

  25. }
复制代码

lotus136 发表于 2024-1-11 21:02:01
过来学习学习

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-2-21 03:08

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表