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 使用及避坑的更多相关文章

  1. Java避坑宝典《Java业务开发常见错误100例》上线了

    写这个专栏的缘起 之前我写过一篇博客:<朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的10种坑>,引起的关注还是挺多的.后来和极客时间的编辑一拍即合决定以这个为题写一个专栏.其实所 ...

  2. Canal v1.1.4版本避坑指南

    前提 在忍耐了很久之后,忍不住爆发了,在掘金发了条沸点(下班时发的): 这是一个令人悲伤的故事,这条情感爆发的沸点好像被屏蔽了,另外小水渠(Canal意为水道.管道)上线一段时间,不出坑的时候风平浪静 ...

  3. 珍爱生命,远离JS=>JS避坑记

    JavaScript避坑记 转载请注明源地址: http://www.cnblogs.com/funnyzpc/p/8407952.html 上图=> 有意思的漫画,不知大家看懂了没,这里我想说 ...

  4. 双刃剑MongoDB的学习和避坑

    双刃剑MongoDB的学习和避坑 MongoDB 是一把双刃剑,它对数据结构的要求并不高.数据通过key-value的形式存储,而value的值可以是字符串,也可以是文档.所以我们在使用的过程中非常方 ...

  5. Windows环境下Anaconda安装TensorFlow的避坑指南

    最近群里聊天时经常会提到DL的东西,也有群友在学习mxnet,但听说坑比较多.为了赶上潮流顺便避坑,我果断选择了TensorFlow,然而谁知一上来就掉坑里了…… 我根据网上的安装教程,默认安装了最新 ...

  6. spring-boot-starter-thymeleaf 避坑指南

    第一步:pom配置环境 先不要管包是做什么的 总之必须要有 否则进坑 <!--避坑包--> <dependency> <groupId>net.sourceforg ...

  7. 在mpvue中使用map如何避坑

    最近在做一个需求,当用户放大地图到某个级别时,自动显示marker的callout标签,当小于这个缩放级别时,则隐藏callout.然而在我实现的过程中,却发现一个严重的问题:当我操作marker数据 ...

  8. MyBatis 一级缓存避坑

    MyBatis 一级缓存(MyBaits 称其为 Local Cache)无法关闭,但是有两种级别可选: package org.apache.ibatis.session; /** * @autho ...

  9. electron 编译 sqlite3避坑指南---尾部链接有已经编译成功的sqlite3

    electron 编译 sqlite3避坑指南(尾部链接有已经编译成功的sqlite3) sqlite很好用,不需要安装,使用electron开发桌面程序,sqlite自然是存储数据的不二之选,奈何编 ...

随机推荐

  1. LeetCode(98): 验证二叉搜索树

    Medium! 题目描述: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右 ...

  2. 条件为空的sql你们写过么 (我也是醉了碰到了这种需求,当时还真有点o((⊙﹏⊙))o懵逼.jpg)

    需求描述:单表,父子关系,有个统一的主键dict_id和一个父级别的parent_id,查询父级别的字典名称,parent_id是空,本渣用的是mybatis奥!!! 废话不多说,直接上代码mappe ...

  3. java 命令行运行时报错:找不到或无法加载主类

    源码如下: 路径目录(...\src\object) //: ch1.10/Command.java /**@author feilong * @version 1.0 */ package obje ...

  4. QuerySet中添加Extra进行SQL查询

    select参数接受一个映射到SQL的字符串标识字典,让你可以根据SQL select子句里的选择进行对模型实例添加属性,或者查询. from blog.models import BlogPost& ...

  5. 原码、补码、反码的概念和java数的存储方式

    原码:用符号位和数值位表示一个带符号数,整数符号->0,负数符号->1,数值一般用二进制形式表示 [+10011]原=00010011    [-10011]原=10010011 反码:正 ...

  6. SPY

    问题 : SPY 时间限制: 1 Sec  内存限制: 128 MB 题目描述 The National Intelligence Council of X Nation receives a pie ...

  7. postMan测试https接口

    一.如何安装postman? Postman下载地址https://www.getpostman.com/ 我下载的版本是Postman-win64-5.0.0-Setup.exe 这是免安装的,可以 ...

  8. rsync注意事项

    1.sudo rsync -zavP --exclude=/.git/ --exclude=.env --exclude=web/index.php  --password-file=/usr/loc ...

  9. Ubuntu下安装kate编辑器

    Ubuntu下安装kate编辑器   Ubuntu 下安装kate编辑器 #sudo apt-get install kate 安装kconsole #sudo apt-get install kco ...

  10. 跨域 jQuery库ajax请求

    XMLHttpRequest是原生ajax,缺点是使用起来比较繁琐. jQuery库提供了一组简洁的ajax请求方法. ajax() get() post() 具体使用参考官方API: http:// ...