对象

// 如果没有特殊说明,下面的案例将默认使用这个实体类
public class DemoData {private String string;private Date date;private Double doubleData;// getting setting
}

监听器

// 如果没有特殊说明,下面的案例将默认使用这个监听器
public class DemoDataListener extends AnalysisEventListener<DemoData> {List<DemoData> list = new ArrayList<DemoData>();/*** 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来*/public DemoDataListener() {}/*** 这个每一条数据解析都会来调用** @param data* @param context*/@Overridepublic void invoke(DemoData data, AnalysisContext context) {System.out.println("解析到一条数据:{}", JSON.toJSONString(data));list.add(data);}/*** 所有数据解析完成了 都会来调用** @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println(JSON.toJSONString(list));}
}

代码

@Test
public void simpleRead() {// 写法1:String fileName = "demo.xlsx";// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();// 写法2:fileName = "demo.xlsx";ExcelReader excelReader = EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).build();ReadSheet readSheet = EasyExcel.readSheet(0).build();excelReader.read(readSheet);// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的excelReader.finish();
}

指定列的下标或名称

对象

public class DemoData {/*** 强制读取第三个 这里不建议 index 和 name 同时用,要么一个对象只用index,要么一个对象只用name去匹配*/@ExcelProperty(index = 2)private Double doubleData;/*** 用名字去匹配,这里需要注意,如果名字重复,会导致只有一个字段读取到数据*/@ExcelProperty("字符串标题")private String string;@ExcelProperty("日期标题")private Date date;
}

代码

@Test
public void indexOrNameRead() {String fileName = "demo.xlsx";// 这里默认读取第一个sheetEasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
}

读取多个sheet

代码

@Test
public void repeatedRead() {String fileName = "demo.xlsx";// 读取全部sheet// 这里需要注意 DemoDataListener的doAfterAllAnalysed 会在每个sheet读取完毕后调用一次。然后所有sheet都会往同一个DemoDataListener里面写EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).doReadAll();// 读取部分sheetfileName = "demo.xlsx";ExcelReader excelReader = EasyExcel.read(fileName).build();// 这里为了简单 所以注册了 同样的head 和Listener 自己使用功能必须不同的Listener// readSheet参数设置读取sheet的序号ReadSheet readSheet1 =EasyExcel.readSheet(0).head(DemoData.class).registerReadListener(new DemoDataListener()).build();ReadSheet readSheet2 =EasyExcel.readSheet(1).head(DemoData.class).registerReadListener(new DemoDataListener()).build();// 这里注意 一定要把sheet1 sheet2 一起传进去,不然有个问题就是03版的excel 会读取多次,浪费性能excelReader.read(readSheet1, readSheet2);// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的excelReader.finish();
}

自定义格式转换

对象

@Data
public class ConverterData {/*** converter属性定义自己的字符串转换器*/@ExcelProperty(converter = CustomStringConverter.class)private String string;/*** 这里用string 去接日期才能格式化*/@DateTimeFormat("yyyy年MM月dd日 HH时mm分ss秒")private String date;/*** 我想接收百分比的数字*/@NumberFormat("#.##%")private String doubleData;
}

自定义转换器

public class CustomStringStringConverter implements Converter<String> {@Overridepublic Class supportJavaTypeKey() {return String.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}/*** 这里读的时候会调用** @param cellData*            NotNull* @param contentProperty*            Nullable* @param globalConfiguration*            NotNull* @return*/@Overridepublic String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {return "自定义:" + cellData.getStringValue();}/*** 这里是写的时候会调用 不用管** @param value*            NotNull* @param contentProperty*            Nullable* @param globalConfiguration*            NotNull* @return*/@Overridepublic CellData convertToExcelData(String value, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {return new CellData(value);}}

代码

@Test
public void converterRead() {String fileName = "demo.xlsx";// 这里 需要指定读用哪个class去读,然后读取第一个sheet EasyExcel.read(fileName, ConverterData.class, new ConverterDataListener())// 这里注意 我们也可以registerConverter来指定自定义转换器, 但是这个转换变成全局了, 所有java为string,excel为string的都会用这个转换器。// 如果就想单个字段使用请使用@ExcelProperty 指定converter// .registerConverter(new CustomStringStringConverter())// 读取sheet.sheet().doRead();
}

多行头

代码

@Test
public void complexHeaderRead() {String fileName = "demo.xlsx";// 这里 需要指定读用哪个class去读,然后读取第一个sheet EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet()// 这里可以设置1,因为头就是一行。如果多行头,可以设置其他值。不传入默认1行.headRowNumber(1).doRead();
}

读取表头数据

监听器

/*** 这里会一行行的返回头* 监听器只需要重写这个方法就可以读取到头信息* @param headMap* @param context*/
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {LOGGER.info("解析到一条头数据:{}", JSON.toJSONString(headMap));
}

代码

@Test
public void headerRead() {String fileName = "demo.xlsx";// 这里 需要指定读用哪个class去读,然后读取第一个sheetEasyExcel.read(fileName, DemoData.class, new ReadDataListener()).sheet().doRead();
}

异常处理

监听器

/**
* 监听器实现这个方法就可以在读取数据的时候获取到异常信息
*/
@Override
public void onException(Exception exception, AnalysisContext context) {LOGGER.error("解析失败,但是继续解析下一行:{}", exception.getMessage());// 如果是某一个单元格的转换异常 能获取到具体行号// 如果要获取头的信息 配合invokeHeadMap使用if (exception instanceof ExcelDataConvertException) {ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;LOGGER.error("第{}行,第{}列解析异常", excelDataConvertException.getRowIndex(),excelDataConvertException.getColumnIndex());}
}

web读取

代码

@PostMapping("upload")
@ResponseBody
public String upload(MultipartFile file) throws IOException {EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();return "SUCCESS";
}

EasyExcel快速上手~读取相关推荐

  1. EasyExcel快速上手

    1.导入jar包 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel< ...

  2. cass读取dat文件_南方CASS教程+视频讲解+插件汇总,小白快速上手的测绘神器

    南方CASS教程+视频讲解+插件汇总,小白快速上手的测绘神器 自CASS软件推出以来,市场占有率遥遥领先,已经成为业内应用最广.使用最方便快捷的软件品牌.也是用户量最大.升级最快.服务最好的主流成图和 ...

  3. 『转载』Debussy快速上手(Verdi相似)

    『转载』Debussy快速上手(Verdi相似) Debussy 是NOVAS Software, Inc(思源科技)发展的HDL Debug & Analysis tool,这套软体主要不是 ...

  4. thinkcmf5调用指定分类的二级_Tengine快速上手系列教程amp;视频:基于Python API的图片分类应用入门丨附彩蛋...

    前言:近期,Tengine团队加班加点,好消息接踵而来,OpenCV 4.3.0发布,OPEN AI LAB AIoT智能开发平台Tengine与OpenCV合作共同加速边缘智能,Tengine再获业 ...

  5. Spark快速上手-WordCount案例

    在此之前,我已经用MapReduce 框架实现了WordCount案例,接下来,我开始学习数据处理的另外一个非常重要的方法:Spark.首先,使用WordCount案例实现Spark快速上手. 创建M ...

  6. python编程快速上手-----让繁琐工作自动化_每周一书《Python编程快速上手 让繁琐工作自动化》分享!...

    内容简介 如今,人们面临的大多数任务都可以通过编写计算机软件来完成.Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.通过Python编程,我们能够解决现实生活中的很多任务. 本书是 ...

  7. Forth Week :快速上手一门编程语言

    快速上手一门编程语言 概述 图灵完备性语言 识别类型 学习路径 一 掌握该语言的背景 - 2h 二 掌握该语言的基本程序逻辑语法 - 1h 1.顺序结构 2.分支结构 1)if语句 2)switch ...

  8. 如何快速上手mysql_如何快速上手数据库操作?

    原标题:如何快速上手数据库操作? 今天要介绍的这个python第三方库非常厉害,完美操作各种数据库. 名字叫records,在网上很少有这个库的相关资料,但是在开源社区可是很火热的哦. 如果这还不能打 ...

  9. 《Python游戏编程快速上手》第四章-讲笑话

    接着昨天的文章,今天实现<Python游戏编程快速上手>的第四章–讲笑话.这个小游戏的实现非常之简单.所以我就不说什么了,直接上代码 print("What do you get ...

最新文章

  1. 转载一个关于JavaScript几种继承方法的总结
  2. php %3c%3c%3c 解析常量,PHP基础知识小结1
  3. const 与 static readonly 的区别
  4. Hadoop平台作业参数设置关于mapreduce.job.split.metainfo.maxsize的说明
  5. Js选择器方法汇总之Salesforce常用
  6. 平台电商类的增长策略:从用户激励到养成类游戏
  7. 电气备自投笔记书籍介绍(持续更新中)
  8. SAP C4C Lead明细页面里Account字段的绑定路径
  9. no ip domain-lookup 什么意思
  10. python里面的正则表达式
  11. java程序设计教程(项目式)_《Java程序设计项目化教程(第2版)》怎么样_目录_pdf在线阅读 - 课课家教育...
  12. 判断回文(Java和JavaScript)
  13. 计算机组成原理中断实验的分析,计算机组成原理_中断实验.pdf
  14. DLL注入explorer.exe进程
  15. 传智播客python毕业_2018年传智播客黑马python人工智能15期
  16. 联想计算机 屏幕 无法进入,解决方案:联想笔记本如何进入BIOS?联想出现在计算机屏幕上。...
  17. 网站流量统计分析工具,谷歌seo网站流量统计分析工具推荐
  18. web前段设计之痛:手机浏览器和pc浏览器的width:100%的自适应问题
  19. 单进程子进程超时处理方法
  20. chrome、Firefox、IE浏览器和驱动下载地址

热门文章

  1. 用微前端的方式搭建类单页应用
  2. 【LeetCode】3月29日打卡-Day14-BFS
  3. NoSQL那些事--Redis
  4. [转载]sql server 分布式查询
  5. 分享三个非常适合新手的网站
  6. 水题 UVA 1586 - Ancient Cipher化学式分子量计算
  7. Swift - 数组排序方法(附样例)
  8. 002编程基础----makefile
  9. 在win8下安装使用java及在win8下部署java环境变量-图文
  10. 网络字节序 —— 主机字节序 (Socket编程) 转