何叫导入?简单说,导入就是把excel表格里的数据插入到数据库里。我这里做的是支持.xls和.xlsx格式。

因为是自己做案例记录,那些jar包什么的就不细说了,主要讲实现和步骤,看代码:

 

先在你的项目文件中创建一个excel表格模板,方便用户知晓导入的格式和文件内容:

 

导入功能 Java 导入功能在哪_excel表格

 

一、页面中导入按钮

导入功能 Java 导入功能在哪_数据库_02

 

二、点击按钮跳转到导入页面,这里直接用的标签跳转,<%@ include file="importHarness.jsp"%>

 

导入功能 Java 导入功能在哪_java_03

 

导入功能 Java 导入功能在哪_excel表格_04

 

三、点确认时先做下验证,文件格式、类型什么的

 

导入功能 Java 导入功能在哪_java_05

$('#importHarnessForm')为form表单id,(".hp_form_error")为确认按钮上方一个隐藏的DIV的class,显示提示信息用的。

 

四、点击确认按钮  传值  后台代码:

 

导入功能 Java 导入功能在哪_导入功能 Java_06

 

Controller类:

@RequestMapping(value = "/import" , method = RequestMethod.POST)
 @ResponseBody
 public String xlsImport(@RequestParam("xlsfile") MultipartFile file){
 // 返回string类型为解决ie9兼容性
 ResponseBase responseBase = new ResponseBase();
 if (file.isEmpty()) {
 responseBase.setMessage("'文件内容不能为空'");
 responseBase.setStatus(DATA_VALIDATION_ERROR);
 return responseBase.toString();
 }
 //文件名
 String fileName = file.getOriginalFilename();
 if (fileName == null || (!fileName.endsWith(".xls") && !fileName.endsWith(".xlsx"))) {
 responseBase.setMessage("'文件格式不正确'");
 responseBase.setStatus(DATA_VALIDATION_ERROR);
 return responseBase.toString();
 }
 InputStream inputStream = null;
 try{
 inputStream = file.getInputStream();
 Workbook wb = null;
 if (fileName.endsWith(".xlsx")) {
 wb = new XSSFWorkbook(inputStream);
 }else {
 wb = new HSSFWorkbook(inputStream);
 }
 //获取第一个工作表对象
 Sheet sheet = wb.getSheetAt(0);
 //行号
 int rowNum = sheet.getLastRowNum();
 //最大导入数
 if (sheet.getLastRowNum() > 1000) {
 responseBase.setMessage("'数据最多可导入1000条");
 responseBase.setStatus(DATA_VALIDATION_ERROR);
 return responseBase.toString();
 }
 Subject currentUser = SecurityUtils.getSubject();
 Session session = currentUser.getSession();
 Integer uid = (Integer) session.getAttribute("userId");
 List<HarnessDTO> hpList = new ArrayList<HarnessDTO>();
 int count = 0; //成功条数
 int ercount = 0; //失败条数
 for (int i = 1; i <= rowNum; i++) { HarnessDTO hp = new HarnessDTO();
 Row row = sheet.getRow(i);
 String brandId = FileOperateUtil.getCellValue(row.getCell(0));
 String seriesId = FileOperateUtil.getCellValue(row.getCell(1));
 String modelId = FileOperateUtil.getCellValue(row.getCell(2));
 String harnessInfo = FileOperateUtil.getCellValue(row.getCell(3));

 if(StringUtils.isNotBlank(brandId) && StringUtils.isNotBlank(seriesId) && StringUtils.isNotBlank(harnessInfo)){
 int rowCount = harnessPositionService.selectCount(brandId, seriesId, modelId);
 if(rowCount >= 0){
 hp.setBrandId( brandId );
 hp.setSeriesId( seriesId) ;
 hp.setModelId("".equals(modelId) ? "-1" : modelId);
 hp.setHarnessInfo(harnessInfo);
 hp.setStatus("1");
 hp.setEditUser(String.valueOf(uid));
 hpList.add(hp); 
 count ++;
 }else{
 ercount++;
 } 
 }else{
 responseBase.setMessage("'车辆品牌、型号和线束管理不能为空,导入失败,请重新导入'");
 responseBase.setStatus(DATA_VALIDATION_ERROR);
 return responseBase.toString();
 } 
 }
 harnessPositionService.insertCount(hpList);
 if (count == 0) {
 responseBase.setStatus(DATA_VALIDATION_ERROR);
 } 
 responseBase.setMessage("'已成功导入" + count + "条,失败" + ercount + "条'");
 }catch(Exception e){
 logger.error("文件格式不符合要求,导入失败,请重新导入 ", e);
 responseBase.setMessage("'文件格式不符合要求,导入失败,请重新导入'");
 responseBase.setStatus(DATA_VALIDATION_ERROR);
 return responseBase.toString();
 }finally{
 try {
 if (inputStream != null) {
 inputStream.close();
 inputStream = null;
 }
 } catch (IOException e) {
 logger.error("关闭文件流失败", e);
 responseBase.setMessage("'关闭文件流失败'");
 responseBase.setStatus(DATA_VALIDATION_ERROR);
 return responseBase.toString();
 }
 }
 return responseBase.toString();
 }

 

Service类:

 

导入功能 Java 导入功能在哪_导入功能 Java_07

实现类:

 

导入功能 Java 导入功能在哪_导入功能 Java_08

 

DAO层:

 

导入功能 Java 导入功能在哪_数据库_09

 

SQL:

 

导入功能 Java 导入功能在哪_导入功能 Java_10

导入功能 Java 导入功能在哪_导入功能 Java_11

 

这是实现的全部代码,值得注意的是Controller类获取行数的时候,int rowNum = sheet.getLastRowNum();  往往会出现如下情况:

获取到的行数要大于实际表格中(有数据)的行数,自己解决办法:

1.在循环中,自己再嵌入一层循环,判断获取到的行数是否为空,为空跳出循环执行下一次循环(continue)

2.偷懒的方法,创建的模板,手动把模板下面的行和列删除、清空内容一次,选多点行数,几千行随你选,这样导入的时候就不会出现那种情况啦(只是针对导入模板的用户  选此方法吧)

导入功能 Java 导入功能在哪_导入功能 Java_12