1、JSP页面
<div id="hideDiag"> <form id="dataForm" enctype="multipart/form-data" > <table class="tableForm" cellspacing="8"> <tr> <td class="td100" align="right">请选择excel文件:</td> <td class="td200"> <input type="file" name="excelFile" id="excelFile"/> </td> </tr> </table> </form> </div> <div id="progress" style="display: none" > <div id="title"> <span id="text">导入进度</span> <div id="close">X</div> </div> <div id="progressBar"> <div id="uploaded"></div> </div> <div id="info"></div> </div>
2、JS
function save(){ if(!$("#dataForm").form('validate')){ return ; } var form = $("#dataForm"); var options = { url:'/mallGiftAction/save.shtml', type:'post', beforeSend: ajaxLoading, success:function(data) { ajaxLoadEnd(); if(data.success){ $('#tb_mallGift').datagrid('reload'); $('#tb_mallGift').datagrid('clearSelections'); }else{ $.messager.info(data.msg); $("#progress").css("display", "none"); } } }; form.ajaxSubmit(options); } function ajaxLoading(){ $('#hideDiag').dialog('close'); $("#progress").css("display", "block"); var myDate = new Date(); startTime = myDate.getTime(); $(this).attr("disabled", true); window.setTimeout("getProgressBar()", 1000); $("<div class=\"datagrid-mask\"></div>").css({display:"block",width:"100%",height:$(window).height()}).appendTo("body"); } function ajaxLoadEnd(){ $(".datagrid-mask").remove(); }
3、Action
@RequestMapping(value = "/save") @ResponseBody public ResultVO save(String excelFilePath, MultipartFile excelFile, HttpServletRequest request, HttpServletResponse response) { try { mallGiftService.doStockin(excelFile,request); return success("导入成功"); } catch (Exception e) { return error(e.getMessage()); } }
4、Service
public void doStockin(MultipartFile excelFile, HttpServletRequest request) throws Exception { // excel读取的字段 Map<String, String> beanNameMap = new HashMap<String, String>(); beanNameMap.put("卡号", "cardNo"); beanNameMap.put("密码", "verifyCode"); // 读取excel数据 List<Map<String, Object>> list = ExcelUtil.parseExcel(excelFile, beanNameMap); List<MallGift> mallGiftList = ExcelUtil.toObjectList(list, MallGift.class); int totalCount = mallGiftList.size(); int count = 1; // excel数据入库 for (MallGift mallGift : mallGiftList) { mallGift.setStatus(MallGift.STATUS_NEW); // 加载监听器 ProgressModel status = new ProgressModel(); status.setTotalCount(totalCount); status.setOverCount(count++); request.getSession().setAttribute("status", status); mallGiftDao.buffSave(mallGift); } }
5、ExcelUtil
public static List<Map<String, Object>> parseExcel(MultipartFile excelFile, Map<String, String> beanNameMap) throws IOException { List<Map<String, Object>> result = new LinkedList<Map<String, Object>>(); InputStream is = excelFile.getInputStream(); XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is); XSSFRow beanNameRow = xssfWorkbook.getSheetAt(0).getRow(0); int excleRowLength = xssfWorkbook.getSheetAt(0).getRow(0).getPhysicalNumberOfCells(); String[] columnName = new String[excleRowLength]; for (int i = 0; i < columnName.length; i++) { XSSFCell name = beanNameRow.getCell(i); Iterator<String> it = beanNameMap.keySet().iterator(); while (it.hasNext()) { String key = (String) it.next(); String value = beanNameMap.get(key); if (key.trim().equals(name.getStringCellValue())) { columnName[i] = value; } } } for (int sheetIndex = 0; sheetIndex < xssfWorkbook.getNumberOfSheets(); sheetIndex++) { XSSFSheet sheet = (XSSFSheet) xssfWorkbook.getSheetAt(sheetIndex); for (int rowIndex = 1; rowIndex < sheet.getPhysicalNumberOfRows(); rowIndex++) { XSSFRow row = sheet.getRow(rowIndex); Map<String, Object> map = new HashMap<String, Object>(); for (int cellIndex = 0; cellIndex < xssfWorkbook.getSheetAt(0).getRow(0).getPhysicalNumberOfCells(); cellIndex++) { XSSFCell cell = row.getCell(cellIndex); String value = getCellValue(cell); if (StringUtils.isEmpty(value)) { throw new BaseException("Excel表格中的第:" + (rowIndex + 1) + "行第" + (cellIndex + 1) + "列为空."); } if (columnName[cellIndex] != null && columnName[cellIndex].trim().length() > 0) { map.put(columnName[cellIndex].trim(), getCellValue(cell)); } } result.add(map); } } return result; } /** * 利用反射将 List<Map<String,Object>>数据 生成相应的List<T>数据 * */ public static <T> List<T> toObjectList(List<Map<String, Object>> list, Class<T> clazz) throws Exception { List<T> returnList = new LinkedList<T>(); for (int i = 0; i < list.size(); i++) { Set<Map.Entry<String, Object>> set = list.get(i).entrySet(); Iterator<Entry<String, Object>> it = set.iterator(); T obj = clazz.newInstance(); Method[] methods = clazz.getDeclaredMethods(); while (it.hasNext()) { Map.Entry<String, Object> entry = (Map.Entry<String, Object>) it.next(); for (Method m : methods) { if (m.getName().startsWith("set")) { String methodName = entry.getKey().toString(); StringBuffer sb = new StringBuffer(methodName); sb.replace(0, 1, (methodName.charAt(0) + "").toUpperCase()); methodName = "set" + sb.toString(); if (methodName.equals(m.getName())) { m.invoke(obj, entry.getValue()); break; } } } } returnList.add(obj); } return returnList; } /** * 获取当前单元格内容 */ private static String getCellValue(Cell cell) { String value = ""; if (cell != null) { switch (cell.getCellType()) { case Cell.CELL_TYPE_NUMERIC: if (HSSFDateUtil.isCellDateFormatted(cell)) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue()); value = sdf.format(date); } else { DecimalFormat format = new DecimalFormat("###################.###########"); value = format.format(cell.getNumericCellValue()); } break; case Cell.CELL_TYPE_STRING: value = cell.getStringCellValue(); break; case Cell.CELL_TYPE_BOOLEAN: Boolean data = cell.getBooleanCellValue(); value = data.toString(); break; case Cell.CELL_TYPE_ERROR: System.out.println("单元格内容出现错误"); break; case Cell.CELL_TYPE_FORMULA: DecimalFormat format = new DecimalFormat("###################.###########"); value = format.format(cell.getNumericCellValue()); if (value.equals("NaN")) { value = cell.getStringCellValue().toString(); } break; case Cell.CELL_TYPE_BLANK: System.out.println("单元格内容 为空值 "); break; default: value = cell.getStringCellValue().toString(); break; } } return value; } public static void createExcel(List<Map<String, Object>> list, LinkedHashMap<String, String> headMap, String fileName) { HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet(); sheet.setDefaultRowHeightInPoints(10); sheet.setDefaultColumnWidth(10); int rowNum = 0; // 设置标题行 HSSFCellStyle titleStyle = workbook.createCellStyle(); titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直 titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平 HSSFFont font = workbook.createFont(); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗 titleStyle.setFont(font); HSSFRow titleRow = sheet.createRow((short) 0); int m = 0; for (String title : headMap.values()) { HSSFCell cell = titleRow.createCell(m); cell.setCellValue(title); cell.setCellStyle(titleStyle); m++; } rowNum++; HSSFCellStyle style = workbook.createCellStyle(); style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直 style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平 // 设置内容行 for (Map<String, Object> map : list) { HSSFRow row = sheet.createRow((short) rowNum); int i = 0; for (String value : headMap.keySet()) { HSSFCell cell = row.createCell(i); cell.setCellValue(String.valueOf(map.get(value))); cell.setCellStyle(style); i++; } rowNum++; } OutputStream out = null; try { out = new FileOutputStream(fileName); workbook.write(out); } catch (IOException e) { e.printStackTrace(); } finally { if (out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } }
6、ProgressModel
private long pBytesRead = 0L; private long pContentLength = 0L; private int totalCount; private int overCount; public ProgressModel() { pBytesRead = 0L; pContentLength = 0L; } public long getPBytesRead() { return pBytesRead; } public void setPBytesRead(long bytesRead) { pBytesRead = bytesRead; } public long getPContentLength() { return pContentLength; } public void setPContentLength(long contentLength) { pContentLength = contentLength; } public int getTotalCount() { return totalCount; } public void setTotalCount(int totalCount) { this.totalCount = totalCount; } public int getOverCount() { return overCount; } public void setOverCount(int overCount) { this.overCount = overCount; }
7、MallGiftDao
public void buffSave(MallGift mallGift) { try { super.buffSave(mallGift);//存入数据库方法 } catch (RuntimeException e) { Throwable cause = e.getCause(); if (cause instanceof MySQLIntegrityConstraintViolationException) { throw new RuntimeException("卡号:" + mallGift.getCardNo() + "在数据库已经存在,不能重复导入"); } } //myCache.set(mallGift); //if (StringUtils.isNotEmpty(mallGift.getCardNo())) // myCache.hSet(mallGift, "cardNo", mallGift.getCardNo()); }