EasyExcel导入工具(SpringMVC下使用)
easyExcel:由阿里巴巴公司开发,由github托管
github上有详细使用文档
github地址:https://github.com/alibaba/easyexcel/blob/master/quickstart.md
导入
1、模型类:可以是实体类
主要是@ExcelProperty注解
value:对应字段
index:对应导入模板是第几列(从0开始)
@ExcelProperty(value = "name", index = 0)
推荐使用有模型,因为导入模板如果有变化,index可以随时改变
2、Controller接收导入文件
//批量导入(有模型)
@RequestMapping("batchImport")
public ModelAndView batchImport(@RequestParam(value = "file", required=true)MultipartFile file) {
ModelAndView mv=new ModelAndView();
mv.setView(Jackson2Util.jsonView());
InputStream in = null;
try {
in = file.getInputStream();
// 解析每行结果在listener中处理
AnalysisEventListener listener = new ExcelListener(vehicleInfoService);
ExcelReader excelReader = new ExcelReader(in, ExcelTypeEnum.XLSX, null, listener);
//(第几个sheet,表头所在行数,表格对应实体类)
excelReader.read(new Sheet(1, 1, ExcelCardIssueVehicleInfo.class)); mv.addObject("res", "0"); } catch(Exception e) {
logger.error("批量导入失败!", e);
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return mv;
}
3、解析每行数据并入库
public class ExcelListener extends AnalysisEventListener {
private CardIssueVehicleInfoService cardIssueVehicleInfoService;
public ExcelListener(CardIssueVehicleInfoService cardIssueVehicleInfoService) {
super();
this.cardIssueVehicleInfoService = cardIssueVehicleInfoService;
}
private List<CardIssueVehicleInfo> datas = new ArrayList<CardIssueVehicleInfo>();
//每解析一行数据就走一遍invoke()方法
public void invoke(Object object, AnalysisContext context) {
//转为导入模型类
ExcelCardIssueVehicleInfo excel = (ExcelCardIssueVehicleInfo)object;
CardIssueVehicleInfo vehicleInfo = new CardIssueVehicleInfo();
try {
//导入模型类转为对应数据库的实体类:可以是同一个实体类
BeanUtils.copyProperties(vehicleInfo, excel);
datas.add(vehicleInfo); //数据存储到list,供批量导入处理,或后续自己业务逻辑处理。
} catch (Exception e) {
e.printStackTrace();
}
}
//解析完所有Excel数据后,走此方法
public void doAfterAllAnalysed(AnalysisContext context) {
try{
//入库
cardIssueVehicleInfoService.batchInsert(datas);
} catch(Exception e) {
logger.error("批量导入失败!", e);
}
datas.clear();//解析结束销毁不用的资源
}
}
遇到问题及解决方案:
1、模型(实体类)支持String和int类型,不支持Short类型
2、在ExcelListener 类中,Spring注入Service层,会无法注入
解决:在Controller层,将已注入的Service,传入ExcelListener中
AnalysisEventListener listener = new ExcelListener(vehicleInfoService);
并在ExcelListener的构造器中接收
public ExcelListener(CardIssueVehicleInfoService cardIssueVehicleInfoService) {
super();
this.cardIssueVehicleInfoService = cardIssueVehicleInfoService;
}
3、poi.jar和poi-ooxml.jar的版本一定要一致(easyExcel依赖poi),不然会报错
4、easyExcel基于POI的,遇到的报错,都可以按照POI的错误搜索解决办法
EasyExcel导入工具(SpringMVC下使用)的更多相关文章
- Mongodb数据导出工具mongoexport和导入工具mongoimport介绍
一.导出工具mongoexport Mongodb中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件.可以通过参数指定导出的数据项,也可以根据指定的条件导 ...
- [转载]一个高效简洁的Aseprite to Unity导入工具
原文链接 https://zhuanlan.zhihu.com/p/28644268 期待原作者上传至AssetStore. 今天,我的第一个 Unity 插件 MetaSprite 正式发布了它的 ...
- POI导入工具类
前言 导入的通用方法,包括xls.xlsx的取值方法,非空判断方法,空行判断,处理了手机号读取和日期读取格式问题.这几个方法就可以完成简单读取了,有时间我在优化下. maven依赖 <!-- P ...
- Mongodb数据导出工具mongoexport和导入工具mongoimport介绍(转)
原文地址:http://chenzhou123520.iteye.com/blog/1641319 一.导出工具mongoexport Mongodb中的mongoexport工具可以把一个colle ...
- ImportTsv-HBase数据导入工具
一.概述 HBase官方提供了基于Mapreduce的批量数据导入工具:Bulk load和ImportTsv.关于Bulk load大家可以看下我另一篇博文. 通常HBase用户会使用HBase A ...
- Mongodb数据导出工具mongoexport和导入工具mongoimport使用
如图所示,两个工具位于mongodb安装目录的bin目录下 下面介绍一下两者的使用方法: 一.导出工具mongoexport Mongodb中的mongoexport工具可以把一个collection ...
- EasyExcel导入导出
maven依赖 <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --> <dependency> & ...
- Redis数据导入工具优化过程总结
Redis数据导入工具优化过程总结 背景 使用C++开发了一个Redis数据导入工具 从oracle中将所有表数据导入到redis中: 不是单纯的数据导入,每条oracle中的原有记录,需要经过业务逻 ...
- 基于SpringMVC下的Rest服务框架搭建【1、集成Swagger】
基于SpringMVC下的Rest服务框架搭建[1.集成Swagger] 1.需求背景 SpringMVC本身就可以开发出基于rest风格的服务,通过简单的配置,即可快速开发出一个可供客户端调用的re ...
随机推荐
- 50.JQ---jQuery 常用小技巧
1. 禁止右键点击 $(document).ready(function(){ $(document).bind("contextmenu",function(e){ return ...
- protocol buffer 编码
protocol buffer能够跨平台提供轻量的序列化和反序列化,得益于其平台无关的编码格式,本文就介绍下其中的编码格式. Varints 在protocol buffer中大量使用到了Varint ...
- JavaScript 原型链学习(四)原型链的基本概念、原型链实现继承
简单回顾一下构造函数.原型和实例的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针.那么,假如我们让原型对象等于另一个类型的实例,结果会 ...
- EasyUI中使用textbox赋值,setValue和setText顺序问题
注意两点: 当text和value的值不同时,一定要先赋值Value,然后赋值Text,否则text和value全部为Value的值. 如果只setValue,则使用getText和getValue得 ...
- 软件工程---UML理解
1.依赖关系和关联关系 1.1依赖关系是调用关系,其又分为全局依赖.参数依赖.局部依赖 1.2关联关系是结构上的关系,按照关联的强弱又具体分为关联关系.聚合关系(整体和部分的组成关系.whole-pa ...
- 基于Docker的GoldenGate部署
前言 Docker最近几年异常火爆,主要是因为其方便.快捷.轻量,相对于VM,它不需要占用太多资源,随时可以创建.删除,或在已有image上添加一些软件,再制作成另一个模板image供日后使用.Doc ...
- JavaScript 字典
JavaScript 字典 字典以 key value 形式出现 使用: a = {'k1':'v1,''k2':'v2'} 获取值: a['k1'] 获取值:v1
- JavaScript 序列化、转义
JavaScript 序列化.转义 序列化 // 将对象转换为字符串 JSON.stringify() // 将字符串转换为对象类型 JSON.parse() 转义 // URl中未转义的字符 de ...
- Python 简单soket例子
简单的soket例子 Python 2.0 客户端服务端传输 1.可发字符串,可发字节 bys类型 Python 3.0 客户端服务端传输 1.只能发bys,比特流的类型. 2.bys类型只能接收 ...
- FSMC_LCD
1. TFT-LCD(Thin Film Transistor Liquid Crystal Display)[薄膜晶体管液晶显示器] 2. 液晶 物质在熔融状态或在溶液状态下虽然获得了液体物质的流动 ...