导入导出这么丝滑,你用的是EasyPoi吧!

December 17, 2023
测试
测试
测试
测试
32 分钟阅读

丝滑的 EasyPoi

POI:用来处理 Excel、Word 等文件的技术。EasyPoi:让没有接触过 POI 的人也能方便的写出 Excel 的导入导出功能。说白了就是用了 EasyPoi,文件的导入导出变得 so easy! 官网地址:http://easypoi.mydoc.io/ 1. SpringBoot整合EasyPoi 引入依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--easy-poi--> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-web</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-annotation</artifactId> <version>4.0.0</version> </dependency> 2. 相关注解 2.1 @ExcelTarget 作用在实体类上,表明这是一个可以用 EasyPoi 操作导入导出的实体类 常用属性:

  • value:唯一标识,不能重复。但是可以省略不写,例如 "user"

使用方法: @ExcelTarget("user") public class User implements Serializable { } 2.2 @Excel 作用在实体类中的属性上面,表明这是 Excel 中的一列。 常用属性:

  • name:Excel表中的列名,例如 name="姓名"
  • orderNum:Excel表中列的排列顺序,例如 orderNum="1"
  • type:导出类型,1 文本,2 图片,3 函数,10 数字,默认是文本
  • width:列的宽度
  • height:列的高度
  • savePath:图片的保存位置
  • exportformat:Excel 导出的时间格式,例如 exportformat="yyyy-MM-dd HH:mm:ss"
  • importFormat:Excel 导入的时间格式
  • format:同时设置导入导出的时间格式
  • isStatistics:是否合计该列?默认 false
  • needMerge:是否纵向合并单元格,默认false
  • replace:替换值,例如 replace = {"女_0", "男_1"},表示如果值为 1,则导出 ‘男’,如果值为 0,则导出 ‘女’。

使用方法: @ExcelTarget("user") public class User implements Serializable { @Excel(name = "姓名", width = 30, orderNum = "1") private String name; @Excel(name = "年龄", width = 10, orderNum = "2",isSta tistics = true) private Integer age; @Excel(name = "性别", width = 10, orderNum = "3", repl ace = {"女_0", "男_1"}) private Integer sex; @Excel(name = "生日", width = 30, orderNum = "4", form at = "yyyy-MM-dd HH:mm:ss") private Date birthday; @Excel(name = "头像信息", type = 2, width = 20,height = 30,savePath = "D:\\WorkSpace\\easy-poi\\src\\main\\resources") private String head; } 2.3 @ExcelEntity 作用在实体类中的类上面,表明这是导出的类中的类。 常用属性:

  • name:唯一标识,不能重复。

使用方法: @ExcelTarget("user") public class User implements Serializable { @ExcelEntity(name = "address") private Address address; } @ExcelTarget("address") public class Address implements Serializable { @Excel(name = "省", width = 30, orderNum = "6") private String province; @Excel(name = "市", width = 30, orderNum = "7") private String city; @Excel(name = "县", width = 30, orderNum = "8") private String county; } 2.4 @ExcelCollection 表明这是一个集合,一对多的关系 常用属性:

  • name:集合名,唯一标识
  • orderNum:Excel 表中列的排列顺序

使用方法: @ExcelTarget("user") public class User implements Serializable { @ExcelCollection(name = "购买的水果", orderNum = "9") private List<Fruit> fruits; } @ExcelTarget("fruit") public class Fruit implements Serializable { @Excel(name = "水果名") private String name; @Excel(name = "价格/元") private Double price; @Excel(name = "数量") private Integer count; } 2.5 @ExcelIgnore 作用在属性上面,导出时跳过这一列 使用方法: @ExcelIgnore @Excel(name = "荣誉", width = 60, orderNum = "5") private List<String> honors; 3. 导出 Excel 3.1 导出基本属性 定义用户类: /** * @Description 导入导出实体类 * @Author 一颗雷布斯 * @Date 2021/5/24 15:38 */ @Data @AllArgsConstructor @NoArgsConstructor @ExcelTarget("user") public class User implements Serializable { @Excel(name = "姓名", width = 30, orderNum = "1" ) private String name; @Excel(name = "年龄", width = 10, orderNum = "2") private Integer age; @Excel(name = "性别", width = 10, orderNum = "3", replace = {"女_0", "男_1"}) private Integer sex; @Excel(name = "生日", width = 30, orderNum = "4", format = "yyyy-MM-dd HH:mm:ss") private Date birthday; } 测试方法: @Test void exportBasic() throws IOException { //新建测试数据 List<User> userList = new ArrayList<>(); for (int i = 0; i < 10; i++) { User user = new User(); user.setName("周芷若" + i); user.setAge(18 + i); user.setBirthday(new Date()); user.setSex(new Random().nextInt(2)); userList.add(user); } /*---------------------下面是使用EasyPoi导出的核心方法----------------------------*/ // ExportParams() 两个参数,一个是title 表格标题, 一个是sheetName Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户表","sheet1"),User.class,userList); //导出文件到指定位置 FileOutputStream outputStream = new FileOutputStream("D:\\WorkSpace\\easy-poi\\src\\main\\resources\\用户表.xls"); workbook.write(outputStream); outputStream.close(); workbook.close(); } 执行结果:

3.2 导出图片 定义用户类(包含用户头像): /** * @Description 导入导出实体类 * @Author 一颗雷布斯 * @Date 2021/5/24 15:38 */ @Data @AllArgsConstructor @NoArgsConstructor @ExcelTarget("user") public class User implements Serializable { @Excel(name = "姓名", width = 30, orderNum = "1" ) private String name; @Excel(name = "年龄", width = 10, orderNum = "2") private Integer age; @Excel(name = "性别", width = 10, orderNum = "3", replace = {"女_0", "男_1"}) private Integer sex; @Excel(name = "生日", width = 30, orderNum = "4", format = "yyyy-MM-dd HH:mm:ss") private Date birthday; //切记图片的 type = 2 @Excel(name = "头像信息", type = 2, width = 20,height = 30) private String head; } 测试方法: @Test void exportBasic() throws IOException { //新建测试数据 List<User> userList = new ArrayList<>(); for (int i = 0; i < 10; i++) { User user = new User(); user.setName("周芷若" + i); user.setAge(18 + i); user.setBirthday(new Date()); user.setSex(new Random().nextInt(2)); //指定图像所在的位置 user.setHead("D:\\WorkSpace\\easy-poi\\src\\main\\resources\\static\\image\\head.jpeg"); userList.add(user); } /*---------------------下面是使用EasyPoi导出的核心方法----------------------------*/ // ExportParams() 两个参数,一个是title 表格标题, 一个是sheetName Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户表","sheet1"),User.class,userList); //导出文件到指定位置 FileOutputStream outputStream = new FileOutputStream("D:\\WorkSpace\\easy-poi\\src\\main\\resources\\用户表.xls"); workbook.write(outputStream); outputStream.close(); workbook.close(); } 执行结果:

3.3 导出对象中的对象 定义用户类(包含用户地址对象): /** * @Description 导入导出实体类 * @Author 一颗雷布斯 * @Date 2021/5/24 15:38 */ @Data @AllArgsConstructor @NoArgsConstructor @ExcelTarget("user") public class User implements Serializable { @Excel(name = "姓名", width = 30, orderNum = "1") private String name; @Excel(name = "年龄", width = 10, orderNum = "2") private Integer age; @Excel(name = "性别", width = 10, orderNum = "3", replace = {"女_0", "男_1"}) private Integer sex; @Excel(name = "生日", width = 30, orderNum = "4", format = "yyyy-MM-dd HH:mm:ss") private Date birthday; @ExcelEntity(name = "address") private Address address; } 地址类: /** * @Description 地址 * @Author 一颗雷布斯 * @Date 2021/5/24 16:32 */ @Data @AllArgsConstructor @ExcelTarget("address") public class Address implements Serializable { @Excel(name = "省", width = 30, orderNum = "5") private String province; @Excel(name = "市", width = 30, orderNum = "6") private String city; @Excel(name = "县", width = 30, orderNum = "7") private String county; } 测试方法: @Test void exportUserTest() throws IOException { List<User> userList = new ArrayList<>(); for (int i = 0; i < 5; i++) { User user = new User(); user.setName("周芷若" + i); user.setAge(18 + i); user.setBirthday(new Date()); user.setSex(new Random().nextInt(2)); //设置地址 user.setAddress(new Address("湖南","长沙","宁乡")); userList.add(user); } Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户表","sheet1"),User.class,userList); //导出文件到指定位置 FileOutputStream outputStream = new FileOutputStream("D:\\WorkSpace\\easy-poi\\src\\main\\resources\\用户表.xls"); workbook.write(outputStream); outputStream.close(); workbook.close(); } 执行结果:

3.4 导出对象中的list集合 定义用户类(包含用户所得荣誉信息): /** * @Description 导入导出实体类 * @Author 一颗雷布斯 * @Date 2021/5/24 15:38 */ @Data @AllArgsConstructor @NoArgsConstructor @ExcelTarget("user") public class User implements Serializable { @Excel(name = "姓名", width = 30, orderNum = "1") private String name; @Excel(name = "年龄", width = 10, orderNum = "2") private Integer age; @Excel(name = "性别", width = 10, orderNum = "3", replace = {"女_0", "男_1"}) private Integer sex; @Excel(name = "生日", width = 30, orderNum = "4", format = "yyyy-MM-dd HH:mm:ss") private Date birthday; @Excel(name = "荣誉", width = 60, orderNum = "5") private List<String> honors; } 测试方法: @Test void exportUserTest() throws IOException { List<User> userList = new ArrayList<>(); String honorList="吃饭比赛一等奖、国际睡觉大赛二等奖"; List<String> honors = Arrays.asList(honorList.split("、")); for (int i = 0; i < 5; i++) { User user = new User(); user.setName("周芷若" + i); user.setAge(18 + i); user.setBirthday(new Date()); user.setSex(0); //设置用户所得荣誉 user.setHonors(honors); userList.add(user); } Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户表","sheet1"),User.class,userList); //导出文件到指定位置 FileOutputStream outputStream = new FileOutputStream("D:\\WorkSpace\\easy-poi\\src\\main\\resources\\用户表.xls"); workbook.write(outputStream); outputStream.close(); workbook.close(); } 执行结果:

3.5 导出一对多关系 定义用户类(包含用户购买的水果信息,这里一个用户购买多个水果): @Data @AllArgsConstructor @NoArgsConstructor @ExcelTarget("user") public class User implements Serializable { @Excel(name = "姓名", width = 30, orderNum = "1",needMerge = true) private String name; @Excel(name = "年龄", width = 10, orderNum = "2",needMerge = true) private Integer age; @Excel(name = "性别", width = 10, orderNum = "3", replace = {"女_0", "男_1"},needMerge = true) private Integer sex; @Excel(name = "生日", width = 30, orderNum = "4", format = "yyyy-MM-dd HH:mm:ss",needMerge = true) private Date birthday; @ExcelCollection(name = "购买的水果", orderNum = "5") private List<Fruit> fruits; } 水果类: /** * @Description 水果实体类 * @Author 一颗雷布斯 * @Date 2021/5/24 16:43 */ @Data @AllArgsConstructor @ExcelTarget("fruit") public class Fruit implements Serializable { @Excel(name = "水果名") private String name; @Excel(name = "价格/元") private Double price; @Excel(name = "数量") private Integer count; } 测试方法: @Test void exportUserTest() throws IOException { List<User> userList = new ArrayList<>(); for (int i = 0; i < 5; i++) { User user = new User(); user.setName("周芷若" + i); user.setAge(18 + i); user.setBirthday(new Date()); user.setSex(0); //设置用户购买的水果信息 user.setFruits(Arrays.asList(new Fruit("苹果",23.5,11),new Fruit("香蕉",4.98,21))); userList.add(user); } Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户表","sheet1"),User.class,userList); //导出文件到指定位置 FileOutputStream outputStream = new FileOutputStream("D:\\WorkSpace\\easy-poi\\src\\main\\resources\\用户表.xls"); workbook.write(outputStream); outputStream.close(); workbook.close(); } 执行结果:

4. 导入Excel 4.1 导入基本属性 准备文件:

定义用户类: @Data @AllArgsConstructor @NoArgsConstructor @ExcelTarget("user") public class User implements Serializable { @Excel(name = "姓名", width = 30, orderNum = "1") private String name; @Excel(name = "年龄", width = 10, orderNum = "2") private Integer age; @Excel(name = "性别", width = 10, orderNum = "3", replace = {"女_0", "男_1"}) private Integer sex; @Excel(name = "生日", width = 30, orderNum = "4", format = "yyyy-MM-dd HH:mm:ss") private Date birthday; } 测试方法: @Test void importUserTest() { ImportParams importParams = new ImportParams(); //表格标题行数,默认0 importParams.setTitleRows(1); //表头行数,默认1 importParams.setHeadRows(1); //导出数据 参数1:当如excel文件 参数2:导入对象的类型 参数3:导入参数配置 List<User> userList = ExcelImportUtil.importExcel(new File("D:\\WorkSpace\\easy-poi\\src\\main\\resources\\用户表.xls"), User.class,importParams); if(!CollectionUtils.isEmpty(userList)) userList.forEach(user->{ System.out.println(user); }); } 执行结果:

4.2 导入图片 准备文件:

定义用户类(包含用户头像,savePath 指定用户头像保存位置): @Data @AllArgsConstructor @NoArgsConstructor @ExcelTarget("user") public class User implements Serializable { @Excel(name = "姓名", width = 30, orderNum = "1") private String name; @Excel(name = "年龄", width = 10, orderNum = "2") private Integer age; @Excel(name = "性别", width = 10, orderNum = "3", replace = {"女_0", "男_1"}) private Integer sex; @Excel(name = "生日", width = 30, orderNum = "4", format = "yyyy-MM-dd HH:mm:ss") private Date birthday; @Excel(name = "头像信息", type = 2, width = 20,height = 30,savePath = "D:\\WorkSpace\\easy-poi\\src\\main\\resources\\head") private String head; } 测试方法: @Test void importUserTest() { ImportParams importParams = new ImportParams(); //表格标题行数,默认0 importParams.setTitleRows(1); //表头行数,默认1 importParams.setHeadRows(1); //导出数据 参数1:当如excel文件 参数2:导入对象的类型 参数3:导入参数配置 List<User> userList = ExcelImportUtil.importExcel(new File("D:\\WorkSpace\\easy-poi\\src\\main\\resources\\用户表.xls"), User.class,importParams); if(!CollectionUtils.isEmpty(userList)) userList.forEach(user->{ System.out.println(user); }); } 执行结果:

头像保存位置:

5. 注意事项 导出 Excel 文件时,切记先把原来导出的 Excel 文件关掉,不然会报错!

-END-

继续阅读

更多来自我们博客的帖子

如何安装 BuddyPress
由 测试 December 17, 2023
经过差不多一年的开发,BuddyPress 这个基于 WordPress Mu 的 SNS 插件正式版终于发布了。BuddyPress...
阅读更多
Filter如何工作
由 测试 December 17, 2023
在 web.xml...
阅读更多
如何理解CGAffineTransform
由 测试 December 17, 2023
CGAffineTransform A structure for holding an affine transformation matrix. ...
阅读更多