当前位置:   article > 正文

使用EasyPoi导入、导出excel_easypoi导入excel

easypoi导入excel

前言

springboot版本:2.6.2

一、集成

在SpringBoot中集成EasyPoi非常简单,只需添加如下一个依赖即可,真正的开箱即用!

  1. <dependency>
  2. <groupId>cn.afterturn</groupId>
  3. <artifactId>easypoi-spring-boot-starter</artifactId>
  4. <version>4.4.0</version>
  5. </dependency>
  6. 复制代码

使用

接下来介绍下EasyPoi的使用,以会员信息和订单信息的导入导出为例,分别实现下简单的单表导出和具有关联信息的复杂导出。

简单导出

我们以会员信息列表导出为例,使用EasyPoi来实现下导出功能,看看是不是够简单!

  • 首先创建一个会员对象Member,封装会员信息;
  1. package com.example.pojo;
  2. import cn.afterturn.easypoi.excel.annotation.Excel;
  3. import lombok.Data;
  4. import lombok.EqualsAndHashCode;
  5. import java.sql.Date;
  6. /**
  7. * 购物会员
  8. * Created by macro on 2021/10/12.
  9. */
  10. @Data
  11. @EqualsAndHashCode(callSuper = false)
  12. public class Member {
  13. @Excel(name = "ID", width = 10)
  14. private Long id;
  15. @Excel(name = "用户名", width = 20, needMerge = true)
  16. private String username;
  17. private String password;
  18. @Excel(name = "昵称", width = 20, needMerge = true)
  19. private String nickname;
  20. @Excel(name = "出生日期", width = 20, format = "yyyy-MM-dd")
  21. private Date birthday;
  22. @Excel(name = "手机号", width = 20, needMerge = true, desensitizationRule = "3_4")
  23. private String phone;
  24. private String icon;
  25. @Excel(name = "性别", width = 10, replace = {"男_0", "女_1"})
  26. private Integer gender;
  27. }
  28. 复制代码
  • 在此我们就可以看到EasyPoi的核心注解@Excel,通过在对象上添加@Excel注解,可以将对象信息直接导出到Excel中去,下面对注解中的属性做个介绍;

    • name:Excel中的列名;
    • width:指定列的宽度;
    • needMerge:是否需要纵向合并单元格;
    • format:当属性为时间类型时,设置时间的导出导出格式;
    • desensitizationRule:数据脱敏处理,3_4表示只显示字符串的前3位和后4位,其他为*号;
    • replace:对属性进行替换;
    • suffix:对数据添加后缀。
  • 接下来我们在Controller中添加一个接口,用于导出会员列表到Excel,具体代码如下;

  1. /**
  2. * EasyPoi导入导出测试Controller
  3. * Created by macro on 2021/10/12.
  4. */
  5. @Controller
  6. @Api(tags = "EasyPoiController", description = "EasyPoi导入导出测试")
  7. @RequestMapping("/easyPoi")
  8. public class EasyPoiController {
  9. @Autowired
  10. private EasyPoiService easyPoiService;
  11. @ApiOperation(value = "导出会员列表Excel")
  12. @RequestMapping(value = "/exportMemberList", method = RequestMethod.GET)
  13. public void exportMemberList(ModelMap modelMap,
  14. HttpServletRequest request,
  15. HttpServletResponse response) {
  16. modelMap = easyPoiService.exportMemberExcel(modelMap);
  17. PoiBaseView.render(modelMap, request, response, NormalExcelConstants.EASYPOI_EXCEL_VIEW);
  18. }
  19. }
  20. 复制代码
  • 对应的service及serviceImpl EasyPoiService:
  1. package com.example.service;
  2. import com.example.pojo.Member;
  3. import org.springframework.ui.ModelMap;
  4. import org.springframework.web.multipart.MultipartFile;
  5. import java.util.List;
  6. public interface EasyPoiService {
  7. /**
  8. * 导出会员excel数据
  9. * @param modelMap
  10. * @return
  11. */
  12. ModelMap exportMemberExcel(ModelMap modelMap);
  13. }
  14. 复制代码

EasyPoiServiceImpl:

  1. package com.example.service.impl;
  2. import cn.afterturn.easypoi.entity.vo.NormalExcelConstants;
  3. import cn.afterturn.easypoi.excel.ExcelImportUtil;
  4. import cn.afterturn.easypoi.excel.entity.ExportParams;
  5. import cn.afterturn.easypoi.excel.entity.ImportParams;
  6. import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
  7. import com.example.pojo.Member;
  8. import com.example.pojo.Order;
  9. import com.example.pojo.Product;
  10. import com.example.service.EasyPoiService;
  11. import com.example.util.LocalJsonUtil;
  12. import com.example.util.MemberExcelDataHandler;
  13. import org.springframework.stereotype.Service;
  14. import org.springframework.ui.ModelMap;
  15. import org.springframework.web.multipart.MultipartFile;
  16. import java.util.List;
  17. @Service("easyPoiService")
  18. public class EasyPoiServiceImpl implements EasyPoiService {
  19. @Override
  20. public ModelMap exportMemberExcel(ModelMap modelMap) {
  21. List<Member> memberList = LocalJsonUtil.getListFromJson("json/members.json", Member.class);
  22. ExportParams params = new ExportParams("会员列表", "会员列表", ExcelType.XSSF);
  23. modelMap.put(NormalExcelConstants.DATA_LIST, memberList);
  24. modelMap.put(NormalExcelConstants.CLASS, Member.class);
  25. modelMap.put(NormalExcelConstants.PARAMS, params);
  26. modelMap.put(NormalExcelConstants.FILE_NAME, "memberList");
  27. return modelMap;
  28. }
  29. }
  30. 复制代码
  • LocalJsonUtil工具类,可以直接从resources目录下获取JSON数据并转化为对象,例如此处使用的members.json
  1. package com.example.util;
  2. import cn.hutool.core.io.IoUtil;
  3. import cn.hutool.core.io.resource.ClassPathResource;
  4. import cn.hutool.json.JSONArray;
  5. import cn.hutool.json.JSONUtil;
  6. import java.nio.charset.Charset;
  7. import java.util.List;
  8. /**
  9. * 从本地获取JSON数据的工具类
  10. * Created by macro on 2021/10/16.
  11. */
  12. public class LocalJsonUtil {
  13. /**
  14. * 从指定路径获取JSON并转换为List
  15. * @param path json文件路径
  16. * @param elementType List元素类型
  17. */
  18. public static <T> List<T> getListFromJson(String path, Class<T> elementType) {
  19. ClassPathResource resource = new ClassPathResource(path);
  20. String jsonStr = IoUtil.read(resource.getStream(), Charset.forName("UTF-8"));
  21. JSONArray jsonArray = new JSONArray(jsonStr);
  22. return JSONUtil.toList(jsonArray, elementType);
  23. }
  24. }
  25. 复制代码

  • 下载完成后,查看下文件,一个标准的Excel文件已经被导出了。

简单导入

导入功能实现起来也非常简单,下面以会员信息列表的导入为例。

  • 在Controller中添加会员信息导入的接口,这里需要注意的是使用@RequestPart注解修饰文件上传参数,否则在Swagger中就没法显示上传按钮了;
  1. /**
  2. * 这里需要注意的是使用@RequestPart注解修饰文件上传参数,
  3. * 否则在Swagger中就没法显示上传按钮了;
  4. * @param file
  5. * @return
  6. */
  7. @ApiOperation("从Excel导入会员列表")
  8. @RequestMapping(value = "/importMemberList", method = RequestMethod.POST)
  9. @ResponseBody
  10. public ResponseResult importMemberList(@RequestPart("file") MultipartFile file) throws Exception {
  11. List<Member> memberList = easyPoiService.importMemberExcel(file);
  12. return ResponseResult.ok().data(memberList);
  13. }
  14. 复制代码
  • 在service和serviceImpl添加对应的实现 service:
  1. /**
  2. * 导入会员excel数据
  3. * @param file
  4. * @return
  5. */
  6. List<Member> importMemberExcel(MultipartFile file) throws Exception;
  7. 复制代码

serviceImpl:

  1. @Override
  2. public List<Member> importMemberExcel(MultipartFile file) throws Exception {
  3. ImportParams importParams = new ImportParams();
  4. importParams.setTitleRows(1);
  5. importParams.setHeadRows(1);
  6. List<Member> list = ExcelImportUtil.importExcel(
  7. file.getInputStream(),
  8. Member.class, importParams);
  9. return list;
  10. }
  11. 复制代码
  • 然后在Swagger中测试接口,选择之前导出的Excel文件即可,导入成功后会返回解析到的数据。

复杂导出

当然EasyPoi也可以实现更加复杂的Excel操作,比如导出一个嵌套了会员信息和商品信息的订单列表,下面我们来实现下!

  • 首先添加商品对象Product,用于封装商品信息;
  1. package com.example.pojo;
  2. import cn.afterturn.easypoi.excel.annotation.Excel;
  3. import lombok.Data;
  4. import lombok.EqualsAndHashCode;
  5. import java.math.BigDecimal;
  6. /**
  7. * 商品
  8. * Created by macro on 2021/10/12.
  9. */
  10. @Data
  11. @EqualsAndHashCode(callSuper = false)
  12. public class Product {
  13. @Excel(name = "ID", width = 10)
  14. private Long id;
  15. @Excel(name = "商品SN", width = 20)
  16. private String productSn;
  17. @Excel(name = "商品名称", width = 20)
  18. private String name;
  19. @Excel(name = "商品副标题", width = 30)
  20. private String subTitle;
  21. @Excel(name = "品牌名称", width = 20)
  22. private String brandName;
  23. @Excel(name = "商品价格", width = 10)
  24. private BigDecimal price;
  25. @Excel(name = "购买数量", width = 10, suffix = "件")
  26. private Integer count;
  27. }
  28. 复制代码
  • 然后添加订单对象Order,订单和会员是一对一关系,使用 @ExcelEntity注解表示,订单和商品是一对多关系,使用@ExcelCollection注解表示,Order就是我们需要导出的嵌套订单数据;
  1. package com.example.pojo;
  2. import cn.afterturn.easypoi.excel.annotation.Excel;
  3. import cn.afterturn.easypoi.excel.annotation.ExcelCollection;
  4. import cn.afterturn.easypoi.excel.annotation.ExcelEntity;
  5. import lombok.Data;
  6. import lombok.EqualsAndHashCode;
  7. import java.sql.Date;
  8. import java.util.List;
  9. /**
  10. * 订单
  11. * Created by macro on 2021/10/12.
  12. */
  13. @Data
  14. @EqualsAndHashCode(callSuper = false)
  15. public class Order {
  16. @Excel(name = "ID", width = 10,needMerge = true)
  17. private Long id;
  18. @Excel(name = "订单号", width = 20,needMerge = true)
  19. private String orderSn;
  20. @Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss",needMerge = true)
  21. private Date createTime;
  22. @Excel(name = "收货地址", width = 20,needMerge = true )
  23. private String receiverAddress;
  24. @ExcelEntity(name = "会员信息")
  25. private Member member;
  26. @ExcelCollection(name = "商品列表")
  27. private List<Product> productList;
  28. }
  29. 复制代码
  • 接下来在Controller中添加导出订单列表的接口,由于有些会员信息我们不需要导出,可以调用ExportParams中的setExclusions方法排除掉;
  1. @ApiOperation(value = "导出订单列表Excel")
  2. @RequestMapping(value = "/exportOrderList", method = RequestMethod.GET)
  3. public void exportOrderList(ModelMap modelMap,
  4. HttpServletRequest request,
  5. HttpServletResponse response) {
  6. modelMap = easyPoiService.exportOrderExcel(modelMap);
  7. PoiBaseView.render(modelMap, request, response, NormalExcelConstants.EASYPOI_EXCEL_VIEW);
  8. }
  9. 复制代码

在service和serviceImpl中添加对应实现

service:

  1. /**
  2. * 导出订单excel数据
  3. * @param modelMap
  4. * @return
  5. */
  6. ModelMap exportOrderExcel(ModelMap modelMap);
  7. 复制代码

serviceImpl:

  1. @Override
  2. public ModelMap exportOrderExcel(ModelMap modelMap) {
  3. List<Order> orderList = getOrderList();
  4. ExportParams exportParams = new ExportParams("订单列表", "订单列表", ExcelType.XSSF);
  5. //导出时排除一些字段
  6. exportParams.setExclusions(new String[]{"ID", "出生日期", "性别"});
  7. modelMap.put(NormalExcelConstants.DATA_LIST, orderList);
  8. modelMap.put(NormalExcelConstants.CLASS, Order.class);
  9. modelMap.put(NormalExcelConstants.PARAMS, exportParams);
  10. modelMap.put(NormalExcelConstants.FILE_NAME, "orderList");
  11. return modelMap;
  12. }
  13. private List<Order> getOrderList() {
  14. List<Order> orderList = LocalJsonUtil.getListFromJson("json/orders.json", Order.class);
  15. List<Product> productList = LocalJsonUtil.getListFromJson("json/products.json", Product.class);
  16. List<Member> memberList = LocalJsonUtil.getListFromJson("json/members.json", Member.class);
  17. for (int i = 0; i < orderList.size(); i++) {
  18. Order order = orderList.get(i);
  19. order.setMember(memberList.get(i));
  20. order.setProductList(productList);
  21. }
  22. return orderList;
  23. }
  24. 复制代码
  • 在Swagger中访问接口测试,导出订单列表对应Excel;

  • 下载完成后,查看下文件,EasyPoi导出复杂的Excel也是很简单的!

自定义处理

如果你想对导出字段进行一些自定义处理,EasyPoi也是支持的,比如在会员信息中,如果用户没有设置昵称,我们添加下暂未设置信息。

  • 我们需要添加一个处理器继承默认的ExcelDataHandlerDefaultImpl类,然后在exportHandler方法中实现自定义处理逻辑;
  1. package com.example.util;
  2. import cn.afterturn.easypoi.handler.impl.ExcelDataHandlerDefaultImpl;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.example.pojo.Member;
  5. /**
  6. * 自定义字段处理
  7. * Created by macro on 2021/10/13.
  8. */
  9. public class MemberExcelDataHandler extends ExcelDataHandlerDefaultImpl<Member> {
  10. @Override
  11. public Object exportHandler(Member obj, String name, Object value) {
  12. if("昵称".equals(name)){
  13. String emptyValue = "暂未设置";
  14. if(value==null){
  15. return super.exportHandler(obj,name,emptyValue);
  16. }
  17. if(value instanceof String && StrUtil.isBlank((String) value)){
  18. return super.exportHandler(obj,name,emptyValue);
  19. }
  20. }
  21. return super.exportHandler(obj, name, value);
  22. }
  23. @Override
  24. public Object importHandler(Member obj, String name, Object value) {
  25. return super.importHandler(obj, name, value);
  26. }
  27. }
  28. 复制代码
  • 然后修改Controller中的接口,调用MemberExcelDataHandler处理器的setNeedHandlerFields设置需要自定义处理的字段,并调用ExportParamssetDataHandler设置自定义处理器;
  1. @Override
  2. public ModelMap exportMemberExcel(ModelMap modelMap) {
  3. List<Member> memberList = LocalJsonUtil.getListFromJson("json/members.json", Member.class);
  4. ExportParams params = new ExportParams("会员列表", "会员列表", ExcelType.XSSF);
  5. //对导出结果进行自定义处理
  6. MemberExcelDataHandler handler = new MemberExcelDataHandler();
  7. handler.setNeedHandlerFields(new String[]{"昵称"});
  8. params.setDataHandler(handler);
  9. modelMap.put(NormalExcelConstants.DATA_LIST, memberList);
  10. modelMap.put(NormalExcelConstants.CLASS, Member.class);
  11. modelMap.put(NormalExcelConstants.PARAMS, params);
  12. modelMap.put(NormalExcelConstants.FILE_NAME, "memberList");
  13. return modelMap;
  14. }
  15. 复制代码
  • 再次调用导出接口,我们可以发现昵称已经添加默认设置了。

总结

体验了一波EasyPoi,它使用注解来操作Excel的方式确实非常好用。如果你想生成更为复杂的Excel的话,可以考虑下它的模板功能。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/540299
推荐阅读
相关标签
  

闽ICP备14008679号