如果你想和别人制造牵绊,就要承受流泪的风险。

我是目录

  • 简单介绍
  • 快速上手
    • 所需依赖
    • 所需实体类
    • 基本的写
    • 基本的读
    • web端的写入

简单介绍

在之前的excel系列博客 [点击进入] 中给大家带来了Apace POI对excel的操作,今天给大家带来顾名思义炒鸡简单的EasyExcel对excel的操作!!!

那么什么是EasyExcel呢?我们来到它的github地址:https://github.com/alibaba/easyexcel,发现:

或者我们来到它的官方文档:https://www.yuque.com/easyexcel/doc/easyexcel

再点击 关于EasyExcel :

我们就会发现:其实EasyExcel底层就是我们之前讲的Apache POI,但是又有着一些不同

至于更多精彩内容,大家可以自行通过以上我提供的EasyExcel的GitHub和文档地址去发掘。下面,我们就进入实战吧,让大家能够快速上手!!!

快速上手

所需依赖

     <!-- web的起步依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.2.0.RELEASE</version></dependency><!-- EasyExcel的依赖 --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version></dependency><!-- 测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency>

所需实体类

EasyExcel是直接基于实体类读写的,使用它提供的注解即可,再也不用像以前POI那样麻烦了:

package start.excel.entity;import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;import java.util.Date;@Data // 若未使用lombok插件,请自行生成getter、setter以及toString方法
public class DemoData {@ExcelProperty("字符串标题")private String string;@ExcelProperty("日期标题")private Date date;@ExcelProperty("数字标题")private Double doubleData;/*** 忽略这个字段*/@ExcelIgnoreprivate String ignore;
}

以下是EasyExcel官方给的注解解释:

基本的写

直接上代码,解释见注释:

package start.excel.easyexcel;import com.alibaba.excel.EasyExcel;
import org.junit.Test;
import start.excel.entity.DemoData;import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** @ClassName EasyExcelRead* @Description easyexcel本地生成文件演示* @Author 古阙月* @Date 2020/11/28 10:47* @Version 1.0*/
public class EasyExcelWrite {/*** 需要写入的文件路径*/private static final String PATH = "D:\\IdeaProjects\\my_study_demo\\src\\main\\java\\start\\excel\\easyexcel";/*** 数据部分 - 生成实体类集合* @return*/private List<DemoData> data() {List<DemoData> list = new ArrayList<DemoData>();for (int i = 0; i < 10; i++) {DemoData data = new DemoData();data.setString("字符串" + i);data.setDate(new Date());data.setDoubleData(0.56);list.add(data);}return list;}/*** 最简单的写*/@Testpublic void simpleWrite() {String fileName = PATH + File.separator + "demo.xlsx";String sheetName = "模板";/*** fileName - 文件名(包含路径)* DemoData.class - 实体类的反射对象* sheetName - 工作表的名称* data() - 数据部分(实体类集合)*/EasyExcel.write(fileName, DemoData.class).sheet(sheetName).doWrite(data());}
}

运行后到PATH的路径下找到名为demo.xlsx的excel文件查看:

写入成功!!!

基本的读

读入部分:

package start.excel.easyexcel;import com.alibaba.excel.EasyExcel;
import org.junit.Test;
import start.excel.entity.DemoData;import java.io.File;/*** @ClassName EasyExcelRead* @Description easyexcel读取示范* @Author 古阙月* @Date 2020/11/28 11:01* @Version 1.0*/
public class EasyExcelRead {/*** 读取的excel所在的路径*/private static final String PATH = "D:\\IdeaProjects\\my_study_demo\\src\\main\\java\\start\\excel\\easyexcel";/*** 最简单的读* 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去* 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭*/@Testpublic void simpleRead() {// 路径的文件名 - 即文件所在位置,通过它能找到这个文件String fileName = PATH + File.separator + "demo.xlsx";/*** fileName - 文件名(包含路径)* DemoData.class - 实体类的反射对象* new DemoDataListener() - 监听器* sheetName - 工作表的名称* data() - 数据部分(实体类集合)*/EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();}
}

在监听器里面拿到数据:

package start.excel.easyexcel;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import start.excel.entity.DemoData;import java.util.ArrayList;
import java.util.List;// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
public class DemoDataListener extends AnalysisEventListener<DemoData> {/*** 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收*/private static final int BATCH_COUNT = 6;List<DemoData> list = new ArrayList<DemoData>();/*** 这个每一条数据解析都会来调用* @param data* @param context*/@Overridepublic void invoke(DemoData data, AnalysisContext context) {System.out.println("解析到一条数据:" + JSON.toJSONString(data));list.add(data);// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (list.size() >= BATCH_COUNT) {// 存储完成清理 listlist.clear();}}/*** 所有数据解析完成了 都会来调用* @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println("最后一次解析了" + list.size() + "条数据!");System.out.println("所有数据解析完成!");}
}

运行得:

解析完成!这里在监听器DemoDataListener里面采取了分批处理数据,如我们现在总共有10条数据,我们选择一次解析6条,那么第2次还剩下4条数据也就是最后一次解析了4条数据。当然,如果我们想把数据存入数据库,在监听器DemoDataListener里面操作就好。

web端的写入

代码如下:

package start.excel.easyexcel;import com.alibaba.excel.EasyExcel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import start.excel.entity.DemoData;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** @ClassName EasyExcelWriteWeb* @Description Web中的写* @Author 古阙月* @Date 2020/12/8 21:38* @Version 1.0*/
@RestController
@RequestMapping("excel")
public class EasyExcelWriteWeb {/*** 数据部分 - 生成实体类集合* @return*/private List<DemoData> data() {List<DemoData> list = new ArrayList<DemoData>();for (int i = 0; i < 10; i++) {DemoData data = new DemoData();data.setString("字符串" + i);data.setDate(new Date());data.setDoubleData(0.56);list.add(data);}return list;}/*** excel文件下载(失败了会返回一个有部分数据的Excel)*/@GetMapping("download")public void download(HttpServletResponse response) throws IOException {// 使用swagger 会导致各种问题,请直接用浏览器或者用postmanresponse.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 文件名 - URLEncoder.encode可以防止中文乱码String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");// 工作表名称String sheetName = "测试";/*** DemoData.class  - 创建excel对应的实体对象* sheetName - 工作表名称* data() - 数据部分*/EasyExcel.write(response.getOutputStream(), DemoData.class).sheet(sheetName).doWrite(data());}
}

本地启动SpringBoot应用程序,因为没有在配置文件application.yml中配置端口,所以端口默认为8080

在浏览器输入:http://localhost:8080/excel/download:

点开左下角的excel文件:

完美!!!

【EasyExcel】Excel操作(九):Excel读取写入一条龙相关推荐

  1. 计算机excel操作教程,Excel操作教程 -电脑资料

    Excel是一个全能的电子表格,它功能强大.操作方面,除了可以快速地生成.格式化各种表格外,还可以对表格中的数据完成很多数据库的功能,本人在使用Excel过程中,学到了一些非常实用的技巧,相信掌握这些 ...

  2. vb.net 教程 10-2 Excel操作1 Excel文件的打开

    版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的. 为了便于理解Excel操作,我做了一个示意图 1.打开Excel,相当于新建了一个Applica ...

  3. C#实战007:Excel操作-创建Excel并保存

    这是通过Excel组件进行Excel文件创建并保存的方法,注释都写在程序中了. using System; using System.Collections.Generic; using System ...

  4. Python Excel操作模块XlsxWriter之写入数组公式worksheet.write_array_formula()

    worksheet.write_array_formula() write_array_formula(first_row, first_col, last_row, last_col, formul ...

  5. python在excel中写入公式_Python Excel操作模块XlsxWriter之写入公式write_formula()

    worksheet.write_formula() write_formula(row, col, formula[, cell_formula[, value]]) 向工作表单元格写入公式. 参数: ...

  6. Python Excel操作模块XlsxWriter之写入worksheet.write()

    worksheet.write() wirte(row, col, *args) 向工作表单元格写入普通的数据. 参数: row - 单元格所在的行(索引从0开始计数) col - 单元格所在的列(索 ...

  7. C#实战011:Excel操作-获取Excel某一列数据并存入数组

    操作Excel中的数据才是操作Excel的意义所在,不然前面忙活那么久就就没任何意义了,同样直接附上代码: using System; using System.Collections.Generic ...

  8. vb.net 教程 10-2 Excel操作2 Excel文件的保存

    版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的. 如果是一般的打开某个Excel文件修改后保存到原文件或者新的文件,在 Excel.Applica ...

  9. C#实战012:Excel操作-获取Excel某一行数据并存入数组

    前面获取了Excel某一列数据并存入数组,接着我们继续获取Excel某一行数据并存入数组,方法基本一致,就一点小小的改动,以下是完整的代码: using System; using System.Co ...

最新文章

  1. 征战蓝桥 —— 2016年第七届 —— C/C++A组第5题——消除尾一
  2. nginx系列之六:cache服务
  3. 【转】刨根究底字符编码之十三——UTF-16编码方式
  4. Java发送GET/POST请求
  5. 力荐50个最实用的免费机器学习数据集
  6. PyTorch 入坑七:模块与nn.Module学习
  7. python之django中models学习总结
  8. Android,iOS打开手机QQ与指定用户聊天界面
  9. C语言程序设计(第三版)何钦铭著 习题4-10
  10. 海康威视录像机(DS-8632N-E8)开机卡LOGO
  11. Java IO(文件流)
  12. MIPI学习--CSI2
  13. 数字系统设计中形式验证
  14. win7的计算机策略组,win7组策略如何打开以及如何禁用组策略
  15. 安装linux系统四个企鹅,red hat linux as4下安装小企鹅输入法(fcitx)_转
  16. win10任务栏卡死重启也没用
  17. win10如何合并硬盘分区
  18. Docker service命令详解
  19. 数据库中文mybatis连接mysql数据库插入中文乱码
  20. npm install 安装包报错npm ERR! C:\Users\happl\AppData\Roaming\npm-cache_logs\2019-12-09T15_55_28_112Z-deb

热门文章

  1. 英尺和米之间的转换 Exercise06_09
  2. minicap的安装
  3. 不要在条件判断中执行复杂的语句
  4. 阿里如何实现海量数据实时分析技术-AnalyticDB
  5. 薪酬模块常用文件资料 (参考案例)
  6. 月薪10k,20k,40k的Java工程师,差别到底在哪?
  7. Python如何实现一步一步查看程序之代码调试-B04
  8. 一只程序猿很黄很暴力的日记
  9. 今日科技联播:外星语言专家,已经开始讨论与外星人交流会面临的挑战?!...
  10. Mac迅雷瘦身精简教程