1. 程式人生 > >SpringMVC使用poi上傳Excel讀取Excel例項(包含防止重複提交)

SpringMVC使用poi上傳Excel讀取Excel例項(包含防止重複提交)

1、頁面

<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>
2、控制層
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 {  
        }  
	}
	
}