前言

EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单,节省内存著称,EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。

EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。

构建工具类

@Data
public class User{@ExcelProperty(value = "名称", index = 0)@ColumnWidth(value = 15)private String name;//名称@ExcelProperty(value = "年龄", index = 1)@ColumnWidth(value = 15)private String age;//患者姓名@ExcelProperty(value = "性别", index = 2)@ColumnWidth(value = 15)private String sex;//患者id@ExcelProperty(value = "创建时间", index = 4)@ColumnWidth(value = 15)private String confirmDate;//创建时间
}

读取excel文件

读取excle文件可以分为两种方式,一种是异步读取,另一种是同步读取

异步

异步读取首先要构建监听器继承AnalysisEventListener

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;import java.util.ArrayList;
import java.util.List;public class ExcelListener<T> extends AnalysisEventListener<T> {private List<T> list=new ArrayList<>();//读取每一行数据执行一次@Overridepublic void invoke(T t, AnalysisContext analysisContext) {list.add(t);}//读取表头内容@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {System.out.println("表头:"+headMap);}//数据全部读取完毕@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {save(list);System.out.println("所有数据解析完毕.................");}public void save(List<T> list){//逻辑代码}
}

读取代码

public class ExcelUtils {/*** 读取excel文件* @param file 文件* @return List*/public static void readExcel(File file){InputStream ins=null;try {ins=new FileInputStream(file);} catch (FileNotFoundException e) {e.printStackTrace();}//sheet 设置处理的工作簿 headRowNumber 设置从excel第几行开始读取EasyExcel.read(ins, User.class ,new ExcelListener<User>()).sheet().headRowNumber(1).doRead();//第0行一般是表头,从第1行开始读取}
}
public class Test{public static void main(String[] args) {ExcelUtils readExcel(new File("D:\\test.xlsx"),User.class);}
}
同步

同步读取可以不需要上面的监听器了(不过如果需要验证表头的话,还是可以加上监听器来验证表头信息)
其实也就是 一个使用 doRead() 另一个使用 doReadSync()

public class ExcelUtils {/*** 读取excel文件* @param file 文件* @return List*/public static List readExcel(File file,Class clazz){InputStream ins=null;try {ins=new FileInputStream(file);} catch (FileNotFoundException e) {e.printStackTrace();}//sheet 设置处理的工作簿 headRowNumber 设置从excel第几行开始读取return EasyExcel.read(ins).head(clazz).sheet().headRowNumber(1).doReadSync();//第0行一般是表头,从第1行开始读取}

一些读取数据可能会碰到的小问题

1.在exlcel中有明明有数据,但是读取进来后对象属性全是空

有可能是使用了 注解 @Accessors(chain = true) 这个注解会和 EasyExcel 有冲突,导致数据无法读取进来,一些高版本好像已经修复了此BUG

2.在读取日期形式的数据时,可能会造成精度丢失 比如:


这样的 yyyy-MM-dd HH:mm:ss 数据读取进来后可能会 变成 yyyy-MM-dd HH:mm

也就是这样

这种情况可以在实体工具类中增加一个注解,来让EasyExcel 知道读取日期的格式

 @DateTimeFormat("yyyy-MM-dd HH:mm:ss")@ExcelProperty(value = "创建时间", index = 4)@ColumnWidth(value = 15)private String confirmDate;//创建时间

这样读取进来的日期就会正常了

3.在目前的 easyExcel 中有一些 BUG ,如果 excel 第一行没有内容,是不会触发 invokeHeadMap 的方法的
也就是说如果你传入的 excel 文件第一行没有内容,那么你写在 invokeHeadMap 方法中的表头验证方法是不会被触发的

目前有一个办法是在 invoke 中写一些代码进行判断 如下:

     private boolean isModel=true;@Overridepublic void invoke(Object o, AnalysisContext analysisContext) {//非正常表格式验证,第一行没数据if(isModel){throw new SystemException("请使用规定模板查询");}}@Overridepublic void invokeHeadMap(Map headMap, AnalysisContext context) {if(isModel){isModel=false;}..........//其他验证表头代码}

导出excel文件

向浏览器输出excel文件

public class ExcelUtils {/*** 像浏览器输出excel文件* @param response  HttpServletResponse* @param data  输出的数据* @param fileName 输出的文件名称 excel的名称* @param sheetName  输出的excel的sheet的名称 也就是页的名称* @param clazz  输出数据的模板*/public static void  writeExcel(HttpServletResponse response, List<? extends Object> data, String fileName, String sheetName, Class clazz){//表头样式WriteCellStyle headWriteCellStyle = new WriteCellStyle();//设置表头居中对齐headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);//内容样式WriteCellStyle contentWriteCellStyle = new WriteCellStyle();//设置内容靠左对齐contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);try {EasyExcel.write(getOutputStream(fileName, response), clazz).excelType(ExcelTypeEnum.XLSX).sheet(sheetName).registerWriteHandler(horizontalCellStyleStrategy).doWrite(data);} catch (Exception e) {throw new SystemException("输出excel文件失败", e);}}private static OutputStream getOutputStream(String fileName, HttpServletResponse response) throws Exception {fileName = URLEncoder.encode(fileName, "UTF-8");response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf8");response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");return response.getOutputStream();}
}
@GetMapping("/test/downloadExcel")
public static void test(){List<User> userList=new Arraylist<>();//省略添加数据代码try {ExcelUtil.writeExcel(response, userList, fileName, sheetName, UserExcel.class);} catch (Exception e) {e.printStackTrace();}
}

使用 EasyExcel 读取和下载 excel 文件相关推荐

  1. 01-使用EasyExcel读取和写入Excel文件

    一.EasyExcel介绍 Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内 ...

  2. vue中上传读取及下载excel文件

    准备工作 1.安装依赖包 npm install -S file-saver (-S用于生产环境) npm install -S xlsx npm install -D script-loader  ...

  3. 微信小程序云开发如何实现读取和下载excel文件导入数据到云数据库中?简单好理解

    一般我们在开发中会遇到通过excel文件一键导入数据的模板操作,我们在微信小程序中可以使用node-xlsx插件来解析excel文件的内容变成以json格式的数据返回. 在处理该操作的云函数中下载安装 ...

  4. tp5 读取/下载 excel文件内容

    tp5 读取/下载 excel文件内容 1.下载一个excel模板 导出函数 /*** 创建(导出)Excel数据表格* @param array $expTableData 要导出的数组格式的数据* ...

  5. 阿里开源(EasyExcel):使用Java将数据导出为Excel表格、带样式----》java web下载 Excel文件

    目录 一.技术选型 二.实现过程 1.导入依赖 2.编写工具类 EasyExcelUtil 3.公用参数类 EasyExcelParams 4.表格样式实体类 MyWriteHandler 5.数据实 ...

  6. SpringBoot项目使用EasyExcel读取上传Excel

    SpringBoot项目使用EasyExcel读取上传Excel 1.EasyExcel简介 EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持 ...

  7. Python读取多个excel文件(删除字段、数据格式转换、dataframe多表合并)并写入ElasticSearch实战(自动创建索引、写入ElasticSearch、探索性数据分析)

    Python读取多个excel文件(删除字段.数据格式转换.dataframe多表合并)并写入ElasticSearch实战(自动创建索引.写入ElasticSearch.探索性数据分析) 目录

  8. pandas读取多个excel文件并拼接(append)起来形成最终的dataframe、与标签文件连接(join)形成最终学习数据集

    pandas读取多个excel文件并拼接(append)起来形成统一的dataframe.与标签文件(label)连接(join)形成最终学习数据集 使用到的pandas核心方法有append和joi ...

  9. java中mypoiexception_Java中使用POI读取大的Excel文件或者输入流时发生out of memory异常参考解决方案...

    注意:此参考解决方案只是针对xlsx格式的excel文件! 背景 前一段时间遇到一种情况,服务器经常宕机,而且没有规律性,查看GC日志发生了out of memory,是堆溢出导致的,分析了一下堆的d ...

最新文章

  1. zabbix-web前端配置
  2. mysql memory leak_解决memory leak问题
  3. linux kill命令使用方法,Linux初学者的killall命令(8个例子)
  4. 教学5层网络体系结构——分层之后数据的发送和接收
  5. stat函数_使用Python的stat函数有效地获得所有者,组和其他权限
  6. 排列组合 vs 全排列与指数
  7. 主从reactor模式
  8. python生成器详解
  9. 施耐德 m340 编程手册_施耐德变频器学习之参数配置
  10. python battleship_Python 入门教程 12 ---- Battleship!-阿里云开发者社区
  11. C语言:L1-054 福到了 (15 分)
  12. easypoi导出多个Excel压缩zip下载
  13. 【Vue——basic】dom是什么
  14. 以太坊转账参数java_【ETH钱包开发04】web3j转账ERC-20 Token
  15. Errors occurred during the build. Errors running builder 'JavaScript Validator'
  16. 刷新页面,js实现文章浏览量自动更新
  17. Laravel+layui后台开发框架
  18. 蒲公英——APP内测分发平台
  19. 面向对象三大特性(多态)
  20. 四川省国家级自然保护区功能区划

热门文章

  1. 中点方法、改进欧拉及Heun方法
  2. for (String str : s){} 的理解
  3. 荒野求生获得服务器信息,荒野求生游戏问答老贝出海时任务编码 | 手游网游页游攻略大全...
  4. msysGit和TortoiseGit
  5. 如何获取SharePoint online(O365)的token
  6. VBA基础知识 提取超链接 批注转内容 工作簿内图片联动
  7. 【论文阅读】让数据库听懂人话(Text-to-SQL)
  8. matlab变步长龙格库塔法,matlab 龙格库塔法 变步长龙格库塔法
  9. 华为LiteOS操作系统基础知识入门与内核移植
  10. 计算机的硬件故障维修,计算机硬件故障维修的分类和技巧论文原稿