文章目录

  • 写在前面
    • 1、maven依赖
    • 2、导入Excel文件
      • 2.1、读取表格文件
      • 2.2、如果有多个sheet表格
      • 2.3、监听器封装(也可不封装)
      • 2.4、读取数据格式化(实体类中添加注解)
    • 3、导出Excel文件
      • 3.1、导出表格格式(实体类中添加注解)
      • 3.2、添加表头样式
    • 4、注意事项
      • 4.1、实体类字段set方法,不能返回this
      • 4.2、EasyExcel 和 EasyExcelFactory 的区别
      • 4.3、HSSFWorkbook、XSSFWorkbook、Workbook

写在前面

EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。
github文档: https://github.com/alibaba/easyexcel

1、maven依赖

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.3</version>
</dependency>

2、导入Excel文件

常用如下两种读取方式

EasyExcel.read(文件名/文件流,数据实体类.class,监听器).sheet().doRead();
EasyExcel.read(文件名/文件流,数据实体类.class,监听器).build();

2.1、读取表格文件

实例1:
(这里假设已有实体类User)

public void test1() {EasyExcel.read("D:\\file\\1.xlsx", User.class, new AnalysisEventListener<User>() {// 每解析一行数据,该方法会被调用一次@Overridepublic void invoke(User user, AnalysisContext analysisContext) {System.out.println("解析数据为:" + user.toString());}// 全部解析完成被调用@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("解析完成...");// 保存到数据库}}).sheet().doRead();
}

实例2:spring项目中导入一个excel文件
(这里假设已有实体类User)

// springboot 接口
@PostMapping("/importUser")
public void importUser(@RequestParam("file") MultipartFile file) ExcelReader excelReader = EasyExcel.read(file.getInputStream(), User.class, new AnalysisEventListener<DemoData>() {@Overridepublic void invoke(User user, AnalysisContext analysisContext) {System.out.println("解析数据为:" + user.toString());}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("解析完成...");// 保存到数据库}}).build();ReadSheet sheet = EasyExcel.readSheet(0).build();    // 创建sheet对象,读取Excel的第一个sheet, 也可以根据sheet名称获取excelReader.read(sheet);                             // 读取sheet表格数据,可以读取多个sheetexcelReader.finish();                                // 这里必须手动关闭
}

2.2、如果有多个sheet表格

读取多个sheet表格

// 方式1
EasyExcel.read(...)
//         .sheet(0).doRead();.doReadAll(); // 读取全部sheet// 方式2
ExcelReader excelReader = EasyExcel.read(...) .build();
ReadSheet sheet = EasyExcel.readSheet(0).build();
//excelReader.read(sheet);
excelReader.readAll(); // 读所有sheet
excelReader.finish();// 读指定的多个sheet
ExcelReader excelReader = EasyExcel.read(...) .build();
ReadSheet sheet = EasyExcel.readSheet(0).build();
// 读取sheet,有几个就构建几个sheet进行读取
excelReader.read(sheet0);
excelReader.finish();

2.3、监听器封装(也可不封装)

每次调用 EasyExcel.read() 都需要 new 一个 AnalysisEventListener 对象,我们可以将AnalysisEventListener封装为一个对象,方便重复调用

public class EasyExcelUtils<T> {/*** 获取读取Excel的监听器对象* @param consumer 处理解析数据的函数, 一般可以是数据入库逻辑的函数* @param threshold 阈值,达到阈值就处理一次存储的数据* @param <T> 数据模型泛型* @return 返回监听器*/public static <T> AnalysisEventListener<T> getReadListener(Consumer<List<T>> consumer, int threshold) {return new AnalysisEventListener<T>() {// ArrayList 查询更快// List<T> dataList = new ArrayList<>(threshold);// LinkedList 插入和删除更快List<T> dataList = new LinkedList<>(); /*** 每解析一行调用, 订阅者1* @param data 解析的每行数据* @param context*/@Overridepublic void invoke(T data, AnalysisContext context) {dataList.add(data);// 达到阈值就处理一次存储的数据if (dataList.size() >= threshold) {consumer.accept(dataList);dataList.clear();}}/*** excel文件解析完成后,事件调度中心会通知到该方法, 订阅者2* @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 最后阈值外的数据做处理if (dataList.size() > 0) {consumer.accept(dataList);}}};}/*** 获取读取Excel的监听器对象, 不指定阈值, 默认阈值为 2000*/public static <T> AnalysisEventListener<T> getReadListener(Consumer<List<T>> consumer) {return getReadListener(consumer, 2000);}
}

使用示例

// 读取excel文件
public void test() {EasyExcel.read("user.xlsx", User.class,EasyExcelUtils.getReadListener(dataProcess())).doReadAll();
}// 处理数据
public Consumer<List<User>> dataProcess() {return users -> users.forEach(System.out::println);
}

2.4、读取数据格式化(实体类中添加注解)

在实体类中加入注解可以格式化数据,
与lombok结合使用。

@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class User {@ExcelProperty(value = "字符串标题", index = 0)private String name;@ExcelProperty(value = "日期标题", index = 1)@DateTimeFormat(value = "yyyy年MM月dd日 HH时mm分ss秒")  // 格式化日期类型数据private Date hireDate;@ExcelProperty(value = "数字标题", index = 2)@NumberFormat(value = "###.#")  // 格式化数字类型数据,保留一位小数,@NumberFormat不能用在Double类型中private String salary;
}

3、导出Excel文件

// 1、根据实体对象导出文件
EasyExcel.write(response.getOutputStream(), 实体.class).sheet().doWrite(list<实体>);// 2、根据List<List<String>>导出文件
EasyExcel.write(response.getOutputStream()).head(表头list对象).sheet().doWrite(数据list对象);// 3、根据模板文件
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(new ClassPathResource("模板.xlsx").getInputStream()).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
excelWriter.fill(list实体对象, writeSheet);  // 填充数据1
excelWriter.fill(map对象, writeSheet);       // 填充数据2
excelWriter.finish();                        // 关闭流

实例:spring项目中导出excel文件

@PostMapping("/getExcel")
public void getExcel(HttpServletResponse response) try{String fileName = "表格文件名.xlsx";List<数据实体类> data = new ArrayList<>();fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());response.addHeader("Content-Disposition", "attachment;filename=" + fileName);EasyExcelFactory.write(response.getOutputStream(), 数据实体类.class).sheet("这是一张表名").doWrite(data);response.getOutputStream().flush();}finally {response.getOutputStream().close();}
}

3.1、导出表格格式(实体类中添加注解)

在实体类中定义

@Data
@NoArgsConstructor
//@ContentRowHeight(50)//内容单元格高度
//@HeadRowHeight(50)//表头单元格高度
//@ColumnWidth(50)//单元格宽度
public class User {@ExcelProperty(value = {"导出台账","序号"})private Integer no;@ExcelProperty(value = {"导出台账","编号"})private  String  code;
}

3.2、添加表头样式

EasyExcelFactory.write(...).sheet("表名").registerWriteHandler(new 表头样式对象());

表头样式类型必须继承自CellWriteHandler

public class MyCellWriteHandler implements CellWriteHandler {...}

4、注意事项

4.1、实体类字段set方法,不能返回this

实体类字段set方法,不能返回this,否者读表格时,无法写入数据到实体类。
也意味着实体类不能添加链式相关注解,例如:lombok的@Accessors(chain = true)

4.2、EasyExcel 和 EasyExcelFactory 的区别

EasyExcel.read(…) 和 EasyExcelFactory.read(…) 有区别吗?
没区别。

下面是EasyExcel的源码

package com.alibaba.excel;public class EasyExcel extends EasyExcelFactory {public EasyExcel() {}
}

你没有看错,EasyExcel.java的源码就这么点

4.3、HSSFWorkbook、XSSFWorkbook、Workbook

Workbook 是 HSSFWorkbook、XSSFWorkbook的基类

HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls

XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx

EasyExcel 导入导出Excel文件相关推荐

  1. SpringBoot使用poi或EasyExcel导入导出Excel文件

    使用poi导入导出Excel 首先引入poi依赖包 03版本的Excel和07版本的Excel所需要的依赖不同,都需要导入. 记录问题: 最初导入的poi包为3.6版本.WorkBook类和Sheet ...

  2. 【转】 (C#)利用Aspose.Cells组件导入导出excel文件

    Aspose.Cells组件可以不依赖excel来导入导出excel文件: 导入: public static System.Data.DataTable ReadExcel(String strFi ...

  3. java导入导出excel文件

    前言:该文章使用java集成poi来操作excel文件,此处只对poi相关api进行代码编写,对于poi的理论性知识,可在学习完这篇文章后,自行百度学习.建议大家跟着文章敲一遍代码. 创建一个mave ...

  4. EOS中如何实现导入导出excel文件

    阅读原文 导入导出excel文件 场景描述 将数据库表中的数据按照定义的EXCEL模板进行导出,下载到本地: 将EXCEL中的数据导入数据库相应的表中. 场景目标 通过本场景,解决EXCEL的导入导出 ...

  5. 使用阿里开源的EasyExcel导入导出EXCEL——工具类

    工具类 package com.example.demo.util.excel;import com.alibaba.excel.EasyExcel; import com.alibaba.excel ...

  6. 批量导入/导出Excel文件(Python+Matlab)

    简单整理了下批量导入/导出Excel的Python和Matlab代码. Matlab 连续数字型.xlsx文件(如file_1.xlsx, file_2.xlsx, file_3.xlsx) clc, ...

  7. 导入导出excel文件

    场景描述 将数据库表中的数据按照定义的EXCEL模板进行导出,下载到本地: 将EXCEL中的数据导入数据库相应的表中. 场景目标 通过本场景,解决EXCEL的导入导出问题,供项目中学习使用. 页面效果 ...

  8. mediawiki 导入导出Excel文件

     导入导出Excel表格需要使用插件Data_Transfer Data Transfer is an extension to MediaWiki that allows users to bo ...

  9. EasyExcel组件导出Excel文件

    一.问题出现 最近需要实现Excel文件的导出,于是乎选择了EasyExcel组件来做这件事. 二.代码实现 ·1.依赖导入 <dependency><groupId>com. ...

最新文章

  1. 霍夫变换(初始学习)
  2. HDU 1384 Intervals【差分约束-SPFA】
  3. PIL模块与随机生成中文验证码
  4. 杭州计算机学校哪家好,杭州2021年哪所计算机学校比较好
  5. html 图片上放置按钮,用CSS在图片上再加一个小按钮
  6. 关于召开中国医药教育协会医学基因组学与生物信息学专业委员会成立大会暨临床全基因组外显子组家系数据分析培训会的通知...
  7. 【差分隐私组合定理,直方图,列联表代码实现】差分隐私代码实现系列(五)
  8. 【重难点】【Java基础 01】一致性哈希算法、sleep() 和wait() 的区别、强软弱虚引用
  9. Broken Keyboard(悲剧文本)
  10. win10系统安装jdk8全过程
  11. 北京圣思园经典Java培训教学视频分享
  12. java 打印字母塔_打印字母塔
  13. 视频画面怎么快速进行水平翻转?
  14. mac空格代表图标_最糟糕的图标代表功能
  15. 我们听过智商和情商,但你了解过财商吗?-民兴商学院
  16. 论文撰写格式-------Mathtype公式分章节自动编号及引用编号
  17. ElasticSearch之TermQuery和MatchQuery
  18. 一分钟搞懂 微调(fine-tuning)和prompt
  19. 如何学习很重要,很枯燥,很不擅长的知识
  20. 求大神帮忙看一下这张水卡校验码是什么分析一下算法谢谢!!!!

热门文章

  1. java代码实现证书生成客户端证书 实现ssl双向认证
  2. excel宏教程_利用Excel和Power BI,打造自己的BI数据模型
  3. 名片打印也可以私人订制 高附加值打印方案新选
  4. 用PYTHON控制电脑键盘鼠标源码
  5. 被学费劝退!这些专业的学费真的是太贵了!
  6. 中小企业建设数字化工厂,选择集成老路还是整体重构?
  7. matlab 常用希腊字母
  8. 江湖2 java_Java江湖之设计模式
  9. Excel VBA 笔记 第一次写代码-For循环 (Excel基础)
  10. ai边缘平滑_关于AI边缘运算,你应该知道这些!