Excel 导入新篇

这篇使用的是Struts2上传方式,承接上篇

https://blog.csdn.net/tt336798/article/details/82150577

思路: 1.选着正确的模板数据
2. 检查是否有单元格为空 --> 记录–>移除
3.检查导入数据是否已存在–>记录 -->移除
4.保存 筛选后的数据

页面文件上传格式验证可供参考:

https://blog.csdn.net/tt336798/article/details/85235167

后台代码:

 //struts文件上传的属性
  private File file;
  private String fileName;
  private String contentType;

//doc是页面 input  file 的name="doc"
public void setDoc(File file){
		       this.file=file;
 }
public void setDocFileName(String fileName){
		        this.fileName=fileName;
}
public void setDocContentType(String contentType){
	          	this.contentType=contentType;
}

//导入
public String uploadExcel() throws Exception {
                
        //初始化 request
	    request=ServletActionContext.getRequest();
		HttpSession session=request.getSession();
		//文件上传
		String realPath=ServletActionContext.getServletContext().getRealPath("/upload_file/file");
		String newFileName=generateFileName(fileName);
		
		File destFile=new File(realPath+"//"+newFileName);
		FileUtils.copyFile(file, destFile);
		
		//对上传Excel文件进行解析
		InputStream in = new FileInputStream(file);
		List<List<Object>> listobj=new ImpExcelUtils().getBankListByExcel(in,fileName); 
		BankBillModel bbm=new BankBillModel();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd HH:mm:ss");
		 
	    String title3=String.valueOf(listobj.get(0).get(3))==null?null:String.valueOf(listobj.get(0).get(3));
	    if(title0.contains("交易时间")){ 
         //1.检测如果有数据不完整,就进行记录改错误在哪一行(从标题下面第一行数起),存入一个集合中,并记录总共有多少条不完整数据和重复数据
		     int num=0;
		     List<Integer> rowList=new ArrayList<Integer>(); 
		     for(int i=0;i<listobj.size();i++){
			   //不完整数据:根据标题,填写的内容少于标题数
		          if(listobj.get(i).size()<listobj.get(0).size()){
		               	num++;
		             	rowList.add(i);
		           }
		     }
		     boolean flag=false;
		     int excelCount=listobj.size()-1;
				
		      //1-1如果检测到所有数据不完整,则导入失败
		     if(num==excelCount){				
			     String msg="该表单共有"+excelCount+"条数据,有"+num+"数据不完整,请填充完整!";
			     session.setAttribute("allMsg", msg);
					
		         flag=true;
		         forward="error";
	         }else{
                 //1-2.移除不完整数据
		        if(!rowList.isEmpty()){
                 //1).再次将行数据组装成 第几行、第几行... 最后存入session中
			    int row=0;
			    StringBuffer rowNum=new StringBuffer();
			    for(int n=0;n<rowList.size();n++){
				row=rowList.get(n)+2;
				if(n==rowList.size()-1){
				     rowNum.append("第"+row+"行");
		        	}else{
			            rowNum.append("第"+row+"行、");
			        }
			    }
			   //2).声明一变量,记录原有中所有数据(listobj)的下标,根据rowList标记的值来移除数据
		       int count1=0;
			   Iterator it=listobj.iterator();
			   while(it.hasNext()){
			     it.next();
			     for(int j=0;j<rowList.size();j++){
				  if(count1==(rowList.get(j))){   
					it.remove();
				   }
			     }
				   count1++;
	   	       }
	           //不完整数据总数、第几行...,存入session
	           session.setAttribute("countRow", num); 
		       session.setAttribute("rowIndex", rowNum);
            }
		    flag=false;
          }
	      if(flag==false){
	        //2.在Excel数据进行保存之前,查询导入数据是否已存在
		    int length=listobj.size();
					
			double incomeMoney=0.0;
			String tradeTime=null;
		    String userAccount=null;
					
		    //记录重复数据,集合记录行数
		    int repeatCount=0;
		    List<Integer> repeatList=new ArrayList<Integer>();
            for(int h=1;h<length;h++){
			    List<Object> list=listobj.get(h);
				//查询的条件		
				tradeTime=String.valueOf(list.get(0))==null?null:String.valueOf(list.get(0));
				String newTime=strToDateFormat(tradeTime);
						
			    incomeMoney=String.valueOf(list.get(1))==null?null:Double.parseDouble(String.valueOf(list.get(1)));
			    userAccount=String.valueOf(list.get(5))==null?null:String.valueOf(list.get(5));
						
			    //查询
			    BankBillModel bank=bankBillDao.queryRepeatDB(incomeMoney,userAccount,newTime); 
			    if(bank!=null){		    	
				    repeatCount++;
			        repeatList.add(h);
			    }
		     }
		     if(repeatCount==listobj.size()-1){			
			     //2-1.如果检测到所有数据已存在,则导入失败
			     String reaptMsg="需导入数据都已存在!";
			     session.setAttribute("repeatAllMsg", reaptMsg);
						
			     forward="error";				
		     }else{
                 //2-2.如果有数据重复,把重复的数据移除【去重复】
			     if(!repeatList.isEmpty()){
                   //1).前面把不完整数据已移除,后面listobj的重复行数就需要重新计算出现的行数
				   List<Integer> disRepeatList=new ArrayList<Integer>();
				   for (Integer  rep: repeatList) {
				    	disRepeatList.add(rep + disCount(rowList, rep));
			       }
				   //2).把记录重复的数据,组装第几行、第几行.......
			       int repeat=0;
			       StringBuffer repeatNum=new StringBuffer();
			       for(int t=0;t<disRepeatList.size();t++){
				      repeat=disRepeatList.get(t)+2;
				      if(t==disRepeatList.size()-1){
					      repeatNum.append("第"+repeat+"行");
				      }else{
					     repeatNum.append("第"+repeat+"行、");
				      }
			        }
                    //3).声明一变量,记录原有中所有数据(listobj)的下标,根据rowList标记的值来移除数据
			 	    int count2=0;
				    Iterator it=listobj.iterator();
			        while(it.hasNext()){
				       it.next();
				       for(int j=0;j<repeatList.size();j++){
					     if(count2==(repeatList.get(j))){   
					      it.remove();
					     }
				        }
				        count2++;
			         }
			      //重复数据总数、第几行....,存入session
				  session.setAttribute("repeatRow", repeatCount);
				  session.setAttribute("repeatIndex", repeatNum);
              }
             //3.把 --缺失数据,重复数据 --去掉后,剩下数据就是需要保存的数据
			 for(int k=1;k<listobj.size();k++){
				List<Object> list=listobj.get(k);
                               
                       //在这里将数据执行保存
                      String str=String.valueOf(list.get(0))==null?null:String.valueOf(list.get(0));
                               
                                 //......................
                                
                             }

                           forward="input";
                         } 
                     }
                }else{
                     String errorInfo="选择导入的模板错误,请先确认再导入!";
                     session.setAttribute("errorTemp", errorInfo);
        	       
        	         forward="error";
                }
          
                return forward;
           }	     

        //string时间格式化
 private String strToDateFormat(String date) throws ParseException {
	       SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
	       formatter.setLenient(false);
	       Date newDate= formatter.parse(date);
	       formatter = new SimpleDateFormat("yyyy-MM-dd");
	       
	    
	       return formatter.format(newDate);
 }
  
//计算次数
private int disCount(List<Integer> list, Integer current) {
	int count = 0;
	for (Integer li : list) {
		if (current >=li) {
			count++;
		}
	}
	return count;
}

js页面:file_upload.jsp

首先在页面中会隐藏获取的session

      <input style="display:none;" id="errorNum" value="<%=errorNum%>"/>
      <input style="display:none;" id="rowIndex" value="<%=rowIndex%>"/>
      <input style="display:none;" id="allMsg" value="<%=allMsg%>"/>
      
      <input style="display:none;" id="repeatRow" value="<%=repeatRow%>"/>
      <input style="display:none;" id=reptIndex value="<%=repeatIndex%>"/>
      <input style="display:none;" id="repeatMsg" value="<%=repeatAllMsg%>"/>
      
      <input style="display:none;" id="errorTempId" value="<%=errorTemp%>"/>

js代码:

$(function (){
	var errorTempId=$("#errorTempId").val()
	
	//缺失错误信息
    var errorNum=$("#errorNum").val();
    var rowIndex=$("#rowIndex").val();
    var allMsg=$("#allMsg").val();       //-- 导入失败    
    //重复错误信息
    var repeatRow=$("#repeatRow").val();
    var reptIndex=$("#reptIndex").val();
    var repeatAllMsg=$("#repeatMsg").val(); // -- 导入失败

    if(errorNum!=""&&repeatAllMsg==""&&repeatRow!=""){
    	var msg=">其中有"+errorNum+"条数据【不完整】,请完善再将其重新导入,位于表格中:\n"+rowIndex;
    	var newmsg=">有"+repeatRow+"条数据【已存在】,位于表格中:\n"+reptIndex;
    	
    	alert("有以下数据导入失败:\n"+msg+"\n"+newmsg);
    }else if(errorNum!=""&&repeatAllMsg!=""||errorNum==""&&repeatAllMsg!=""){ //1.有不完整,且都重复    或者 2.所有数据都完整,且都重复
    	
    	 alert("数据导入失败:"+repeatAllMsg);
    }else if(errorNum==""&&repeatRow!=""){ //所有数据都完整,有几条重复
    	 var msg=">其中"+repeatRow+"条数据【已存在】,位于表格中:\n"+reptIndex;
    
    	 alert("有以下数据导入失败:\n"+msg);
    }else if(errorNum!=""&&repeatRow==""&&repeatAllMsg==""){ //有不完整,没有重复的
    	var msg=">其中有"+errorNum+"条数据【不完整】,请完善在将其重新导入,位于表格中:\n"+rowIndex;
    
    	alert("有以下数据导入失败:\n"+msg);
    }
    
    if(allMsg!=""){
    	alert("数据导入失败:\n"+allMsg);
    }
   
    //选择模板错误
    if(errorTempId!=""){
    	alert(errorTempId);
    }
  
 });

弹窗效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值