SSM框架下实现导入功能
何叫导入?简单说,导入就是把excel表格里的数据插入到数据库里。我这里做的是支持.xls和.xlsx格式。
因为是自己做案例记录,那些jar包什么的就不细说了,主要讲实现和步骤,看代码:
先在你的项目文件中创建一个excel表格模板,方便用户知晓导入的格式和文件内容:
一、页面中导入按钮
二、点击按钮跳转到导入页面,这里直接用的标签跳转,<%@ include file="importHarness.jsp"%>
三、点确认时先做下验证,文件格式、类型什么的
$('#importHarnessForm')为form表单id,(".hp_form_error")为确认按钮上方一个隐藏的DIV的class,显示提示信息用的。
四、点击确认按钮 传值 后台代码:
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类:
实现类:
DAO层:
SQL:
这是实现的全部代码,值得注意的是Controller类获取行数的时候,int rowNum = sheet.getLastRowNum(); 往往会出现如下情况:
获取到的行数要大于实际表格中(有数据)的行数,自己解决办法:
1.在循环中,自己再嵌入一层循环,判断获取到的行数是否为空,为空跳出循环执行下一次循环(continue)
2.偷懒的方法,创建的模板,手动把模板下面的行和列删除、清空内容一次,选多点行数,几千行随你选,这样导入的时候就不会出现那种情况啦(只是针对导入模板的用户 选此方法吧)