在做业务时难免会遇到导出导入的需求:

有一说一,easyexcel确实是很easy

pom.xml 导入依赖

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

数据模型:

public class User {private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}

简单导出:

方法1:

    public String simpleExport() throws IOException {//文件地址名字String fileName = "D:\\study\\excel\\userExport.xlsx";//模拟数据List<User> userList = new ArrayList<>();for (int i = 0;i<=3;i++){User user = new User();user.setAge(i);user.setName(i+"号用户");userList.add(user);}File file = new File("D:\\study\\excel");if (!file.exists()){file.mkdirs();}//写出数据    指定数据模板 可以 .head(Class<?>)EasyExcel.write(fileName,User.class).sheet("用户信息").doWrite(userList);//随便写的返回值,根据实际情况来return "导出成功";}

输出效果:

方法2:

    public String simpleExport() throws IOException {//文件地址名字String fileName = "D:\\study\\excel\\userExport2.xlsx";//模拟数据List<User> userList = new ArrayList<>();for (int i = 0;i<=3;i++){User user = new User();user.setAge(i);user.setName(i+"号用户");userList.add(user);}//创建excelWriter对象、ExcelWriter excelWriter = EasyExcel.write(fileName, User.class).build();WriteSheet writeSheet = EasyExcel.writerSheet("用户信息").build();excelWriter.write(userList,writeSheet);//关流excelWriter.finish();return "导出成功";}

排除模型中的属性字段

指定字段不导出到excel中

其实就是在write之后加上excludeColumnFiledNames(...)

方法有多种:

    public String simpleExport() throws IOException {//文件地址名字String fileName = "D:\\study\\excel\\userExport2.xlsx";//模拟数据List<User> userList = new ArrayList<>();for (int i = 0;i<=3;i++){User user = new User();user.setAge(i);user.setName(i+"号用户");userList.add(user);}//使用一个set集合指定不导出的字段 也可以在模型上使用注解 @ExcelIgnoreSet<String> excludeField = new HashSet<>();excludeField.add("age");//创建excelWriter对象//两个位置加 .excludeColumnFiledName 都可以实现//ExcelWriter excelWriter = EasyExcel.write(fileName, User.class)//.excludeColumnFiledNames(excludeField).build();ExcelWriter excelWriter = EasyExcel.write(fileName, User.class).build();WriteSheet writeSheet = EasyExcel.writerSheet("用户信息").excludeColumnFiledNames(excludeField).build();excelWriter.write(userList,writeSheet);//关流excelWriter.finish();return "导出成功";}

这是较为简单的方法:

    public String simpleExport() throws IOException {//文件地址名字String fileName = "D:\\study\\excel\\userExport2.xlsx";//模拟数据List<User> userList = new ArrayList<>();for (int i = 0;i<=3;i++){User user = new User();user.setAge(i);user.setName(i+"号用户");userList.add(user);}//使用一个set集合指定不导出的字段 也可以在模型上使用注解 @ExcelIgnoreSet<String> excludeField = new HashSet<>();excludeField.add("age");EasyExcel.write(fileName,User.class).sheet("用户信息").head(User.class).excludeColumnFiledNames(excludeField).doWrite(userList);return "导出成功";}

效果:

向表格中导出指定属性

学会前面那个这个简直就不要太简单了,直接exclude改为include就可以了

 public String simpleExport() throws IOException {//文件地址名字String fileName = "D:\\study\\excel\\userExport2.xlsx";//模拟数据List<User> userList = new ArrayList<>();for (int i = 0;i<=3;i++){User user = new User();user.setAge(i);user.setName(i+"号用户");userList.add(user);}Set<String> includeFiled = new HashSet<>();includeFiled.add("age");EasyExcel.write(fileName,User.class).sheet("用户信息").head(User.class).includeColumnFiledNames(includeFiled).doWrite(userList);return "导出成功";}

这就只有age了

指定列名称和顺序

用@ExcelProperty注解对模型的字段进行操作

public class User {@ExcelProperty(value = "姓名",index = 0)private String name;@ExcelProperty(value = "年龄",index = 1)private Integer age;@ExcelProperty(value = "家庭地址",index = 2)private String address;@ExcelProperty(value = "联系电话",index = 3)private String phone;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}
}

效果:

复杂头数据导出

注解@ExcelProperty 的value属性是一个数组类型,遇到相同的值会自动合并

例如:

    @ExcelProperty(value = {"必填信息","姓名"},index = 0)private String name;@ExcelProperty(value = {"必填信息","年龄"},index = 1)private Integer age;@ExcelProperty(value = {"选填信息","家庭地址"},index = 2)private String address;@ExcelProperty(value = {"必填信息","联系电话"},index = 3)private String phone;

继续进行导出

        //文件地址名字String fileName = "D:\\study\\excel\\userExport2.xlsx";//模拟数据List<User> userList = new ArrayList<>();for (int i = 0;i<=3;i++){User user = new User();user.setAge(i);user.setName(i+"号用户");user.setAddress(i+"街"+i+"号楼");user.setPhone(i+i+"123132131");userList.add(user);}EasyExcel.write(fileName,User.class).sheet("用户信息").doWrite(userList);

结果:

也就是head合并单元格

重复向同一个sheet写入数据

        //文件地址名字String fileName = "D:\\study\\excel\\userExport4.xlsx";//模拟数据List<User> userList = new ArrayList<>();for (int i = 0;i<=3;i++){User user = new User();user.setAge(i);user.setName(i+"号用户");user.setAddress(i+"街"+i+"号楼");user.setPhone(i+i+"123132131");userList.add(user);}//创建ExcelWriter对象ExcelWriter excelWriter = EasyExcel.write(fileName, User.class).build();//创建writeSheet对象WriteSheet writeSheet = EasyExcel.writerSheet("用户信息").build();//向同一个sheet重复写入数据for (int i = 0;i<=2;i++){excelWriter.write(userList,writeSheet);}//关流excelWriter.finish();

结果

导出到不同的sheet中

冗余的代码就不多展示了

        //创建ExcelWriter对象ExcelWriter excelWriter = EasyExcel.write(fileName, User.class).build();for (int i = 0;i<=2;i++){//创建writeSheet对象WriteSheet writeSheet = EasyExcel.writerSheet("用户信息"+i).build();excelWriter.write(userList,writeSheet);}//关流excelWriter.finish();

日期/数字类型格式化

因为在excel表中经常会遇到数据格式的问题,所以需要对特定类型的数据进行格式化处理

基础两个注解

@DateTimeFormat 日期格式化

@NumberFormat 数字格式化(小数或百分数)

这是数据模型(实体类)的形式

    @ExcelProperty(value = {"必填信息","姓名"},index = 0)private String name;@ExcelProperty(value = {"必填信息","年龄"},index = 1)private Integer age;@ExcelProperty(value = {"选填信息","家庭地址"},index = 2)private String address;@ExcelProperty(value = {"选填信息","联系电话"},index = 3)private String phone;@NumberFormat(value = "###.#")//数字格式化,保留一位小数@ExcelProperty(value = "薪水",index = 4)private Double salary;@DateTimeFormat(value = "yyyy年MM月dd日 HH时mm分ss秒")//日期格式化@ExcelProperty(value = "入职日期",index = 5)private Date hiredate;
        //文件地址名字String fileName = "D:\\study\\excel\\userExport6.xlsx";//模拟数据List<User> userList = new ArrayList<>();for (int i = 0;i<=3;i++){User user = new User();user.setAge(i);user.setName(i+"号用户");user.setAddress(i+"街"+i+"号楼");user.setPhone(i+i+"123132131");user.setSalary(12121.12112);user.setHiredate(new Date());userList.add(user);}//创建ExcelWriter对象EasyExcel.write(fileName, User.class).sheet("用户信息").doWrite(userList);

图片导出,写入excel

数据模板:

@ContentRowHeight(value = 80)//内容行高
@ColumnWidth(value = 30)//列宽
public class ImageData {//使用抽象文件表示一个图片@ExcelProperty(value = "file类型")private File file;//使用输入流保存一个图片@ExcelProperty(value = "InputStream类型")private InputStream inputStream;//当使用String类型保存图片时需要使用一个StringImageConverter转换器@ExcelProperty(value = "str类型",converter = StringImageConverter.class)private String str;//使用二进制保存为一个图片@ExcelProperty(value = "二进制数据(字节)")private byte[] byteArr;@ExcelProperty(value = "网络图片")private URL url;public File getFile() {return file;}public void setFile(File file) {this.file = file;}public InputStream getInputStream() {return inputStream;}public void setInputStream(InputStream inputStream) {this.inputStream = inputStream;}public String getStr() {return str;}public void setStr(String str) {this.str = str;}public byte[] getByteArr() {return byteArr;}public void setByteArr(byte[] byteArr) {this.byteArr = byteArr;}public URL getUrl() {return url;}public void setUrl(URL url) {this.url = url;}
}

导出代码:

    @Testpublic void testFileExport() throws Exception{String fileName = "D:\\study\\excel\\testExcel6.xlsx";//图片位置 这里是自己本地的路径String imagePath = "C:\\Users\\admin\\Desktop\\products\\017beb7fcbd34b3fd374b138cbb9b9b9.gif";URL url = new URL("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwww.isanxia.com%2Fzb_users%2Fupload%2F2021%2F01%2F202101211611208459430553.jpg&refer=http%3A%2F%2Fwww.isanxia.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1657088291&t=648a0eca6c05232d947ff20cfcb76e4b");//将图片读取到二进制数据中byte[] bytes = new byte[(int)new File(imagePath).length()];InputStream inputStream = new FileInputStream(imagePath);inputStream.read(bytes,0,bytes.length);List<ImageData> imageDataList = new ArrayList<>();//创建数据模板ImageData imageData = new ImageData();imageData.setFile(new File(imagePath));//不能直接用上面的inputStreamimageData.setInputStream(new FileInputStream(imagePath));imageData.setStr(imagePath);imageData.setByteArr(bytes);imageData.setUrl(url);imageDataList.add(imageData);//写数据EasyExcel.write(fileName,ImageData.class).sheet("测试图片").doWrite(imageDataList);}

实现效果:

设置表格的行高列宽

@HeadRowHeight(value = 30) // 头部行高
@ContentRowHeight(value = 25) // 内容行高
@ColumnWidth(value = 20) // 列宽, 可以作用在类或字段上

这里太简单,省略了,直接把注解套在数据模板类上面就行了

使用注解控制表格样式

例如颜色,字体

@HeadRowHeight(value = 30)//头部行高
@ContentRowHeight(value = 25)//内容行高
@ColumnWidth(value = 20)//列宽
//头背景设置成红色 IndexedColors.RED.getIndex()
@HeadStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND,fillForegroundColor = 10 )
@HeadFontStyle(fontName = "宋体",fontHeightInPoints = 20)
//内容的背景颜色设置成绿色IndexedColors.GREEN.getIndex()
@ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND,fillForegroundColor = 17 )
// 内容字体设置成20, 字体默认宋体
@ContentFontStyle(fontName = "宋体", fontHeightInPoints = 20)
public class User {// 字符串的头背景设置成粉红 IndexedColors.PINK.getIndex()@HeadStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 14)// 字符串的头字体设置成20@HeadFontStyle(fontHeightInPoints = 30)// 字符串的内容背景设置成天蓝 IndexedColors.SKY_BLUE.getIndex()@ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 40)// 字符串的内容字体设置成20,默认宋体@ContentFontStyle(fontName = "宋体", fontHeightInPoints = 20)@ExcelProperty(value = {"必填信息","姓名"},index = 0)private String name;@ExcelProperty(value = {"必填信息","年龄"},index = 1)private Integer age;@ExcelProperty(value = {"选填信息","家庭地址"},index = 2)private String address;@ExcelProperty(value = {"选填信息","联系电话"},index = 3)private String phone;@NumberFormat(value = "###.#")//数字格式化,保留一位小数@ExcelProperty(value = "薪水",index = 4)private Double salary;@ColumnWidth(value = 50)//列宽@DateTimeFormat(value = "yyyy年MM月dd日 HH时mm分ss秒")//日期格式化@ExcelProperty(value = "入职日期",index = 5)private Date hiredate;public Double getSalary() {return salary;}public void setSalary(Double salary) {this.salary = salary;}public Date getHiredate() {return hiredate;}public void setHiredate(Date hiredate) {this.hiredate = hiredate;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}
}
        //文件地址名字String fileName = "D:\\study\\excel\\userExport7.xlsx";//模拟数据List<User> userList = new ArrayList<>();for (int i = 0;i<=3;i++){User user = new User();user.setAge(i);user.setName(i+"号用户");user.setAddress(i+"街"+i+"号楼");user.setPhone(i+i+"123132131");user.setSalary(12121.12112);user.setHiredate(new Date());userList.add(user);}//创建ExcelWriter对象EasyExcel.write(fileName, User.class).sheet("用户信息").doWrite(userList);

实现效果:

合并单元格

数据模板

@HeadRowHeight(value = 25) // 头部行高
@ContentRowHeight(value = 20) // 内容行高
@ColumnWidth(value = 20) // 列宽
/*** @OnceAbsoluteMerge 指定从哪一行/列开始,哪一行/列结束 进行单元格合并* firstRowIndex 起始行索引,从0开始* lastRowIndex 结束行索引* firstColumnIndex 起始列索引,从0开始* lastColumnIndex 结束列索引*/
@OnceAbsoluteMerge(firstRowIndex = 1,lastRowIndex = 2,firstColumnIndex = 0,lastColumnIndex = 0)
public class TestData {//每隔两行进行一次合并//@ContentLoopMerge(eachRow = 2)@ExcelProperty(value = "字符串标题")private String str;@ExcelProperty(value = "日期标题")private Date date;@ExcelProperty(value = "数字标题")private Double doubleData;public String getStr() {return str;}public void setStr(String str) {this.str = str;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}public Double getDoubleData() {return doubleData;}public void setDoubleData(Double doubleData) {this.doubleData = doubleData;}
}
    @Testpublic void testExport2(){String filename = "D:\\study\\excel\\单元格合并2.xlsx";// 构建数据List<TestData> dataList = new ArrayList<>();TestData testData = new TestData();testData.setDate(new Date());testData.setDoubleData(222.2222);testData.setStr("测试字符串");dataList.add(testData);// 向Excel中写入数据EasyExcel.write(filename, TestData.class).sheet("单元格合并测试").doWrite(dataList);}

实现效果:

EasyExcel简单使用学习相关推荐

  1. JQuery Datatables 服务端分页简单应用学习

    背景介绍 最近在一个简单小项目中碰到需要一个前端数据表格控件,在看了网上的资料后最终选择了JQuery Datatables.Datatables功能及其强大,基本满足我的所有需求,在加上其插件Edi ...

  2. keras构建卷积神经网络_通过此简单教程学习在网络上构建卷积神经网络

    keras构建卷积神经网络 by John David Chibuk 约翰·大卫·奇布克(John David Chibuk) 通过此简单教程学习在网络上构建卷积神经网络 (Learn to buil ...

  3. 《Java Web开发入门很简单》学习笔记

    <Java Web开发入门很简单>学习笔记 1123 第1章 了解Java Web开发领域 Java Web主要涉及技术包括:HTML.JavaScript.CSS.JSP.Servlet ...

  4. 服务器提交任务和直接运行,实现简单服务器学习多线程与Executor

    原标题:实现简单服务器学习多线程与Executor 实现简单的服务器 一个最简单的服务器实现如下图: 这是一个单线程的实现,也能满足基本的要求,但是如果请求多起来以后就会出现问题,由于同一时刻只能处理 ...

  5. excel简单操作学习记录1-2021/2/6

    excel简单操作学习记录1-b站office教程学习笔记 EXCEL 简单操作 1.3学习-简单功能操作 1.4学习-设置字体边框填充色 1.5学习-快速录入数据 1.6学习-快速录入数据-序列填充 ...

  6. CTF MISC图片隐写简单题学习思路总结(持续更新)

    系列文章目录 第一篇文章: CTF Crypto简单题学习思路总结(持续更新) 文章目录 系列文章目录 前言 一.JPG类隐写 1.1 JPG文件末尾添加字符串 1.2 JPG文件中添加字符串 1.3 ...

  7. python识别手写文字_Python3实现简单可学习的手写体识别(实例讲解)

    1.前言 版本:Python3.6.1 + PyQt5 + SQL Server 2012 以前一直觉得,机器学习.手写体识别这种程序都是很高大上很难的,直到偶然看到了这个视频,听了老师讲的思路后,瞬 ...

  8. 由浅入深的正则表达式教程,简单快速学习正则

    文章目录 前言 正则表达式是什么 字符串匹配方法 match() 字符串检查方法 test() 正则表达式语法 ^ 和 $ 的用法和区别详解 限定符 普通字符 特殊字符 元字符 运算符优先级 常用的正 ...

  9. 简单粗暴学习SPI 协议之CC2530

    简单粗暴学习SPI 协议之CC2530 一.定义 :SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总 ...

最新文章

  1. 《经济学人》万字长文:DeepMind和谷歌的AI拉锯战
  2. rust 关于ARM 板卡的使用
  3. Why to do,What to do,Where to do 与 Lambda表达式!
  4. a标签hidden属性_HTML5属性a标签ping被用于DDOS攻击,QQ浏览器被波及
  5. 坐标偏差大_控制点的坐标复核(二)
  6. 使用Docker Compose部署SpringBoot应用
  7. VSC VisioStudio Code 设置 鼠标滚轮缩放字体大小 滚轮控制字体放大缩小
  8. 世界500强面试题(情商部分)
  9. 使用CamlBuilder生成CAML查询语句
  10. 颜色代码表#FFFFFF #FF0000 #00FF00 #FF00FF (2015-07-21 10:39)转载
  11. 职场历练【管理学之三】
  12. 7-23 sdust-Java-学生成绩读取与排序 (10 分)
  13. 半年内连发6篇CNS!又一顶级学者全职回国,加盟浙大!
  14. 含含乐-口含烟真的能戒烟替烟?
  15. 温故而知新--Java基础(三):Java常用集合类(上)
  16. 如何在LibreOffice Writer文档中显示,隐藏和更改字段底纹的颜色
  17. 使用adblock屏蔽网页特定内容,例如微博推广
  18. 【Spring Boot学习】今天是我的生日,舍友催我去吃饭,我还是坚持写完了Spring Boot配置文件,祝自己生日快乐哈
  19. 2015年第六届蓝桥杯C/C++ B组试题 前八道
  20. 对MySql数据库插入数据操作

热门文章

  1. ZYNQ PS部分简介
  2. Python筛选某列满足条件的值(isin用法)
  3. 手欠,给DELL R720加硬盘
  4. 【软件工程】敏捷宣言
  5. 将带逗号的字符串转换为数组
  6. Filter过滤器介绍及使用
  7. Google MapReduce论文中文版
  8. linux平台的mmdetection安装
  9. self和parent的用法
  10. 7月第1周回顾:AMD英特尔四核战在即 华为3Com遭收购传言