一、思路分析

  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. 学习记录:交叉编译环境配置(buildroot and gdb&gdbserver)【转】

    本文转载自:https://blog.csdn.net/zhy025907/article/details/52332528 1,背景 因为参加公司的路由器逆向培训,首先需要的就是环境的配置准备工作, ...

  2. 爬虫框架Scrapy之案例三图片下载器

    items.py class CoserItem(scrapy.Item): url = scrapy.Field() name = scrapy.Field() info = scrapy.Fiel ...

  3. 【尺度不变性】An Analysis of Scale Invariance in Object Detection – SNIP 论文解读

    前言 本来想按照惯例来一个overview的,结果看到1篇十分不错而且详细的介绍,因此copy过来,自己在前面大体总结一下论文,细节不做赘述,引用文章讲得很详细,另外这篇paper引用十分详细,如果做 ...

  4. 【ROI Pooling】ROI Pooling层详解(转)

    原文链接:https://blog.deepsense.ai/region-of-interest-pooling-explained/ 目标检测typical architecture 通常可以分为 ...

  5. python中的上下文管理器

    刚刚看了vamei大神的上下文管理器博客,理解如下: 其实我自己经常用到上下文管理器,尤其是在打开文件的时候,如果自己比较懒,不想手工打上f.close(),使用上下文管理器就ok拉. 上下文管理器就 ...

  6. 分页式存储管理方式AND请求分页式存储管理

    先说下什么是页(页面):就是将用户的程序的的地址空间分成固定大小的区域,称为”页“,或者”页面“ 之后将这些页离散的放进内存中,这样解决了内存的碎片问题 记得老师上课说了下这两个概念不能混,现在区分下 ...

  7. Memcached gets 命令

    Memcached gets 命令获取带有 CAS 令牌存 的 value(数据值) ,如果 key 不存在,则返回空. 语法: gets 命令的基本语法格式如下: gets key 多个 key 使 ...

  8. javascript 关键词 new都做了写什么

    翻译自stackoverflow:http://stackoverflow.com/questions/1646698/what-is-the-new-keyword-in-javascript ne ...

  9. Redis-CentOS7安装

    安装 Redis是c语言开发的. 安装redis需要c语言的编译环境.如果没有gcc需要在线安装.yum install gcc-c++ 安装步骤: 第一步:redis的源码包上传到linux系统. ...

  10. (3) iOS开发之UI处理-UIView篇

    在UIView作为许多子控件的容器的时候,首先我们需要动态的计算出UIView下的所有子控件的高度,并布局排列好,然后我们还要把作为容器的UIView的高度调整到刚好包裹着所有子控件,不会过矮,也不会 ...