阿里 EasyExcel 使用及避坑
github地址:https://github.com/alibaba/easyexcel
原本在项目中使用EasyPoi读取excel,后来为了统一技术方案,改用阿里的EasyExcel。EasyExcel和EasyPoi有一定的相似之处。
EasyExcel和EasyPoi效率对比:


因为数据量少,从效率上看几乎没有差别,EasyExcel略胜一筹。
使用maven的方式引用EasyExcel
https://mvnrepository.com/artifact/com.alibaba/easyexcel
<!--easyexcel-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>1.1.2-beat1</version>
</dependency>
使用Java模型的方式使用easyexcel
Java模型
@Data
public class TotalAmount extends BaseRowModel implements Serializable { private Integer id; @ExcelProperty(value ="类型",index = 0)
private String type;//开支类型 信用卡等 @ExcelProperty(value = "金额",index =1)
private String sum; @ExcelProperty(value = "来源",index =2)
private String name;//开支来源 如:**银行信用卡 @ExcelProperty(value = "日期",index =3)
private String date; @ExcelProperty(value = "状态",index =4)
private Integer status; @ExcelProperty(value = "备注",index =5)
private String descr; }
使用Java模型的方式需要继承 BaseRowModel ,字段上使用 @ExcelProperty 注解,注解中 value 属性指定字段名,index属性指定字段排序。
注意:这里和EasyExcel不同的是,目前可以使用只指定index和同时指定index和value的方式来匹配excel文件,但是如果只指定value,则无法读取。
@RequestMapping("/importExce")
@ResponseBody
public JsonResponse importExcel(@RequestParam("excelFile") MultipartFile excelFile, String type) throws IOException {
JsonResponse jsonResponse = new JsonResponse();
String sm="2019-02";
List<Object> dataList = null;
dataList = EasyExcelFactory.read(excelFile.getInputStream(), new Sheet(3, 1, TotalAmount.class));
int scuess = 0;
int error = 0;
for (Object o : dataList) {
if (o instanceof TotalAmount) {
TotalAmount importEntity = (TotalAmount) o;
try {
} catch (Exception e) {
error++;
e.printStackTrace();
continue;
}
}
}
}
/* @RequestMapping("/importExce")
@ResponseBody
public JsonResponse importExce(){
JsonResponse jsonResponse = new JsonResponse();
File excelFile = new File
("E:\\工作文档\\部门架构201902(bug).xlsx");
String sm="2019-02";
InputStream inputStream = new FileInputStream(excelFile);
List<Object> dataList = null;
dataList = EasyExcelFactory.read(inputStream, new Sheet(3, 1, TotalAmount.class));
int scuess = 0;
int error = 0;
for (Object o : dataList) {
if (o instanceof TotalAmount) {
TotalAmount importEntity = (TotalAmount) o;
try {
} catch (Exception e) {
error++;
e.printStackTrace();
continue;
}
}
}
}*/
注意:在使用EasyExcel时容易出的几个错误:
For input "" 类型错误,应该是double等类型的字段有非double类型的数据
java.lang.NumberFormatException: multiple points 多线程使用非线程安全类报错,实际是在日期格式里有并非指定日期格式的数据,比如空格,比如指定 yyyy/mm/dd 但数据是 yyyy-mm-dd
使用easyexcel写出excel:
使用Java模型方式,返回模型列表,带入方法即可
/**
* 导出Excel
*
* @param request
* @param response
* @param map
* @throws IOException
*/
@RequestMapping("export.do")
public void export(HttpServletRequest request, String type, HttpServletResponse response,
@RequestParam Map<String, Object> map) throws IOException {
ServletOutputStream out = null;
try {
out = response.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true);
String filename;
String fileName = null;
try {
filename = new Date().toLocaleString();
fileName = new String((filename).getBytes(), "UTF-8");
Sheet sheet2 = new Sheet(2, 3, ImportEntityEasyExcel.class, "sheet", null);
List<ImportEntityEasyExcel> list = service.getData(map);
response.setCharacterEncoding("utf-8");
response.setContentType("application/vnd.ms-excel");
response.setHeader("content-Disposition",
"attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "utf-8"));
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
writer.finish();
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
总结:
easyexcel还有一些并不完善,但是大数据量操作效率高于easypoi
阿里 EasyExcel 使用及避坑的更多相关文章
- Java避坑宝典《Java业务开发常见错误100例》上线了
写这个专栏的缘起 之前我写过一篇博客:<朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的10种坑>,引起的关注还是挺多的.后来和极客时间的编辑一拍即合决定以这个为题写一个专栏.其实所 ...
- Canal v1.1.4版本避坑指南
前提 在忍耐了很久之后,忍不住爆发了,在掘金发了条沸点(下班时发的): 这是一个令人悲伤的故事,这条情感爆发的沸点好像被屏蔽了,另外小水渠(Canal意为水道.管道)上线一段时间,不出坑的时候风平浪静 ...
- 珍爱生命,远离JS=>JS避坑记
JavaScript避坑记 转载请注明源地址: http://www.cnblogs.com/funnyzpc/p/8407952.html 上图=> 有意思的漫画,不知大家看懂了没,这里我想说 ...
- 双刃剑MongoDB的学习和避坑
双刃剑MongoDB的学习和避坑 MongoDB 是一把双刃剑,它对数据结构的要求并不高.数据通过key-value的形式存储,而value的值可以是字符串,也可以是文档.所以我们在使用的过程中非常方 ...
- Windows环境下Anaconda安装TensorFlow的避坑指南
最近群里聊天时经常会提到DL的东西,也有群友在学习mxnet,但听说坑比较多.为了赶上潮流顺便避坑,我果断选择了TensorFlow,然而谁知一上来就掉坑里了…… 我根据网上的安装教程,默认安装了最新 ...
- spring-boot-starter-thymeleaf 避坑指南
第一步:pom配置环境 先不要管包是做什么的 总之必须要有 否则进坑 <!--避坑包--> <dependency> <groupId>net.sourceforg ...
- 在mpvue中使用map如何避坑
最近在做一个需求,当用户放大地图到某个级别时,自动显示marker的callout标签,当小于这个缩放级别时,则隐藏callout.然而在我实现的过程中,却发现一个严重的问题:当我操作marker数据 ...
- MyBatis 一级缓存避坑
MyBatis 一级缓存(MyBaits 称其为 Local Cache)无法关闭,但是有两种级别可选: package org.apache.ibatis.session; /** * @autho ...
- electron 编译 sqlite3避坑指南---尾部链接有已经编译成功的sqlite3
electron 编译 sqlite3避坑指南(尾部链接有已经编译成功的sqlite3) sqlite很好用,不需要安装,使用electron开发桌面程序,sqlite自然是存储数据的不二之选,奈何编 ...
随机推荐
- Confluence 6 启用 HTTP 压缩
在屏幕的右上角单击 控制台按钮 ,然后选择 基本配置(General Configuration) 链接. 在左侧的面板中选择 通用配置(General Configuration). 启用 HTTP ...
- VUE开发请求本地数据的配置,旧版本dev-server.js,新版本webpack.dev.conf.js
VUE开发请求本地数据的配置,早期的vue-lic下面有dev-server.js和dev-client.js两文件,请求本地数据在dev-server.js里配置,最新的vue-webpack-te ...
- PDF文件如何标注,怎么使用PDF标注工具
我们在使用文件的时候需要给文件的部分添加标注,能够更加直观的了解文件,但是有很多小伙伴们对于PDF文件怎么添加标注都不知道,也不知道PDF标注工具要怎么使用,那么下面就跟大家分享一下怎么使用PDF标注 ...
- hdu3635
/* 一开始第a个球在第a个城市 操作T a b,把第a个球所在城市的所有球移到b所在的城市 操作Q a 要求输出 第a个球在哪个城市 第a个球所在的城市有几个球 第a个球移动次数 */ #inclu ...
- bootstrap和easyui
1.easyui:自定义的样式要在原先的easyui样式之前引入,这样自定义的样式才能把原先的样式覆盖,即放置顺序为: <link rel="stylesheet" href ...
- c++实现 给定直角停车位两个点,求取剩余两点坐标。
//2018-09-08-fourmi /*************************include head files************************************ ...
- bootstrap 三个文件的引入
<!-- 新 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="//cdn.bootcss.co ...
- phoenix表操作
phoenix表操作 进入命令行,这是sqlline.py 配置到path环境变量的情况下 sqlline.py localhost如果要退出命令行:!q 或者 !quit 3.4.1 创建表 ...
- JDK1.7 Update14 HotSpot虚拟机GC收集器
在测试服务器上使用如下命令可以查看当前使用的 GC收集器,当然不止这一个命令可以看到,还有其他一些方式 第三列”=”表示第四列是参数的默认值,而”:=” 表明了参数被用户或者JVM赋值了 [csii@ ...
- C#default关键字(泛型代码中的默认关键字)
在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T:T 是引用类型还是值类型.如果 T 为值类型,则它是数值还是结构.给定参数化类型 T 的一个变量 t,只有 ...