EasyExcel简单使用学习
在做业务时难免会遇到导出导入的需求:
有一说一,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简单使用学习相关推荐
- JQuery Datatables 服务端分页简单应用学习
背景介绍 最近在一个简单小项目中碰到需要一个前端数据表格控件,在看了网上的资料后最终选择了JQuery Datatables.Datatables功能及其强大,基本满足我的所有需求,在加上其插件Edi ...
- keras构建卷积神经网络_通过此简单教程学习在网络上构建卷积神经网络
keras构建卷积神经网络 by John David Chibuk 约翰·大卫·奇布克(John David Chibuk) 通过此简单教程学习在网络上构建卷积神经网络 (Learn to buil ...
- 《Java Web开发入门很简单》学习笔记
<Java Web开发入门很简单>学习笔记 1123 第1章 了解Java Web开发领域 Java Web主要涉及技术包括:HTML.JavaScript.CSS.JSP.Servlet ...
- 服务器提交任务和直接运行,实现简单服务器学习多线程与Executor
原标题:实现简单服务器学习多线程与Executor 实现简单的服务器 一个最简单的服务器实现如下图: 这是一个单线程的实现,也能满足基本的要求,但是如果请求多起来以后就会出现问题,由于同一时刻只能处理 ...
- excel简单操作学习记录1-2021/2/6
excel简单操作学习记录1-b站office教程学习笔记 EXCEL 简单操作 1.3学习-简单功能操作 1.4学习-设置字体边框填充色 1.5学习-快速录入数据 1.6学习-快速录入数据-序列填充 ...
- CTF MISC图片隐写简单题学习思路总结(持续更新)
系列文章目录 第一篇文章: CTF Crypto简单题学习思路总结(持续更新) 文章目录 系列文章目录 前言 一.JPG类隐写 1.1 JPG文件末尾添加字符串 1.2 JPG文件中添加字符串 1.3 ...
- python识别手写文字_Python3实现简单可学习的手写体识别(实例讲解)
1.前言 版本:Python3.6.1 + PyQt5 + SQL Server 2012 以前一直觉得,机器学习.手写体识别这种程序都是很高大上很难的,直到偶然看到了这个视频,听了老师讲的思路后,瞬 ...
- 由浅入深的正则表达式教程,简单快速学习正则
文章目录 前言 正则表达式是什么 字符串匹配方法 match() 字符串检查方法 test() 正则表达式语法 ^ 和 $ 的用法和区别详解 限定符 普通字符 特殊字符 元字符 运算符优先级 常用的正 ...
- 简单粗暴学习SPI 协议之CC2530
简单粗暴学习SPI 协议之CC2530 一.定义 :SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总 ...
最新文章
- 《经济学人》万字长文:DeepMind和谷歌的AI拉锯战
- rust 关于ARM 板卡的使用
- Why to do,What to do,Where to do 与 Lambda表达式!
- a标签hidden属性_HTML5属性a标签ping被用于DDOS攻击,QQ浏览器被波及
- 坐标偏差大_控制点的坐标复核(二)
- 使用Docker Compose部署SpringBoot应用
- VSC VisioStudio Code 设置 鼠标滚轮缩放字体大小 滚轮控制字体放大缩小
- 世界500强面试题(情商部分)
- 使用CamlBuilder生成CAML查询语句
- 颜色代码表#FFFFFF #FF0000 #00FF00 #FF00FF (2015-07-21 10:39)转载
- 职场历练【管理学之三】
- 7-23 sdust-Java-学生成绩读取与排序 (10 分)
- 半年内连发6篇CNS!又一顶级学者全职回国,加盟浙大!
- 含含乐-口含烟真的能戒烟替烟?
- 温故而知新--Java基础(三):Java常用集合类(上)
- 如何在LibreOffice Writer文档中显示,隐藏和更改字段底纹的颜色
- 使用adblock屏蔽网页特定内容,例如微博推广
- 【Spring Boot学习】今天是我的生日,舍友催我去吃饭,我还是坚持写完了Spring Boot配置文件,祝自己生日快乐哈
- 2015年第六届蓝桥杯C/C++ B组试题 前八道
- 对MySql数据库插入数据操作