本文主要讲的是怎么使用批量导入数据,前台传入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个字段,这里的顺序不能打乱,否则对应不到后台相应的字段。)
这里我导入了两个页签,第二个页签中的内容如第一个,用一个xls表格可以导入很多不同种类的对象内容。
第二步,后台接收文件(这里使用的是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文件