Java Excel框架
简单、快速的导入导出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框架相关推荐
- Java Excel(jxl)学习笔记
概述 Java Excel API是成熟的开源Java API,使开发人员可以动态读取,写入和修改Excel电子表格. 一些功能 从Excel 95.97.2000,XP和2003工作簿中读取数据 ...
- POI和Java Excel Api导入导出----详细到你不敢相信
来自:http://blog.csdn.net/jerehedu/article/details/45195359 一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要 ...
- 常用的Java Web框架简介
Web框架是人们在使用某种语言编写Web应用服务端时关于架构的最佳实践. 有些Web框架是从实际的Web项目抽取出来的,也就是说,做一个具体的应用项目时,采取的架构比较理想,就把这部分和领域无关,而仅 ...
- java其他框架杂记
工作流框架 activiti与flowable的区别 - 分享牛 - CSDN博客 字节码 JVM Class字节码之三-使用BCEL改变类属性 - GarfieldEr007的专栏 - CSDN博客 ...
- 各种java开源框架笔记
开源配置中心 spring-cloud/spring-cloud-config https://github.com/spring-cloud/spring-cloud-config spring出品 ...
- Apache POI和JXL(Java Excel)的基本使用——操作excel
一.简介 开发中经常会涉及到excel的处理,如导出Excel,导入Excel到数据库中,操作Excel目前有两个框架,一个是apache 的poi, 另一个是 Java Excel Apache P ...
- Java集合框架综述,这篇让你吃透!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:平凡希 cnblogs.com/xiaoxi/p/60899 ...
- 【Java集合框架】ArrayList类方法简明解析(举例说明)
本文目录 1.API与Java集合框架 2.ArrayList类方法解析 2.1 add() 2.2 addAll() 2.3 clear() 2.4 clone() 2.5 contains() 2 ...
- sqlite java excel,Android将Excel表数据导入SQLite数据库
前两天接了个私活,需求方给了一个Excel表格,需要使用到里面的7000+条数据进行查询,最开始以为7000条一条条加入数据库也还好,以下是其中一部分数据: 但当我添加了20多条的时候突然发现这样的方 ...
最新文章
- PyTorch迎来5岁生日,创始人带领大一实习生开发:没想到会这么成功
- 帝国cms清除html标签,帝国CMS结合项筛选带已选择的条件和删除操作的方法
- 重新理解@Resource注解
- 堪称艺术品级的应用开发框架,Abp有望超越Spring?
- angular学习的一些小笔记(中)之表单验证
- qq登录界面句柄_别小看QQ邮箱测试,80%的测试新手都不能写出完整的测试用例~...
- redis中使用redis-dump导出、导入、还原数据实例
- 图解!24 张图彻底弄懂九大常见数据结构!
- Cython 的学习
- ps -ef|grep htpd|wd -l
- Redhat7.2下编译rpm包的形式安装openvswitch
- CCS7.3 安装使用教程
- python实战-网站扫码登录流程全解析
- Eoapi — 一个可拓展的开源 API 工具
- qtcpsocket断开_关于QSocket的释放的一个需要注意的情况(必须先断开连接)
- 如何查看当前分支从哪个支线创建而来
- ios视频循环播放实现
- hackme pwn onepunch
- 【nacos】springboot @Value @NacosValue 使用时可能无效
- 移植Opencv到arm tq2440