简单、快速的导入导出Excel

一、安装依赖

推荐使用最新版本,可通过文章末尾官方文档链接跳转查看

<dependency><groupId>cn.gjing</groupId><artifactId>tools-excel</artifactId><version>2021.12.3</version>
</dependency>

二、Excel导出

1、单表头

定义Excel映射实体, @Data是lombok的注解

/*** @author Gjing**/
@Data
@Excel("单级表头")
public class SingleHead {@ExcelField("姓名")private String userName;@ExcelField(value = "年龄", format = "0")private Integer userAge;@ExcelField("性别")private Gender gender;@ExcelField("爱好")private String favorite;
}
/*** @author Gjing**/
@RestController
public class UserController {@GetMapping("/test_export")@ApiOperation("导出一级表头")public void testExport(HttpServletResponse response) {//指定映射的实体为刚刚定义的ExcelFactory.createWriter(SingleHead.class, response).write(null).flush();}
}

2、多级表头

数组中的每个值代表着一级表头

/*** @author Gjing**/
@Data
@Excel("多级表头")
public class MultiHead {@ExcelField({"用户名","用户名"})private String userName;@ExcelField({"年龄","年龄"})private Integer age;@ExcelField({"形态","身高"})private BigDecimal height;@ExcelField({"形态","体重"})private BigDecimal weight;
}
/*** @author Gjing**/
@RestController
public class TestController {@GetMapping("/test_export")@ApiOperation("多级表头")public void testExport(HttpServletResponse response) {ExcelFactory.createWriter(MultiHead.class, response)//需要在write前激活多级表头,否则不会自动合并.multiHead(true).write(null).flush();}
}

3、带大标题

大标题的起始行是你要插入的sheet中最后一条数据的下一行,如果sheet中没有数据,就是第一行。你可以配置大标题占用的行数和起始单元格下标(默认第一个单元格)和结束单元格下标(默认跟随表头的数量)

/*** @author Gjing**/
@RestController
public class TestController {@GetMapping("/test")@ApiOperation("含大标题")public void testExport(HttpServletResponse response) {ExcelFactory.createWriter(SingleHead.class, response)//大标题占用两行.writeTitle(new BigTitle("我是大标题")).write(null).flush();}
}

4、下拉框

单元格增加下拉框

  • 注解方式
/*** @author Gjing**/
@Data
@Excel("下拉框导出")
public class SingleHead {@ExcelField("性别")@ExcelDropdownBox(combobox = {"男", "女"})private Gender gender;@ExcelField("爱好")private String favorite;
}
/*** @author Gjing**/
@RestController
public class TestController {@GetMapping("/test_export")@ApiOperation("带下拉框")public void testExport(HttpServletResponse response) {ExcelFactory.createWriter(SingleHead.class, response)//需要在write前激活校验.valid(true).write(null).flush();}
}
  • 通过方法设置普通下拉框的选项
/*** @author Gjing**/
@RestController
public class TestController {@GetMapping("/test_export")@ApiOperation("带下拉框")public void testExport(HttpServletResponse response) {Map<String, String[]> genderMap = new HashMap<>(8);//key为实体类的字段名,使用方法进行设置时,实体字段的@ExcelDropdownBox注解不在需要指定combobox//如果指定了也会去覆盖注解中的值genderMap.put("gender", new String[]{"男", "女"});ExcelFactory.createWriter(SingleHead.class, response).valid(true).write(null, genderMap).flush();}
}

5、时间校验

导出时给列表头下方的单元格增加时间校验

/*** @author Gjing**/
@Data
@Excel
public class SingleHead {@ExcelField("姓名")private String userName;@ExcelField(value = "年龄", format = "0")private Integer userAge;@ExcelField(value = "生日", format = "yyyy-MM-dd")@ExcelDateValid(expr1 = "2000-01-01", operatorType = LESS_OR_EQUAL, errorContent = "出生日期不能超过2000年")private Date birthday;
}
/*** @author Gjing**/
@RestController
public class TestController {@GetMapping("/test_export")@ApiOperation("带时间校验")public void testExport(HttpServletResponse response) {ExcelFactory.createWriter(SingleHead.class, response)//需要在write前激活校验.valid(true).write(null).flush();}
}

6、数字、文本校验

导出时给列表头下方的单元格增加数值校验。可以对数字的大小,文本的长度进行校验

/*** @author Gjing**/
@Data
@Excel
public class SingleHead {@ExcelField("姓名")//对输入的名称字数进行校验,字数限制小于4@ExcelNumericValid(validType = TEXT_LENGTH,operatorType = LESS_THAN,expr1 = "4",errorContent = "姓名字数小于4")private String userName;
}
/*** @author Gjing**/
@RestController
public class TestController {@GetMapping("/test_export")@ApiOperation("带数值校验")public void testExport(HttpServletResponse response) {ExcelFactory.createWriter(SingleHead .class, response)//需要在write前激活校验.valid(true).write(null).flush();}
}

7、数据转换

导出时对数据进行加工或者添加默认值,支持注解方式和接口方式

  • 注解方式
/*** @author Gjing**/
@Data
@Excel
public class SingleHead {@ExcelField("姓名")private String userName;@ExcelField(value = "年龄", format = "0")//对每个人的年龄乘以10@ExcelDataConvert(expr1 = "#userAge * 10")private Integer userAge;
}
  • 接口方式
/*** @author Gjing**/
public class MyDataConvert implements DataConvert<SingleHead> {@Overridepublic Object toEntityAttribute(Object o, Field field) {return null;}@Overridepublic Object toExcelAttribute(SingleHead singleHead, Object value, Field field) {return (int) value * 10;}
}

实现接口后需要在你需要转换的字段上指定转换器

/*** @author Gjing**/
@Data
@Excel
public class SingleHead {@ExcelField("姓名")private String userName;@ExcelField(value = "年龄", format = "0", convert = MyDataConvert.class)private Integer userAge;
}

导出方法调用最后一定要使用flush()方法进行数据刷新到Excel文件中

三、导入

导入的实体类皆采用导出的实体类

1、单表头

/*** @author Gjing**/
@RestController
public class TestController {@Resourceprivate UserService userService;@PostMapping("/user_import")@ApiOperation("导入单表头")public void userImport(MultipartFile file) throws IOException {ExcelFactory.createReader(file, SingleHead.class)//在read()方法前通过订阅方法增加一个结果监听器,该监听器会在每一次read()结束之后触发.subscribe(e -> this.userService.saveUsers(e)).read().finish();}
}

2、多级表头

前文有提到多级表头时,最后一级为实际表头,所以要在导入时指定实际表头开始下标,由于导出的模板映射实体设置两级表头,因此这里的实际表头为下标为1(Excel行和列下标都是默认0开始的)

/*** @author Gjing**/
@RestController
public class TestController {@Resourceprivate UserService userService;@PostMapping("/user_import")@ApiOperation("导入单表头")public void userImport(MultipartFile file) throws IOException {ExcelFactory.createReader(file, SingleHead.class)//在read()方法前通过订阅方法增加一个结果监听器,该监听器会在每一次read()结束之后触发//如果Excel中数据量太大,不建议使用结果监听器,会造成生成了过多的映射实体对象造成内存溢出.subscribe(e -> this.userService.saveUsers(e)).read(1).finish();}
}

在导入调用结束后,一定要在最后调用finish()方法对流进行关闭


Demo地址:excel-demo
注解参数说明与更多用法可查看:官方文档

Java Excel框架相关推荐

  1. Java Excel(jxl)学习笔记

    概述 ​ Java Excel API是成熟的开源Java API,使开发人员可以动态读取,写入和修改Excel电子表格. 一些功能 从Excel 95.97.2000,XP和2003工作簿中读取数据 ...

  2. POI和Java Excel Api导入导出----详细到你不敢相信

    来自:http://blog.csdn.net/jerehedu/article/details/45195359 一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要 ...

  3. 常用的Java Web框架简介

    Web框架是人们在使用某种语言编写Web应用服务端时关于架构的最佳实践. 有些Web框架是从实际的Web项目抽取出来的,也就是说,做一个具体的应用项目时,采取的架构比较理想,就把这部分和领域无关,而仅 ...

  4. java其他框架杂记

    工作流框架 activiti与flowable的区别 - 分享牛 - CSDN博客 字节码 JVM Class字节码之三-使用BCEL改变类属性 - GarfieldEr007的专栏 - CSDN博客 ...

  5. 各种java开源框架笔记

    开源配置中心 spring-cloud/spring-cloud-config https://github.com/spring-cloud/spring-cloud-config spring出品 ...

  6. Apache POI和JXL(Java Excel)的基本使用——操作excel

    一.简介 开发中经常会涉及到excel的处理,如导出Excel,导入Excel到数据库中,操作Excel目前有两个框架,一个是apache 的poi, 另一个是 Java Excel Apache P ...

  7. Java集合框架综述,这篇让你吃透!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:平凡希 cnblogs.com/xiaoxi/p/60899 ...

  8. 【Java集合框架】ArrayList类方法简明解析(举例说明)

    本文目录 1.API与Java集合框架 2.ArrayList类方法解析 2.1 add() 2.2 addAll() 2.3 clear() 2.4 clone() 2.5 contains() 2 ...

  9. sqlite java excel,Android将Excel表数据导入SQLite数据库

    前两天接了个私活,需求方给了一个Excel表格,需要使用到里面的7000+条数据进行查询,最开始以为7000条一条条加入数据库也还好,以下是其中一部分数据: 但当我添加了20多条的时候突然发现这样的方 ...

最新文章

  1. PyTorch迎来5岁生日,创始人带领大一实习生开发:没想到会这么成功
  2. 帝国cms清除html标签,帝国CMS结合项筛选带已选择的条件和删除操作的方法
  3. 重新理解@Resource注解
  4. 堪称艺术品级的应用开发框架,Abp有望超越Spring?
  5. angular学习的一些小笔记(中)之表单验证
  6. qq登录界面句柄_别小看QQ邮箱测试,80%的测试新手都不能写出完整的测试用例~...
  7. redis中使用redis-dump导出、导入、还原数据实例
  8. 图解!24 张图彻底弄懂九大常见数据结构!
  9. Cython 的学习
  10. ps -ef|grep htpd|wd -l
  11. Redhat7.2下编译rpm包的形式安装openvswitch
  12. CCS7.3 安装使用教程
  13. python实战-网站扫码登录流程全解析
  14. Eoapi — 一个可拓展的开源 API 工具
  15. qtcpsocket断开_关于QSocket的释放的一个需要注意的情况(必须先断开连接)
  16. 如何查看当前分支从哪个支线创建而来
  17. ios视频循环播放实现
  18. hackme pwn onepunch
  19. 【nacos】springboot @Value @NacosValue 使用时可能无效
  20. 移植Opencv到arm tq2440

热门文章

  1. xpath爬取我爱我家杭州地区租房网
  2. 四、移动手机自动化测试
  3. C# Async/Await原理剖析
  4. 【Unity】射线检测
  5. Java中的远程过程调用(RPC)
  6. “无任何网络提供程序接受指定的网络路径” 错误的几种解决方案
  7. 礼帽和黑帽及opencv实现
  8. Excel2007使用SQL语句
  9. 计算机网站毕业设计范文,计算机个人网站毕业设计论文(范文).doc
  10. 抗渗等级p6是什么意思_砼抗渗等级S6和P6有何区别