java 导入Excel -- 套路及代码分析
一、思路分析
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 -- 套路及代码分析的更多相关文章
- java导入excel很完美的取值的方法
java导入excel很完美的取值的方法 1.解决方法: /** * 获取单元格数据内容为字符串类型的数据 * @param cell Excel单元格 * @return St ...
- Java解析导入Excel文件后台代码实现
使用MultipartFile上传Excel文件后端代码实现:(springmvc下的spring-webmvc (MultipartFile )上传) 由于POST一个包含文件上传的Form会以mu ...
- java poi导入Excel(个人代码)
案例使用的框架:jsp+spring+mybaties <form id="importForm" name="importForm" method=&q ...
- java导入Excel表格数据
首先导入Excel数据需要几样东西 第一需要两个依赖包,这里直接是在pom注入依赖 <!--excel--> <dependency> <groupId>org.a ...
- Java导入excel并保存到数据库
首先建立好excel表格,并对应excel表格创建数据库表. 前台jsp页面:其中包含js <%@ page language="java" import="jav ...
- Spring Boot下的一种导入Excel文件的代码框架
1.前言 Spring Boot下如果只是导入一个简单的Excel文件,是容易的.网上类似的文章不少,有的针对具体的实体类,代码可重用性不高:有的利用反射机制或自定义注解,开发了Excel导入工具 ...
- java读取excel文件的代码
如下内容段是关于java读取excel文件的内容,应该能对各朋友有所用途. package com.zsmj.utilit; import java.io.FileInputStream;import ...
- java poi导入EXCEL xls文件代码
/** * */ package com.bn.car.common.report.excel; import java.io.FileInputStream; import java.io.IOEx ...
- java导入excel时处理日期格式(已验证ok)
在Excel中的日期格式,比如2009-12-24将其转化为数字格式时变成了40171,在用java处理的时候,读取的也将是40171.如果使用POI处理Excel中的日期类型的单元格时,如果仅仅是判 ...
随机推荐
- 前端小炒的win7使用笔记(收藏篇)
收藏篇 此中技巧及使用笔记,大多为冲浪时无意间发现,进而总结,其中种种小超都已一一验证过. 传说中WIN7上帝模式可查看200多项系统设置项目 在桌面创建文件夹,命名为 GodModel.{ED7BA ...
- Windows下实现mysql定时备份
1.写MySQL备份bat处理 @echo off set "yMd=%date:~,4%%date:~5,2%%date:~8,2%" set "hms=%time:~ ...
- kubectl delete
kubectl delete 通过配置文件名.stdin.资源名称或label选择器来删除资源. 支持JSON和YAML格式文件.可以只指定一种类型的参数:文件名.资源名称或label选择器. 有些资 ...
- spring boot 笔记--第三章
spring boot 笔记 第三章,使用Spring boot 构建系统: 强烈建议支持依赖管理的构建系统,Maven或Gradle 依赖管理: Spring Boot的每版本都会提供它支持的依赖列 ...
- awk字符串处理
awk 字符串处理函数 awk提供了许多强大的字符串函数,见下表:awk内置字符串函数gsub(r,s) 在整个$0中用s替代rgsub(r,s,t) 在整个t中用s替代rindex(s, ...
- Python基础笔记系列九:变量、自定义函数以及局部变量和全局变量
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 变量在前面的系列中也许就可以发现,python中的变量和C中的变量有些许不 ...
- htop 比top更好用的top
安装 sudo apt-get install htop 使用 htop
- jqueryUI之datepicker日历插件的介绍和使用
jQuery UI很强大,其中的日期选择插件Datepicker是一个配置灵活的插件.我们可以自定义其展示方式,包括日期格式.语言.限制选择日期范围.添加相关按钮以及其它导航等.
- Spring Boot的自动配置的原理
Spring Boot在进行SpringApplication对象实例化时会加载META-INF/spring.factories文件,将该配置文件中的配置载入到Spring容器. 1.1.1. ...
- [Vue]Vue语法糖v-bind、v-on
语法糖 :是指在不影响功能的情况下,添加某种方法实现同样的效果,从而方便程序开发,简化代码是书写. Vue.js的v-bind和v-on指令都提供了语法糖,也可以说是缩写. 1.v-bind可以省略, ...