批量导入(后台的springMVC+Spring+Hibernate+前台jQuery+bootstrap+bootstrap-dialog)

1 篇文章 0 订阅
1 篇文章 0 订阅

在没有采用异步进行表单提交时,批量导入时,要将form标签的enctype的值设置为multipart/form-data,才可以上传,(就是将文件以流的形式上传)。

后台获取数据必须要使用文件工厂(DiskFileItemFactory,ServletFileUpload)。因为通过request.getParameter拿到的值是null,

在项目中,整个项目都采用的是异步方式,因此要引入一个jquery.form.min.js的文件,去做<form></form>表单的提交,后台采用的是SpringMVC的文件上传,以下是代码实现:

前台页面是一个bootstrap的一个模态框:

是主页面里面的代码

<div id="modal-input" class="modal fade" tabindex="-1" data-backdrop="static">
	<form id="inputForm">
	<div class="modal-dialog" style="min-width: 350px;">
		<div  id="printDepartInputBatchForm" class="modal-content">
		<这里放入的是下面的代码>
		</div>
		<div class="modal-footer no-margin-top">
			<div class="text-center">
				<button οnclick=" return inputBatchConfirm()" class="btn btn-lg btn-primary">
					导入
				</button>
				<button class="btn btn-lg btn-primary" data-dismiss="modal">
					取消
				</button>
			</div>
		</div>
	</div><!-- /.modal-dialog -->
	</form>	
</div>
从页面

<div class="modal-header no-padding">
		<div class="table-header">
			<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
				<span class="white">×</span>
			</button>
			批量导入
		</div>
			<div class="col-xs-13">
				<div class="widget-box">
					<div class="widget-body">
						<div class="widget-main" id="printSelect">
							<div class="row">
								<div class="row">
									<label class="col-xs-4 text-right" style="line-height:30px;" >下载模板  :</label>
									<div class="col-sm-6" style="margin-bottom:8px;">
										<a class="btn btn-sm btn-primary" href="${contextPath}/static/upload/print.xlsx" target="_self">Excel模板</a>
									</div>
								</div>
								<div class="row">
									<div class="row" style="">
										<label class="col-xs-4 text-right" style="line-height:30px;margin-left:5px;" >请选择上传文件  :</label>
										<div class="col-sm-6">
										    <input type="file" id="excelInput" name="excelInput"/>
										</div>
									</div>
								</div>
							</div>
						</div>
					</div>
				</div>
			</div>
	</div>

这里大家看到会有些蒙,说为什么不把两部分放到一起呢,我来说明,下面的这部分我走了一个后台,然后跳转到的一个页面,然后把这个页面通过js的函数放入的id属性值为printDepartInputBatchForm的那个div里面

下面是js函数

采用$("#inputForm").ajaxSubmit({})来实现,其中#后面的值是form表单的id属性值

//批量导入
		//跳转页面
		function inputBatch(){
			loadingShow();
			$.post("${contextPath}/后台地址",//跳转模态框
			        function(data){
					//alert(data);
			            $("#printDepartInputBatchForm").html(data);
			            loadingHide();
			            $("#modal-input").modal("toggle");
	        });
		}
		//导入
		function inputBatchConfirm(){
			$.messager.model = { 
					ok: {
						text : "确定",
						classed : "btn-default"
					},
					cancel: {
						text : "取消",
						classed : "btn-error"
					}
				}
			$.messager.confirm("提示信息", "确认导入?", function() {
				var excelInput=$('#excelInput').val();
				var templateFileName="print.xlsx";
				if (excelInput== '') {
					$.messager.alert("提示信息","导入文件不能为空!");
					return;
				}
				var suffix=excelInput.substr(excelInput.lastIndexOf(".") + 1);
		        if("xlsx"!= suffix) {    
		        	$.messager.alert("提示信息","导入文件类型必须为excel!");
					return;
		        }
		        if(excelInput!=templateFileName){
		        	$.messager.alert("提示信息","请下载模板文件,进行数据录入!");
					return;
		        }
				loadingShow();
				$('#inputForm').ajaxSubmit({
					type: "post",
					dataType : "json",
					enctype :"multipart/form-data",
					url : "${contextPath}/sys/printdepart/inputBatchPrintDepart",//跳转后台
      				success : function(data) {
      					//返回1时表示导入成功
      					if(data.result=='1'){
      						$.messager.alert("提示信息","导入成功!");
      						loadingHide();
      						$("#modal-input").modal('hide');	      						
      						$("#grid-table").trigger("reloadGrid");
      					}else if(data.result=="2"){
      						$.messager.alert("提示信息","Excel工作表中无数据!");
      						loadingHide();
      					}else if(data.result=="3"){
      						$.messager.alert("提示信息","机构代码已存在,请检查第"+data.index+"行机构代码");
      						loadingHide();
      					}else if(data.result=="4"){
      						$.messager.alert("提示信息","机构代码不能为空,请检查第"+data.index+"行机构代码");
      						loadingHide();
      					}else if(data.result=="5"){
      						$.messager.alert("提示信息","机构名称不能为空,请检查第"+data.index+"行机构名称");
      						loadingHide();
      					}else if(data.result=="11"){
      						$.messager.alert("提示信息","机构代码格式不正确,请检查第"+data.index+"行机构代码,至少输入8位数字字符");
      						loadingHide();
      					}else if(data.result=="6"){
      						$.messager.alert("提示信息","所在城市不能为空,请检查第"+data.index+"行所在城市");
      						loadingHide();
      					}else if(data.result=="12"){
      						$.messager.alert("提示信息","所在城市格式不正确,请检查第"+data.index+"行所在城市,输入6位数字字符");
      						loadingHide();
      					}else if(data.result=="10"){
      						$.messager.alert("提示信息","所在城市代码不存在,请检查第"+data.index+"行所在城市代码,填写正确的城市代码请到模版文件city工作表中查找");
      						loadingHide();
      					}else if(data.result=="7"){
      						$.messager.alert("提示信息","详细地址不能为空,请检查第"+data.index+"行详细地址");
      						loadingHide();
      					}else if(data.result=="8"){
      						$.messager.alert("提示信息","联系人员不能为空,请检查第"+data.index+"行联系人员");
      						loadingHide();
      					}else if(data.result=="9"){
      						$.messager.alert("提示信息","联系电话不能为空,请检查第"+data.index+"行联系电话");
      						loadingHide();
      					}else if(data.result=="13"){
      						$.messager.alert("提示信息","联系电话格式不正确,请检查第"+data.index+"行联系电话,输入正确的联系电话");
      						loadingHide();
      					}else{
      						$.messager.alert("提示信息","导入失败!");
      						loadingHide();
      					}
					}
				});
		 	});
			return false;
		}
js函数里面的代码注释写的还算详细,详细大家都能看的明白。

后台代码:

导入时要引入poi的jar包和文件上传的jar包,SpringMVC的文件上传,(MultipartFile) ,其中的excelInput是前台文件域的name属性的值

//批量导入跳转页面
	@RequestMapping(value="/preInputBatch" ,method={RequestMethod.GET ,RequestMethod.POST})
	public ModelAndView preInputBatch(HttpServletRequest request , HttpServletResponse response) throws Exception{
		logger.info("批量导入页面跳转");
		PrintDepart printDepart=new PrintDepart();
		return new ModelAndView("back/printdepart/inputbatchprintdepart" ,"printDepart" ,printDepart);
	}

//批量导入
    @RequestMapping(value="/inputBatchPrintDepart" ,method={RequestMethod.GET ,RequestMethod.POST})
    @ResponseBody
    public Map<String, Object> inputBatchPrintDepart(MultipartFile excelInput,HttpServletRequest request , HttpServletResponse response) throws Exception{
        logger.info("批量导入");
        Map<String, Object> map=new HashMap<String, Object>();
        List<PrintDepart> printList=new ArrayList<PrintDepart>();
        InputStream is=null;
        try {
            is=excelInput.getInputStream();//输入流指向选择的文件
            XSSFWorkbook workBook=new XSSFWorkbook(is);
            XSSFSheet sheet=workBook.getSheetAt(0);
            if(sheet.getLastRowNum()==0){
                map.put("result", "2");//表中无数据
                return map;
            }
            Integer row=0;
            Integer index=0;
            for(int i = 0; i < sheet.getPhysicalNumberOfRows() - 2; i++){//    取到工作表所有行数-2是代表没有数据的行数
                PrintDepart print=new PrintDepart();
                row=i+3;
                index=i+2;
                //检查输入的数据是否合法
                if(sheet.getRow(index).getCell(0)==null
                        ||"".equals(sheet.getRow(index).getCell(0))||
                        sheet.getRow(index).getCell(0).getCellType()==XSSFCell.CELL_TYPE_BLANK){//判断单元格是否为空
                    map.put("result", "4");//机构代码为空
                    map.put("index", row);
                    return map;
                }
                if(null!=printDepartService.getByProerties("departCode",sheet.getRow(index).getCell(0).getStringCellValue())){
                    map.put("result", "3");//存在机构代码
                    map.put("index", row);
                    return map;
                }
                Boolean flag=Pattern.matches("^\\d{8,}$", sheet.getRow(index).getCell(0).getStringCellValue());
                if(flag==false){
                    map.put("result", "11");//机构代码不合法
                    map.put("index", row);
                    return map;
                }
                if(sheet.getRow(index).getCell(1)==null
                        ||"".equals(sheet.getRow(index).getCell(1))||
                        sheet.getRow(index).getCell(1).getCellType()==XSSFCell.CELL_TYPE_BLANK){
                    map.put("result", "5");//机构名称为空
                    map.put("index", row);
                    return map;
                }
                if(sheet.getRow(index).getCell(2)==null
                        ||"".equals(sheet.getRow(index).getCell(2))||
                        sheet.getRow(index).getCell(2).getCellType()==XSSFCell.CELL_TYPE_BLANK){
                    map.put("result", "6");//所在城市为空
                    map.put("index", row);
                    return map;
                }
                Boolean fa=Pattern.matches("^\\d{6}$", sheet.getRow(index).getCell(2).getStringCellValue());
                if(fa==false){
                    map.put("result", "12");//所在城市不合法
                    map.put("index", row);
                    return map;
                }
                if(null==areaService.getByProerties(new String[]{"areaCode","areaGrade"},
                        new Object[]{sheet.getRow(index).getCell(2).getStringCellValue(),"2"})){
                    map.put("result", "10");//所在城市代码要填写area表中存在的
                    map.put("index", row);
                    return map;
                }
                if(sheet.getRow(index).getCell(3)==null
                        ||"".equals(sheet.getRow(index).getCell(3))||
                        sheet.getRow(index).getCell(3).getCellType()==XSSFCell.CELL_TYPE_BLANK){
                    map.put("result", "7");//详细地址为空
                    map.put("index", row);
                    return map;
                }
                if(sheet.getRow(index).getCell(4)==null
                        ||"".equals(sheet.getRow(index).getCell(4))||
                        sheet.getRow(index).getCell(4).getCellType()==XSSFCell.CELL_TYPE_BLANK){
                    map.put("result", "8");//联系人为空
                    map.put("index", row);
                    return map;
                }
                if(sheet.getRow(index).getCell(5)==null
                        ||"".equals(sheet.getRow(index).getCell(5))||
                        sheet.getRow(index).getCell(5).getCellType()==XSSFCell.CELL_TYPE_BLANK){
                    map.put("result", "9");//联系电话为空
                    map.put("index", row);
                    return map;
                }
                Boolean fl=Pattern.matches("1\\d{10}", sheet.getRow(index).getCell(5).getStringCellValue());
                if(fl==false){
                    map.put("result", "13");//联系电话不合法
                    map.put("index", row);
                    return map;
                }
                print.setDepartCode(sheet.getRow(index).getCell(0).getStringCellValue());
                print.setDepartName(sheet.getRow(index).getCell(1).getStringCellValue());
                print.setCity(sheet.getRow(index).getCell(2).getStringCellValue());
                print.setAddress(sheet.getRow(index).getCell(3).getStringCellValue());
                print.setLinkMan(sheet.getRow(index).getCell(4).getStringCellValue());
                print.setLinkTel(sheet.getRow(index).getCell(5).getStringCellValue());
                print.setCreateTime(new Date());
                print.setStatus("1");
                printList.add(print);
            }
            for(PrintDepart entityPrint : printList){//将对象循环添加到数据库
                printDepartService.persist(entityPrint);
            }
            map.put("result", "1");
        } catch (Exception e) {
            e.printStackTrace();
            map.put("result", "0");
        }
        is.close();
        return map;
    }

自认为写的比较详细了,希望可以帮助到大家

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
**smart-web2** 是一套的OA系统;包含了流程设计器,表单设计器,权限管理,简单报表管理等功能; 系统后端基于SpringMVC+Spring+Hibernate框架,前端页面采用JQuery+Bootstrap等主流技术; 流程引擎基于Snaker工作流;表单设计器基于雷劈网WEB表单设计器。 系统主要功能有: >1.系统管理 >>系统管理包含有:基础信息管理、系统权限管理、版本管理、子系统管理。 > >2.流程管理 >>流程管理包含有:流程设计器、流程实例管理、流程页面模版管理等功能。 > >3.表单管理 >>表单管理包含有:表单设计器、表管理、表单帮助信息管理等。 > >4.我的办公 >>我的待办、我的已办; > >5.简单报表管理 >>简单报表管理包含:简单报表的设计、报表管理等。 使用说明 ======= ------- ---数据库MySQL5.6以上 <br/> ---下载后把data目录下的smart-web2.zip解压;然后解压出来的脚本文件(“smart-web2.sql”)导入到mysql数据库中;注:建库时,字符集编码为:utf8(utf8_general_ci)<br/> ---修改配置文件“jdbc.properties”,改成对应数据库的用户名和密码 <br/> ---“sysconfig.properties”系统配置文件;需要修改“root.dir”属性,设置为系统上传文件时用来存放的根目录 <br/> ----系统管理员用户名为:admin;密码为:123456 <br/> ----linux类系统需要修改mysql的配置文件,改为数据库表名不区分大小写(lower_case_table_names=1) <br /> 环境要求 ------------ 1.jdk要求1.7及以上;<br /> 2.tomcat6或tomcat7; <br /> 3.eclipse版本4.4以上;<br /> 4.浏览器要求:IE8及以上(最理想的是IE10及以上),火狐,chrome等。<br />
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值