批量导入使用的场景挺多的,自己毕设也涉及到了,做个记录。
导包在上一篇里已经提到了,这里就略过,重点记录一下实现的过程。
JSP 界面
这个部分和上传 word 的一样,就是一个 form
<form class="form-horizontal" id="fm_batchImport" method="post" enctype="multipart/form-data">
<input id="batchImport" name="enclosure" type="file"
accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel">
<a href="studentTemplate">模板下载</a>
<button type="button" onClick="saveBatchImport()">提交</button>
</form>
还是和 word 一样,这里稍微做一个 accept 的验证,其实然并卵,后台还是需要判断。然后还是采用的 Ajax 上传,弄成 formData。
Controller
两个方法,一个是作为导入,一个响应下载导入模板。
//批量导入学生信息
@RequestMapping(value="/batchImport",method=RequestMethod.POST)
@ResponseBody
public Integer batchImport(@ModelAttribute MultipartFile file, HttpServletRequest request, HttpServletResponse response) throws Exception {
int result = studentService.batchImportByAdmin(file, request, response);
return result;
}
//模板下载
@RequestMapping("/studentTemplate")
@ResponseBody
public void studentTemplate(HttpServletRequest request, HttpServletResponse response) {
// excel标题
String[] title = { "学历名称", "专业名称", "学生姓名", "入学时间(yyyy-MM-dd)" };
// excel文件名
String fileName = "批量导入学生信息模板" + System.currentTimeMillis() + ".xls";
// sheet名
String sheetName = "学生模板";
String[][] content = new String[0][title.length];
//创建HSSFWorkbook
HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null);
// 响应到客户端
try {
this.setResponseHeader(response, fileName);
OutputStream os = response.getOutputStream();
wb.write(os);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private void setResponseHeader(HttpServletResponse response, String fileName) {
try {
try {
fileName = new String(fileName.getBytes(), "ISO-8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
response.setContentType("application/octet-stream;charset=ISO-8859-1");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
response.addHeader("Pargam", "no-cache");
response.addHeader("Cache-Control", "no-cache");
} catch (Exception ex) {
ex.printStackTrace();
}
}
用到一个工具类 ExcelUtil
Service
具体的逻辑处理部分,读取表格数据。
@Override
public Integer batchImportByAdmin(MultipartFile file, HttpServletRequest request, HttpServletResponse response) throws Exception{
if (file.isEmpty()) {
try {
throw new Exception("文件不存在!");
} catch (Exception e) {
e.printStackTrace();
}
}
//这里可以使用String originalFilename = file.getOriginalFilename();
//originalFilename.endsWith(".xls") || originalFilename.endsWith(".xlsx")
//做一个后缀名的判断,从而限制前端的文件格式
InputStream in = null;
try {
in = file.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
List<List<Object>> listob = null;
try {
listob = new ExcelUtil().getBankListByExcel(in,file.getOriginalFilename());
} catch (Exception e) {
e.printStackTrace();
}
// 该处可调用mapper相应方法进行数据保存到数据库中
for (int i = 0; i < listob.size(); i++) {
List<Object> lo = listob.get(i);
Student student = new Student();
//这里可以做一些数据库查询操作等等..
//这里的lo集合就是Excel表对应的列的数据(第一行默认是表头,不读取)
String.valueOf(lo.get(0));//表示第i行第一列的数据,以此类推...
//把数据塞入student对象,调用mapper方法进行存储
student.setXXX();
studentMapper.insertSelective(student);
}
return ...;
}
这样就完成了 Excel 的批量导入导出功能。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于