SpringMVC使用poi上傳Excel讀取Excel例項(包含防止重複提交)
阿新 • • 發佈:2019-01-01
1、頁面
2、控制層<span style="font-size:18px;"><%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <%@include file="/pages/include/base-head.jsp"%> <%-- <script type="text/javascript" src="${skin}/js/flow/batchrecharge.js"></script> --%> </head> <body> <form id="dataform" method="post" enctype="multipart/form-data" action="${contextPath}/flow/public/batchRecharge" onsubmit="return verification()"> <table style="align:center"> <tbody> <tr> <td> 批量充值Excel模板: <img src="${skin}/image/flow/exceltemplate.png"/> </td> </tr> <tr><td> </td></tr> <tr> <td> <input type="file" name="batrechexcel"/> <input type="hidden" name = "token" value="${token}"/> <input type="submit" value="確認批量充值" id="submit"/> </td> </tr> <tr><td> </td></tr> <tr id="shangjieguo" style="display:none"> <td>充值結果:<span id="totalresult" style="color:red"></span> </td> </tr> <tr id="xiajieguo" style="display:none"> <td>錯誤描述:<br/> <span id="errordes" style="color:red"></span> <span id="incompleteDataString" style="color:red"></span> </td> </tr> </tbody> </table> </form> <script> function verification(){ var batrechexcel = $("input[name='batrechexcel']").val(); if(batrechexcel == ""){ $("#shangjieguo").show(); $("#totalresult").text("請選擇要匯入的Excel檔案"); $("#xiajieguo").css("display","none"); return false; }else{ $("#shangjieguo").show(); $("#totalresult").text("充值進行中,請耐心等待..."); $("#xiajieguo").css("display","none"); var btnSubmit = document.getElementById("submit"); btnSubmit.disabled= "disabled"; return true; } } $(function(){ var straf = '${resultJson}'; var str = JSON.parse(straf); if(str.result == "allsuccess"){ $("#shangjieguo").show(); $("#totalresult").text("全部受理成功:"+"總共充值數:"+str.totalNumber+" ,充值成功數:"+str.successNumber+" ,充值失敗數:"+str.failNumber+" ,格式不對數:"+str.incompleteDataNumber); window.parent.refreshLimit(); }else if(str.result == "allfail"){ $("#shangjieguo").show(); $("#xiajieguo").show(); $("#totalresult").text("全部受理失敗:"+"總共充值數:"+str.totalNumber+" ,充值成功數:"+str.successNumber+" ,充值失敗數:"+str.failNumber+" ,格式不對數:"+str.incompleteDataNumber); $("#errordes").html(str.failreason); $("#incompleteDataString").html(str.incompleteDataString); }else if(str.result == "null"){ $("#shangjieguo").show(); $("#totalresult").text("資料為空或資料大於1萬"); }else if(str.result == "partfail"){ $("#shangjieguo").show(); $("#xiajieguo").show(); $("#totalresult").text("部分受理失敗:"+"總共充值數:"+str.totalNumber+" ,充值成功數:"+str.successNumber+" ,充值失敗數:"+str.failNumber+" ,格式不對數:"+str.incompleteDataNumber); $("#errordes").html(str.failreason); $("#incompleteDataString").html(str.incompleteDataString); window.parent.refreshLimit(); }else if(str.result == "committwo"){ $("#shangjieguo").show(); $("#totalresult").text("請不要重複提交"); }else if(str.result == "nomoney"){ $("#shangjieguo").show(); $("#totalresult").text(str.failreason); }else if(str.result == "geshibudui"){ $("#shangjieguo").show(); $("#totalresult").text("檔案格式不對"); } }); </script> </body> </html></span>
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; @Controller @RequestMapping(value="/flow") public class BatchRechargeMainAction extends ModelAction<BatchRechargeMain> { @Autowired BatchRechargeMainService batReChMainService; @Autowired UserService userService; /** * 跳到批量充值頁面 * @return * @author * @throws UnsupportedEncodingException */ @RequestMapping(value="/public/batchRecharge",method=RequestMethod.GET) public String tobatchRecharge(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException { String token = TokenProccessor.getInstance().makeToken();//建立令牌 getSession().setAttribute("token", token); //在伺服器使用session儲存token(令牌) return "flow/batchrecharge/batchrecharge"; }
/** * 批量充值 * @param request * @param response * @return * @author * @throws Exception */ @RequestMapping(value="/public/batchRecharge",method=RequestMethod.POST) public String batchRecharge(HttpServletRequest request, HttpServletResponse response) throws Exception{ boolean b = isRepeatSubmit(request);//判斷使用者是否是重複提交 if(b==true){//重複提交了 Map<String, Object> totalResult = new HashMap<String, Object>(); totalResult.put("result", "committwo"); attr("resultJson",JsonUtil.toJson(totalResult)); return "flow/batchrecharge/batchrecharge"; } getSession().removeAttribute("token"); MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; MultipartFile multipartFile = multipartRequest.getFile("batrechexcel"); String sourceName = multipartFile.getOriginalFilename(); // 原始檔名 String geshi = sourceName.substring(sourceName.indexOf(".")+1); if(!geshi.equals("xlsx")&&!geshi.equals("xls")){ Map<String, Object> totalResult = new HashMap<String, Object>(); totalResult.put("result", "geshibudui"); attr("resultJson",JsonUtil.toJson(totalResult)); String token = TokenProccessor.getInstance().makeToken();//建立令牌 getSession().setAttribute("token", token); //在伺服器使用session儲存token(令牌) attr("token",token); return "flow/batchrecharge/batchrecharge"; } String base = request.getSession().getServletContext().getRealPath("/") + "batchrecharge" + File.separator + "uploadedExcel"; File file = new File(base); if(!file.exists()){ file.mkdirs(); } String path=base + File.separator + sourceName; multipartFile.transferTo(new File(path)); Set<PhoneSize> phoneSizes = readBatchRechargeExcel(path); String account = getLoginUser().getAccount(); String resultJson = this.batReChMainService.doBatchRecharge(phoneSizes,account); attr("resultJson",resultJson); String token = TokenProccessor.getInstance().makeToken();//建立令牌 getSession().setAttribute("token", token); //在伺服器使用session儲存token(令牌) attr("token",token); return "flow/batchrecharge/batchrecharge"; } /** * 判斷客戶端提交上來的令牌和伺服器端生成的令牌是否一致 * @param request * @return * true 使用者重複提交了表單 * false 使用者沒有重複提交表單 */ private boolean isRepeatSubmit(HttpServletRequest request) { String client_token = request.getParameter("token"); //1、如果使用者提交的表單資料中沒有token,則使用者是重複提交了表單 if(client_token==null){ return true; } //取出儲存在Session中的token String server_token = (String) request.getSession().getAttribute("token"); //2、如果當前使用者的Session中不存在Token(令牌),則使用者是重複提交了表單 if(server_token==null){ return true; } //3、儲存在Session中的Token(令牌)與表單提交的Token(令牌)不同,則使用者是重複提交了表單 if(!client_token.equals(server_token)){ return true; } return false; } /** * 讀匯入Excel表 * @param fileName * @return 集合 * @author */ @SuppressWarnings("resource") private Set<PhoneSize> readBatchRechargeExcel(String fileName){ Set<PhoneSize> phoneSizes = new TreeSet<PhoneSize>(); try { FileInputStream in = new FileInputStream(fileName); Workbook wb; if (fileName.endsWith(".xls")) { wb = new HSSFWorkbook(in);// Excel2003 } else { wb = new XSSFWorkbook(in);// Excel 2007 } Sheet sheet = wb.getSheetAt(0); // 建立對工作表的引用 int row_num = sheet.getLastRowNum(); // 遍歷所有單元格,讀取單元格 if(row_num == 0){ return null; } if(row_num > 10000){ return null; } for (int i = 1; i <= row_num; i++) { Row row = sheet.getRow(i); String phone = ""; String size = ""; Cell cellphone = row.getCell(0); Cell cellsize = row.getCell(1); if(cellphone != null){ cellphone.setCellType(Cell.CELL_TYPE_STRING); phone = cellphone.getStringCellValue(); } if(cellsize != null){ cellsize.setCellType(Cell.CELL_TYPE_STRING); size = cellsize.getStringCellValue(); } PhoneSize phoneSize = new PhoneSize(); phoneSize.setNumber(String.valueOf(i+1)); if(PatternUtil.isMobileNO(phone)){ phoneSize.setPhone(phone); }else{ phoneSize.setPhone(null); } if(PatternUtil.isInteger(size)){ phoneSize.setSize(size); }else{ phoneSize.setSize(null); } phoneSizes.add(phoneSize); } return phoneSizes; } catch (Exception e) { e.printStackTrace(); return null; } finally { } } }