一、思路分析

  1、我们要做导入,实际上也就是先文件上传,然后读取文件的数据。

  2、我们要有一个导入的模板,因为我们导入的Excel列要和我们的数据字段匹配上,所以我们要给它来一个规定,也就是模板。

  3、按照我们公司的套路,是做了一个导入信息的临时表,用来存导入文件中的信息。每当导入的时候,我们先把表信息清空,再拿到数据放进来,然后我们对导入的数据进行检查,最后才全部导入。

    这样做的目的是防止导入的数据和列没有对上却也直接导到了库里面,要真这样了就很尴尬。我们做了三个按钮,一个导入,一个确认导入,一个导入模板下载。

  4、捋一下过程:

    点击批量导入按钮,跳转到导入页面。

    点击模板下载。(事先写好一个模板.xls文件,此按钮放置下载链接)

    在模板中录入数据。

    点击导入按钮,跳出文件上传模态框。

    选择文件,上传文件。

    上传成功后调用后台方法,读取文件内容。

    把内容生成表格,显示到导入页面。

    观察数据有没有出错。

    点击确认导入,调用后台方法,执行导入操作。

    回调函数,导入成功/导入失败 的提示。

二、代码分析

   1、前端js代码:

 var actionPath = contextPath + "/alumni-import";

 $(function() {
//加载数据
loadData();
//上传文件
uploadFile({
subfix: ['xls'],
subfixTip: "请选择Excel的xls文件!",
successCall: function(data, status, a) {
$('[name=attachementPath]').val(data.fileName);
$.post(actionPath + "!importExcel", { "f_id": data.f_id }, function(data) {
if (data.success) {
alertify.alert(data.message);
$("#myModal-import").modal("hide");
loadData();
} else {
alertify.alert(data.message);
} }, "json");
}
});
//导入
$("#btn-import").click(function() {
var html = template("importTpl");
$("#import-body").html(html);
$("#myModal-import").modal();
});
//确认导入
$("#btn-sure").click(function() {
var type = $("#indentity-type").val();
alertify.confirm("确定要全部导入吗?", function(e) {
if (!e) { return; } else {
$.post("/alumni-import!saveReal?type=" + type, function(data) {
alertify.alert("导入成功!", function() {
location.href = "/alumni!hrefPage";
});
}, "json");
}
});
});
});
function loadData() {
var options = {
url: actionPath + "!page"
};
loadPaginationData(options);
}

  2、后台功能代码

    前端有四个请求,一个初始化页面数据加载,当然,一开始是没有数据的;一个导入文件上传;一个确认导入;一个导入完成后页面跳转回要信息页面(信息页面有一个批量导入跳转到这的导入页面)。

    第一个后最后一个就不讲了。讲一下第二个和第三个。

    ①第二个

     //上传文件后调用
public void importExcel() {
try {
//清空临时表的数据
baseAlumniImportSrv.deleteAll();
//读取文件
File file = gridFsDao.readFile(f_id);
//把文件信息给临时表
int count = excelXYSrv.importExcel(file);
//清空上传的文件
file.delete();
sendSuccessMsg(count, "上传成功" + count + "条数据");
} catch (IOException e) {
LOGGER.error(e);
sendFailMsg(null, "上传失败");
}
}
     @Override    //使用MongoDB GridFS,具体详解请各自初学者自行百度,注释写不下去了,我也不会,心态爆炸~~~
public File readFile(String f_id) {
//拿到文件
GridFSDBFile gridFSFile = mongoGridFs.findOne(new Query(Criteria.where(F_ID).is(f_id)));
if (gridFSFile == null) {
return null;
}
String fileName = gridFSFile.getFilename();
String extension = fileName.substring(fileName.lastIndexOf("."), fileName.length());
InputStream ins = gridFSFile.getInputStream();
String tmpFile = UUID.randomUUID().toString() + extension;
File file = new File(tmpFile);
     
try {
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
} catch (IOException e) {
e.printStackTrace();
} return file; }
     /**
* @param excelFile
* 从excel中读取数据,并存储到数据库临时表中
* @return
* @throws IOException
*/
@Override
public int importExcel(File excelFile) throws IOException {
List<List<Object>> datas = ExcelImportUtil.readExcel(excelFile);
int count = 0;
for (int i = 1; i < datas.size(); i++) {
BaseAlumniImport entity = this.convert2Entity(datas.get(i));
this.baseAlumniImportSrv.save(entity);
count++;
}
return count;
}

  ②第三个

     public void saveReal() {
int count = 0;
List<BaseAlumniImport> importList = this.baseAlumniImportSrv.findAll();
for (int i = 0; i < importList.size(); i += 10) {
List<BaseAlumniImport> newlist = new ArrayList<>();
if ((i + 10) < importList.size()) {
newlist = importList.subList(i, i + 10);
} else {
newlist = importList.subList(i, importList.size());
}
count += excelXYSrv.saveReal(newlist, this.type);
}
sendSuccessMsg(count, "导入成功" + importList.size() + "条数据");
}
     @Override
public int saveReal(List<BaseAlumniImport> importList, String type) {
int count = 0;
String alumniIdentityName = dicSrv.findById(DicAlumniIdentity.class, Integer.parseInt(type)).getValue();
for (BaseAlumniImport inst : importList) {
LOGGER.info(inst.getId());
BaseAlumni v = this.importExportSrv.convert(inst);
v.setId(IdKit.uuid());
v.setCreateTime(new Date());
v.setLastUpdate(new Date());
this.baseAlumnidDao.save(v);
this.baseAlumniImportSrv.deleteById(inst.getId());
count++;
}
return count;
}
     @Override
public int saveReal(List<BaseAlumniImport> importList, String type) {
int count = 0;
String alumniIdentityName = dicSrv.findById(DicAlumniIdentity.class, Integer.parseInt(type)).getValue();
for (BaseAlumniImport inst : importList) {
LOGGER.info(inst.getId());
BaseAlumni v = this.importExportSrv.convert(inst);
v.setId(IdKit.uuid());
v.setCreateTime(new Date());
v.setLastUpdate(new Date());
this.baseAlumnidDao.save(v);
this.baseAlumniImportSrv.deleteById(inst.getId());
count++;
}
return count;
}

    没啥好讲的……会的应该都能看懂,看不懂的我也不会……

三、结果图

  

  

  

  

导入成功~

 

    

java 导入Excel -- 套路及代码分析的更多相关文章

  1. java导入excel很完美的取值的方法

    java导入excel很完美的取值的方法   1.解决方法: /**    * 获取单元格数据内容为字符串类型的数据    * @param cell Excel单元格    * @return St ...

  2. Java解析导入Excel文件后台代码实现

    使用MultipartFile上传Excel文件后端代码实现:(springmvc下的spring-webmvc (MultipartFile )上传) 由于POST一个包含文件上传的Form会以mu ...

  3. java poi导入Excel(个人代码)

    案例使用的框架:jsp+spring+mybaties <form id="importForm" name="importForm" method=&q ...

  4. java导入Excel表格数据

    首先导入Excel数据需要几样东西 第一需要两个依赖包,这里直接是在pom注入依赖 <!--excel--> <dependency> <groupId>org.a ...

  5. Java导入excel并保存到数据库

    首先建立好excel表格,并对应excel表格创建数据库表. 前台jsp页面:其中包含js <%@ page language="java" import="jav ...

  6. Spring Boot下的一种导入Excel文件的代码框架

    1.前言 ​ Spring Boot下如果只是导入一个简单的Excel文件,是容易的.网上类似的文章不少,有的针对具体的实体类,代码可重用性不高:有的利用反射机制或自定义注解,开发了Excel导入工具 ...

  7. java读取excel文件的代码

    如下内容段是关于java读取excel文件的内容,应该能对各朋友有所用途. package com.zsmj.utilit; import java.io.FileInputStream;import ...

  8. java poi导入EXCEL xls文件代码

    /** * */ package com.bn.car.common.report.excel; import java.io.FileInputStream; import java.io.IOEx ...

  9. java导入excel时处理日期格式(已验证ok)

    在Excel中的日期格式,比如2009-12-24将其转化为数字格式时变成了40171,在用java处理的时候,读取的也将是40171.如果使用POI处理Excel中的日期类型的单元格时,如果仅仅是判 ...

随机推荐

  1. 10个足以让你成为更优秀的程序员的C语言资源

    一些人觉得编程无聊,一些人觉得它很好玩.但每个程序员都必须紧跟编程语言的潮流.大多数程序员都是从C开始学习编程的,因为C是用来写操作系统.应用程序最常用的语言. · C编程笔记 这些是华盛顿实验学院C ...

  2. openwrt下定义软件包的依赖关系类型

    在openwrt下软件包的依赖关系由DEPENDS:=来指定 第一种依赖关系类型为只有将依赖的软件包手动选上,当前的软件包就会自动被选中,用法为DEPENDS:=package_name 第二种依赖关 ...

  3. Spring Boot CRUD+分页(基于JPA规范)

    步骤一:JPA概念 JPA(Java Persistence API)是Sun官方提出的Java持久化规范,用来方便大家操作数据库. 真正干活的可能是Hibernate,TopLink等等实现了JPA ...

  4. PyTorch源码解读之torchvision.models(转)

    原文地址:https://blog.csdn.net/u014380165/article/details/79119664 PyTorch框架中有一个非常重要且好用的包:torchvision,该包 ...

  5. STL list用法总结

    2017-08-20 15:17:30 writer:pprp list是一种线性复杂度的容器,很快 /* name : usage of List writer : pprp declare : n ...

  6. JSch 实现 SSH 端口转发

    package com.yinger.webservice.test; import java.sql.Connection; import java.sql.DriverManager; impor ...

  7. cocos2d-x入门一

    为什么要学cocos2d-x        首先要明白什么是cocos2d-x,能干什么.cocos2d-x是一种跨平台的2D.3D游戏开发工具,目前较为流行的大多数android.ios游戏都是用它 ...

  8. Decrypting OWIN Authentication Ticket

    参考:https://long2know.com/2015/05/decrypting-owin-authentication-ticket/ AuthServer产生的Token因为没有制定自定义的 ...

  9. char数组

    *****************************************************************char 类型的数组(c语言中是没有字符串的)char name[20 ...

  10. pandas的常用函数

    1.DataFrame的常用函数: (1)np.abs(frame) 绝对值, (2)apply function, lambda f= lambda x: x.max()-x.min(),frame ...