java上传Excel实现数据的导入

来源:互联网 发布:灌篮高手 知乎 编辑:程序博客网 时间:2024/05/21 10:17

本diors开发此功能是源于公司对于客户信息的导入功能,让运营人员可以将excel中的数据通过excel上传,导入到数据库系统中。经过总结,主要思路分为如下四个步骤:

1,(html部分自行脑补)在控制器里面创建List<HashMap<String,String>>准备接收所上传的Excel中的数据。

2,创建导出需要的工具类进行对数据处理,getDataForActivityAward(InputStream inputstream, int number) ,其中number用于指定每行读取到的截止位置。

3,将inputstream存入 Workbook对象,并通过三层for循环遍历sheet、row、cell。将每个cell存入map,最终用于返回Controller。

4,将接受到的list集合遍历,并将每个map中的素有元素一次获取到复制给model的对应属性,并将model数据存入到对应的数据库中。


代码部分如下:

jQuery校验:

/*检验上传文件是否为空、是否为excel文件、然后异步提交form*/if($("#userExcel").val() == ''){alert("请先选择需要导入的Excel文件");return;}var v = $("#userExcel").val();if(v.lastIndexOf(".xlsx") < 0 || v.lastIndexOf(".xls") < 0){alert("请导入Excel文件");return;}  $("#myformId").ajaxSubmit({      type:"post",      url:"${base}/admin/addActivityAwardNew",      success:function(data){      alert(data);      window.location.href="${base}/admin/activityAwardNew";      }  }); 
Controller内对数据的接收与处理:

try {List<HashMap<String,String>> list = ExportUtil.getDataForActivityAward(userExcel.getInputStream(),5);if(list != null && list.size() > 0){ActivityAwardRecord aar = new ActivityAwardRecord();for(Map<String,String> map : list){if(StringUtils.isNotBlank(map.get("0")) &&StringUtils.isNotBlank(map.get("1")) &&StringUtils.isNotBlank(map.get("2")) &&StringUtils.isNotBlank(map.get("3")) &&StringUtils.isNotBlank(map.get("4")) &&StringUtils.isNotBlank(map.get("5")) ){aar.setAwardId(awardId);aar.setMobile(map.get("1"));aar.setUserName(map.get("2"));aar.setAwardType(map.get("3"));aar.setAwardContent(map.get("4"));aar.setAwardMoney(new BigDecimal(map.get("5")));activityAwardRecordXService.addActivityAwardRecord(aar);}}return "添加活动奖励成功";}else{return "Excel表数据有误或为空";}} catch (IOException e) {e.printStackTrace();return e.getMessage();}
util工具类对excel数据的遍历和获取:

public static List<HashMap<String,String>> getDataForActivityAward(InputStream inputstream,int number) {List<HashMap<String, String>> list = new ArrayList<HashMap<String,String>>();HashMap<String,String> map = new HashMap<String,String>();if(inputstream == null ){return list;}try {Workbook wb = WorkbookFactory.create(inputstream);int sheetNum = wb.getNumberOfSheets();Sheet sheet = null;for(int sheetIndex = 0;sheetIndex<sheetNum;sheetIndex++){//遍历sheet(index 0开始)sheet = wb.getSheetAt(sheetIndex);Row row = null;int firstRowNum = sheet.getFirstRowNum()+1;int lastRowNum = sheet.getLastRowNum();for (int rowIndex = firstRowNum;rowIndex<=lastRowNum;rowIndex++ ) {//遍历row(行 0开始)row = sheet.getRow(rowIndex);if(null != row){int firstCellNum = row.getFirstCellNum();int lastCellNum = row.getLastCellNum();for (int cellIndex = firstCellNum; cellIndex < lastCellNum; cellIndex++) {//遍历cell(列 0开始)Cell cell = row.getCell(cellIndex, Row.RETURN_BLANK_AS_NULL);Object cellValue = null;if (null != cell) {switch (cell.getCellType()) {case Cell.CELL_TYPE_STRING:cellValue = cell.getRichStringCellValue().getString();break;case Cell.CELL_TYPE_NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { cellValue= cell.getDateCellValue(); } else { //此处对数字格式的数据转换为字符串,否则会出现科学计数法的显示。也可以使用“模板中设置单元格格式的方法避免” DecimalFormat df = new DecimalFormat("#"); cellValue=df.format(cell.getNumericCellValue()).toString(); } break;case Cell.CELL_TYPE_BOOLEAN:cellValue = cell.getBooleanCellValue();break;case Cell.CELL_TYPE_FORMULA:cellValue = cell.getCellFormula();break;default:System.out.println("not find match type.");}System.out.println("value:"+cellValue);map.put(cellIndex+"", cellValue +"");if(cellIndex == number){list.add(map);map = new HashMap<String,String>();}} else {//TODO cell is null 用 *** 代替输出}}//end cell}else{//TODO row is null}}//end row}//end sheetSystem.out.println(list.toString());System.out.println(list.size());} catch (Exception e) {e.printStackTrace();}return list;}

以上仅为本diors对这个小需求的开发总结,如有不做欢迎指正,在csdn第一遍博客,希望以后可以在这里和大家多交流,期待成长!




1 0