目录
Blue留言 :
学本篇文章之前所需掌握技能
推荐视频:
代码逻辑思想
步骤:
1、引入依赖
2、做一个excel表格
3、java实现从excel表中取数据
第一步:根据excel上面的字段名(如下图),我们创建一个类,该成员变量和字段名一一对应
第二步:利用Easyexcel取excel中的数据
第三步:利用Random与for循环从list1集合中随机抽出来几条数据再放进其他集合中
第四步:按照举例的步骤(步骤3的前三步)自己动手实现一下吧
第五步:写接口传递给前端(这步将会把前三部的所有代码展示出来)
第六步:前端渲染(并非重点)
Blue留言 :
🎉🎉🎉Hello,Hello!这里是Blue,一位发誓要成为很厉害的全栈的博主,今天俺带来的文章是利用Excel表格结合Java去实现类似出题软件的效果。在这篇文章中,我将会通过图文形式,会把所有的代码全给列举出来,保证看完这篇文章的各位宝子们能学会。那么,废话不多说我们开始接下来的编程之旅吧!!!🎉🎉🎉
学本篇文章之前所需掌握技能
- 1、会java语言基础
- 2、会代建springboot框架
推荐视频:
http://【使用Java语言操作Excel表格全攻略】https://www.bilibili.com/video/BV1Ff4y1U7Qc?p=18&vd_source=bb412cc25ca27e171f8e17085daad038
视频主要讲解如何实现用java去对excel进行读写,实际上我们做简单的题库,并不需要去进行写操作,能够从excel读便就达到我们的目的了。
代码逻辑思想
代码逻辑很简单,搭建springboot框架,利用Easyexcel这个开源的库,对Excel表格里面的数据取出来,存储在一个集合中,再利用随机数Random和for循环对该集合进行二次开发(利用随机数生成索引,从集合里面取出来数据再组合成另一个集合),最后将该集合转成json格式传递给前端进行渲染。
步骤:
1、引入依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.3</version></dependency>
注意:若做项目时候所使用过poi依赖,请导入的下面依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel-core</artifactId> <version>3.2.1</version> <exclusions> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> </exclusion> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> </exclusion> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> </exclusion> </exclusions> </dependency>
2、做一个excel表格
如图:
接下来我分析一下该excel需要形成的样子如下图:
3、java实现从excel表中取数据
利用Easyexcel这个开源库,我们很容易就能实现该功能,废话不多说,直接上教程!!!!
第一步:根据excel上面的字段名(如下图),我们创建一个类,该成员变量和字段名一一对应
画红线的则为字段名,拿选择题、题目1、答案11、答案12、答案14、答案14、正确答案举例
我们创建一个类,类名为selectquestion
mport com.alibaba.excel.annotation.ExcelProperty;public class selectquestion { @ExcelProperty("选择题") private int num; @ExcelProperty("题目1") private String topic; @ExcelProperty("答案11") private String anserA; @ExcelProperty("答案12") private String anserrB; @ExcelProperty("答案13") private String anserC; @ExcelProperty("答案14") private String anserD; @ExcelProperty("正确答案") private String success; public selectquestion() { } public selectquestion(int num, String topic, String anserA, String anserrB, String anserC, String anserD, String success) { this.num = num; this.topic = topic; this.anserA = anserA; this.anserrB = anserrB; this.anserC = anserC; this.anserD = anserD; this.success = success; } /** * 获取 * @return num */ public int getNum() { return num; } /** * 设置 * @param num */ public void setNum(int num) { this.num = num; } /** * 获取 * @return topic */ public String getTopic() { return topic; } /** * 设置 * @param topic */ public void setTopic(String topic) { this.topic = topic; } /** * 获取 * @return anserA */ public String getAnserA() { return anserA; } /** * 设置 * @param anserA */ public void setAnserA(String anserA) { this.anserA = anserA; } /** * 获取 * @return anserrB */ public String getAnserrB() { return anserrB; } /** * 设置 * @param anserrB */ public void setAnserrB(String anserrB) { this.anserrB = anserrB; } /** * 获取 * @return anserC */ public String getAnserC() { return anserC; } /** * 设置 * @param anserC */ public void setAnserC(String anserC) { this.anserC = anserC; } /** * 获取 * @return anserD */ public String getAnserD() { return anserD; } /** * 设置 * @param anserD */ public void setAnserD(String anserD) { this.anserD = anserD; } /** * 获取 * @return success */ public String getSuccess() { return success; } /** * 设置 * @param success */ public void setSuccess(String success) { this.success = success; } public String toString() { return "selectquestion{num = " + num + ", topic = " + topic + ", anserA = " + anserA + ", anserrB = " + anserrB + ", anserC = " + anserC + ", anserD = " + anserD + ", success = " + success + "}"; }}
根据我写的代码,我简要分析一下,方便大家理解:
@ExcelProperty("选择题")
private int num;
这个注解是用来指名,num这个变量是去和excel表中选择题下面的每一行对应的(如图)
同理其余六个成员变量如此,剩下的就是生成get、set、toString、有参无参构造方法了
第二步:利用Easyexcel取excel中的数据
我们建立一个类test,该类有一个该方法xyh()
public void xyh() { //整体数组 ArrayList<selectquestion> list1 = new ArrayList<>(); ArrayList<panduan> list2 = new ArrayList<>(); ArrayList<zhuguanti> list3 = new ArrayList<>(); //路径 String fileName="src/main/resources/doc/测试.xlsx";//相对路径 //1、取选择题 EasyExcel.read(fileName, selectquestion.class, new AnalysisEventListener<selectquestion>() {//每取excel中的一行,调用一次该函数 @Override public void invoke(selectquestion selectquestion, AnalysisContext analysisContext) { list1.add(selectquestion); }//将所有行取完,调用一次该函数 @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { } }).sheet().doRead();}
这里强调一下这几个地方:
fileName:这里,是因为我在springboot下的resources文件夹下建立了一个doc文件夹,将步骤2的excel表放入该地方,用的是相对路径。
EasyExcel.read()参数 :
- 参数一:路径
- 参数二:所取excel表中字段要对齐,这里字段对齐用的是类(详见步骤3中第一步),所以使用类.class
- 参数三:固定写法,注意泛型是类名
看看效果:
利用xyh()函数中的list1集合和invoke()函数//该函数作用上面代码有注释,将取出每一条信息add进集合,再利用for循环打印出来
第三步:利用Random与for循环从list1集合中随机抽出来几条数据再放进其他集合中
//生成随机数 Random random = new Random(); ArrayList<selectquestion> selerandom = new ArrayList<>(); //制作随机选择集合 for (int i=0;i<3;i++){ int j = random.nextInt(0,4); selerandom.add(list1.get(j)); } for (int i =0;i<selerandom.size();i++){ System.out.println(selerandom.get(i)); }
看看效果: blue:可能这里大家会有点乱了,没事,我下面会把这一整代码放出来,不要害怕
第四步:按照举例的步骤(步骤3的前三步)自己动手实现一下吧
Blue:加油加油!!!
第五步:写接口传递给前端(这步将会把前三部的所有代码展示出来)
- 建立:text类
- 代码:
import com.alibaba.excel.EasyExcel;import com.alibaba.excel.context.AnalysisContext;import com.alibaba.excel.event.AnalysisEventListener;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import java.util.Random;@RestControllerpublic class text { @PostMapping("xyh") public Map<String, Object> xyh() { //整体数组 ArrayList<selectquestion> list1 = new ArrayList<>(); ArrayList<panduan> list2 = new ArrayList<>(); ArrayList<zhuguanti> list3 = new ArrayList<>(); //随机数组 ArrayList<selectquestion> selerandom = new ArrayList<>(); ArrayList<panduan> panduanrandom=new ArrayList<>(); ArrayList<zhuguanti> zhuguantirandom = new ArrayList<>(); //路径 String fileName="src/main/resources/doc/测试.xlsx"; //1、取选择题 EasyExcel.read(fileName, selectquestion.class, new AnalysisEventListener<selectquestion>() { @Override public void invoke(selectquestion selectquestion, AnalysisContext analysisContext) { list1.add(selectquestion); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { } }).sheet().doRead(); //生成随机数 Random random = new Random(); //制作随机选择集合 for (int i=0;i<3;i++){ int j = random.nextInt(0,4); selerandom.add(list1.get(j)); } for (int i =0;i<selerandom.size();i++){ System.out.println(selerandom.get(i)); } System.out.println("----------------------------------------------------------------------"); //2、判断 EasyExcel.read(fileName, panduan.class, new AnalysisEventListener<panduan>() { @Override public void invoke(panduan panduan, AnalysisContext analysisContext) { list2.add(panduan); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { } }).sheet().doRead(); //制作随机选择集合 for (int i=0;i<3;i++){ int j = random.nextInt(0,4); panduanrandom.add(list2.get(j)); } for (int i =0;i<panduanrandom.size();i++){ System.out.println(panduanrandom.get(i)); } System.out.println("-----------------------------------------------------"); //3、主观题 EasyExcel.read(fileName, zhuguanti.class, new AnalysisEventListener<zhuguanti>() { @Override public void invoke(zhuguanti zhuguanti, AnalysisContext analysisContext) { list3.add(zhuguanti); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { } }).sheet().doRead(); //制作随机主观题 for (int i=0;i<2;i++){ int j = random.nextInt(0,2); zhuguantirandom.add(list3.get(j)); } for (int i =0;i<zhuguantirandom.size();i++){ System.out.println(zhuguantirandom.get(i)); } //打包发给前端 Map<String, Object> map = new HashMap<>(); map.put("选择题",selerandom); map.put("判断题",panduanrandom); map.put("主观题",zhuguantirandom);return map; }}
前端接受到的效果:
第六步:前端渲染(并非重点)
思路:
- 1、搭建vue2框架
- 2、引入axios依赖
- 3、整体代码
代码:
<template> <div><button @click="map()">测试题库</button> --><div v-if="y()"><div>题目:{{ tableselect[selectnumber1].topic}}</div><div><span>选择A: {{tableselect[selectnumber1].anserA}}</span></div><div><span>选择B: {{tableselect[selectnumber1].anserrB}}</span></div><div><span>选择C: {{tableselect[selectnumber1].anserC}}</span></div><div><span>选择D: {{tableselect[selectnumber1].anserD}}</span></div><div><input v-model="input"></div><button @click="syz()">下一道题</button><button @click="ly()">提交</button></div><div v-if="k()"><div>题目:{{tablepanudan[panudannumber1].topic}}</div><div>正确</div><div>错误</div><div><input v-model="input"></div><button @click="syk()">下一道题</button><button @click="lk()">提交</button></div> </div></template><script>import axios from 'axios'export default { data() { return { tableselect: [], tablepanudan: [], tablezhuguan: [], selectnumber: null, selectnumber1: 0, panduannumer: null, panudannumber1:0, input: '', } }, methods: { ly() { if (this.input == this.tableselect[this.selectnumber1].success) { alert("正确") this.input='' } else { alert("错误") this.input='' } }, lk() { if (this.input == this.tablepanudan[this.panudannumber1].anser) { alert("正确") this.input='' } else { alert("错误") this.input='' } }, y() { if (this.selectnumber>0) { return true; } else { this.panduannumer=this.tablepanudan.length return false; } }, k() { if (this.panduannumer > 0) { return true; } else { return false; } }, syz() { if (this.selectnumber > 0) { this.selectnumber1 = this.selectnumber1 + 1; this.selectnumber = this.selectnumber - 1; console.log(this.selectnumber); } }, syk() { if (this.panduannumer > 0) { this.panudannumber1 = this.panudannumber1 + 1; this.panduannumer = this.panduannumer - 1; console.log(this.panudannumber1); } }, map() { axios.post("http://localhost:8081/xyh").then(e => { const data = e.data; console.log(data); this.tableselect = data.选择题; this.tablepanudan = data.判断题; this.tablezhuguan = data.主观题; console.log(this.tableselect); console.log(this.tablepanudan); console.log(this.tablezhuguan); this.selectnumber = this.tableselect.length; console.log(this.selectnumber); }) }, }, mounted() { this.map(); }}</script>
效果:
结尾
🎉🎉🎉在结束这篇关于随机题库系统前后端思路与代码实现的博文之际,我们不难发现,构建一个高效、灵活的随机题库系统不仅需要对前后端技术有深入的理解,更需要细致的规划与不断的优化。通过本文的探讨,我们从需求分析、后端逻辑处理到前端交互展示,全方位地剖析了随机题库系统的构建过程。希望读者能够从中获得启发,无论是对于个人学习项目还是企业应用开发,都能有所裨益。
未来,随着教育技术的不断进步和用户需求的日益多样化,随机题库系统也将不断进化,融入更多智能化、个性化的元素。我们期待看到更多创新性的解决方案涌现,为教育学习带来更加便捷、高效的体验。同时,也鼓励大家继续探索和实践,共同推动教育科技领域的繁荣发展。感谢阅读,期待与您在下一个技术探索的旅程中再次相遇!🎉🎉🎉