本文主要讲的是怎么使用批量导入数据,前台传入excel文件,后台解析,数据插入数据库

如果需要java后台导出excl文件,请点击  使用java在后台将数据导出为excel文件

例如:我从前台传入一个为excl格式的文件(数据在文件里面,文件名称,位置,内容,都可更改)。在后台得到此文件,解析此文件中的内容(这里演示的内容映射为一个对象,具体问题具体分析),把内容解析插入到数据库中。

第一步:前台传入excl文件。(这个步骤没啥要写的)

1.前台像后台发送excl文件。你可以使用你自己的方法,这里为演示。你想用哪个就用哪个。

前台传递的方法(有可能跟后面数据对不上,但思想对就行了)

页面上的按钮

<button id="btnImport" class="btn btn-info">
	<i class="glyphicon glyphicon-edit"></i> 导入
</button>
<div id="importBox" class="hide">
	<form enctype="multipart/form-data" style="padding-left: 20px; text-align: center;" runat="server">
	 <br>
	<input id="uploadFile" name="file" type="file" style="width: 100%" runat="server">导入文件不能超过5M,仅允许“xls”或“xlsx”格式文件!<br>
	</form>
</div>

js方法(这里我们使用的是jp.open,它是封装了layer的js,这里不是主要讲解问题。jp.open这个就是打开一个弹出框,内容content显示为你定义的那个上传div内容,其中下载模板,是从网站上下载导入模板,确定是将选择的文件传入后台)

这里使用的是new FormData()对象,传递文件

// 导入
	$("#btnImport").click(function() {
		jp.open({
			type: 1,
			area: [500, 300],
			title: "导入数据",
			content: $("#importBox").html(),
			btn: ['下载模板', '确定', '关闭'],
			btn1: function(index, layero) {
				var gdzc = encodeURI(encodeURI('导入模板.xlsx'));
				window.location = '/ZK/Controller/import/template?modelName=sa_model&outFileName='+gdzc;
			},
			btn2: function(index, layero) {
				 var ofile = top.$("#uploadFile").get(0).files[0];
				  var fileSize = ofile.size/1024/1024;// M
				  if(fileSize>5){
					  jp.info("文件不能大于5M");
					  return;
				  }
				  var ofileName = top.$("#uploadFile").val();
				  var outIndex = ofileName.lastIndexOf(".");
				  var ofileExt = ofileName.substr(outIndex+1);
				  if(ofileExt=="xls" || ofileExt=="xlsx"){
					  var formData = new FormData();
					  formData.append("file",ofile);
					  $.ajax({
							url :  "/ZK/Controller/import",
							type : "post",// 使用post方法访问后台
							data :formData,
							contentType:false,
							processData:false,
							chche:false,
							dataType : "json",// 返回数据的格式
							success : function(data) {
								 jp.infoSure(data.msg);// 提示
							},
							error:function(data){
								jp.info("获取数据出错,请先刷新页面后重试");
							}
					  });
				  }else{
					  jp.info("文件仅支持上传xls和xlsx格式");
					  return;
				  }
			},
			btn3: function(index) {
				jp.close(index);
			}
		});
	});

演示文件内容(A-H,共8个字段,这里的顺序不能打乱,否则对应不到后台相应的字段。)

Java中jar包批量导入 java如何批量导入数据_数据

这里我导入了两个页签,第二个页签中的内容如第一个,用一个xls表格可以导入很多不同种类的对象内容。

Java中jar包批量导入 java如何批量导入数据_字段_02

第二步,后台接收文件(这里使用的是MultipartFile  这个类一般是用来接受前台传过来的文件,做个导入功能。)

@ResponseBody
@RequestMapping(value="import")
public String importFile(MultipartFile file){
    try{
        //读取Excel,
        ImportExcel ie = new ImportExcel(file,1,0);
        //解析,把数据解析放入map中
        Map<String,Object> map = redExcelContent(ie);
        int successNum = 0;
        int successNum2 = 0;
        //把map中数据保存到数据库中
        for(UserIU iu :(List<UserIU> map.get("1"))){//循环map的第一个值,代表excl中第一个页签内容
            // 各种判断逻辑省略,
            //插入方法省略,我这里用的springmvc和mybatis,可以按照自己的相关框架,在这里就是直接把对象保存到数据库中         
            //insertUserIu(iu);
            successNum++;
        }
        //把map中数据保存到数据库中
        for(KeepIU ku :(List<KeepIU> map.get("2"))){//循环map的第二个值,代表excl中的第二个页签内容
            // 各种判断逻辑省略,
            //插入方法省略,我这里用的springmvc和mybatis,可以按照自己的相关框架,在这里就是直接把对象保存到数据库中         
            //insertKeepIu(ku);
             successNum2++;
        }
               
        return "UserIu导入"+successNum+"条数据,KeepIu导入"+successNum2+"条数据";
        
    }catch(Exception e){
        logger.error("message",e)
        return "导入异常";
    }


}

具体的解析方法

//这个方法,简单演示一下。
public Map<String,Object> redExcelContent(ImportExcel ie) throws Exception{
    if(ie.getWb()==null){
        throw new Exception ("Workbook对象为空");
    }
    Map<String,Object> map = new Map<String,Object>();
    Sheet sheet1 = ie.getWb().getSheetAt(0);//第一页签内容;
    Sheet sheet2 = ie.getWb().getSheetAt(1);//第二页签内容;
    
    List<UserIu> listUserIu = new ArrayList<UserIu>();  //第一个页面内容对应的集合
    List<KeepIu> listKeepIu = new ArrayList<KeepIu>();      
    

    //解析第一个页面
    ie.setSheet(sheet1);
    int rowNum = sheet1.getLastRowNum();//得到行数,具体有多少行,就有多少个对象
    for(int i = 2; i<rowNum; i++){//从第三行开始解析,,0,1,2开始,因为给的例子中,第一行是空白,第二行为字段名称,第三行开始才是数据
        Row row = sheet1.getRow(i);
        String one_clumn = (String)ie.getCellValue(row,0);//0为第一个数据
        String tow_clumn = (String)ie.getCellValue(row,1);
        //把字段放入对象中,把对象放入集合中;
       UserIu  userIu = new UserIu();
        userIu.setUserCl(one_clumn);
        userIu.setUserName(tow_clumn);
        listUserIu.add(userIu);
    }
    map.put("1",listUserIu);//把集合放入map中
    //解析第二个页面
    ie.setSheet(sheet2);
     int rowNum2 = sheet2.getLastRowNum();//得到行数,具体有多少行,就有多少个对象
    for(int i = 2; i<rowNum2; i++){//从第三行开始解析,,0,1,2开始,因为给的例子中,第一行是空白,第二行为字段名称,第三行开始才是数据
        //与上面类似,省略。。
    }
    map.put("2",listKeepIu);//把集合放入map中

    return map;
}

到这里就将文件excl中的内容解析成功,并且保存到数据库中。返回前台一个String字符串,告诉客户端上传是否成功。

在咱们开发中,所有的方法,尽量写成公共方法。

请点击这里,跳转到公共导入公共方法(使用的是泛型对象。直接返回list集合,对所有对象都适用)

如果需要java后台导出excl文件,请点击  使用java在后台将数据导出为excel文件