1.jsp传入excel文件,控制器接收文件
@RequestMapping("/AuploadStuTem.action")
@Transactional
public String AuploadStuTem(@RequestParam("files") MultipartFile file,Integer cou_id,HttpServletRequest request,HttpServletResponse response,Model model) {
courseService.AuploadStuTem(file,cou_id,request, response);
model.addAttribute("cou_id", cou_id);
return "/admin/lookupcourse";
}
2.调用Service读取excel中的数据,将数据保存到数据库中
@Override
@Transactional
public String AuploadStuTem(MultipartFile file, Integer cou_id, HttpServletRequest request,
HttpServletResponse response) {
String result="";
if (file.isEmpty()) {
System.out.println("文件读取失败");
}
// 获取excel的物理名称
// System.out.println(file.getOriginalFilename());
InputStream in = null;
try {
// 获取一个输入流
in = file.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
//里面的集合存储是一行数据,外面的集合是所有的行
List<List<Object>> listob = null;
try {
listob = new ExcelUtils().getBankListByExcel(in, file.getOriginalFilename());
} catch (Exception e) {
e.printStackTrace();
}
// 声明int类型的变量size用于进行判断传入的excl真实的版本
int size = 0;
// 该处可调用service相应方法进行数据保存到数据库中,现只对数据输出
String fileType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
// 如果以.xls结尾且真正的由2003版本之前的excel写的
if (".xls".equals(fileType)) {
size = listob.size(); // 2003-
// 如果以.xlsx结尾且真正的由2007版本之后的excel写的
// 经过测试2007版本以后的excel用util方法会在集合里多产生两个实体 所以这里在循环时次数减去2
// 如果是2007以后的版本只把后缀改了会在excel里报版本异常
} else if (".xlsx".equals(fileType)) {
size = listob.size() - 2; // 2007+
}
//查询出本门课程的实验指标的数量
List<TeacherExperimental> listteaexp=courseDao.queryTeacherExperimental(cou_id);
// 循环出表格中的行数,一行对应一个对象
for (int i = 1; i < size; i++) {
List<Object> lo = listob.get(i);
StudentCourse studentCourse = new StudentCourse();
Integer stu_id = null;
// 根据学生的学号查询出学生的id
stu_id = courseDao.selectBystuno(String.valueOf(lo.get(0)));
// 将该人员信息赋值给一个对象
studentCourse.setStu_id(stu_id);
Integer score = 0;
for(int j=0;j<listteaexp.size();j++) {
score+=Integer.parseInt(String.valueOf(lo.get(4+j)));
}
//studentCourse.setStu_score(Integer.parseInt(String.valueOf(lo.get(4))));score
studentCourse.setStu_score(score);
studentCourse.setTea_remark(String.valueOf(lo.get(4+listteaexp.size())));
studentCourse.setCou_id(cou_id);
for(int k = 0;k<listteaexp.size();k++) {
if(Integer.parseInt(String.valueOf(lo.get(4+k)))>listteaexp.get(k).getTe_exp_score()) {
result = "评分分数大于最高分数,请参考创建课程时为每项实验指标设置的分数重新评分。";
return result;
}else {
//判断该学生之前是否被导入过成绩,如果是则更新表数据,如果没有则插入数据
StudentExperimental se = courseDao.queryStudentExperiment(cou_id,stu_id,listteaexp.get(k).getExp_id());
if(se==null) {
courseDao.insertStuExpByExcel(cou_id,stu_id,listteaexp.get(k).getExp_id(),Integer.parseInt(String.valueOf(lo.get(4+k))));
}else {
courseDao.updateStuExp(cou_id, stu_id,listteaexp.get(k).getExp_id(),Integer.parseInt(String.valueOf(lo.get(4+k))));
}
}
}
courseDao.updateStuCouByStuId(studentCourse);
}
result = "文件导入成功!";
return result;
}
3.工具类代码
public List<List<Object>> getBankListByExcel(InputStream in,String fileName) throws Exception{
List<List<Object>> list = null;
//创建Excel工作薄
Workbook work = this.getWorkbook(in,fileName);
if(null == work){
throw new Exception("创建Excel工作薄为空!");
}
Sheet sheet = null; //页数
Row row = null; //行数
Cell cell = null; //列数
list = new ArrayList<List<Object>>();
//遍历Excel中所有的sheet
for (int i = 0; i < work.getNumberOfSheets(); i++) {
sheet = work.getSheetAt(i);
if(sheet==null){
continue;
}
//遍历当前sheet中的所有行
for (int j =3; j <= sheet.getLastRowNum(); j++) {
row = sheet.getRow(j);
System.out.println();
if(row==null||row.getFirstCellNum()==j){
continue;
}
//遍历所有的列
List<Object> li = new ArrayList<Object>();
for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {
cell = row.getCell(y);
li.add(this.getValue(cell));
}
list.add(li);
}
}
return list;
}
另外我卖鞋,A锥、椰子、麦昆、古驰、匡威、彪马、UGG、CK、巴黎世家等等,啥都有,物美价廉,有想法加微信哦:AJ666cmy