Java 使用EasyExcel导出工具类(实体类,非实体类,List<Map<String,Object>>)

现阶段业务需求有一个导出功能,使用EasyExcel实现导出操作,因为以前的接口中返回的内容很多都不是用实体类封装的,自己开发一个工具类使用,整篇文章先将整个工具类及其需要的实体类放出,结尾有相应的使用方法

参考内容:https://alibaba-easyexcel.github.io/index.html EasyExcel官方示例
https://www.yuque.com/easyexcel/doc/easyexcel 新版官方示例

〇:工具类内容

1、定义两个实体类

自行自动生成get,set方法,这里就不放出来了

public class NoModelWriteData implements Serializable {
    private String fileName;//文件名
    private String[] headMap;//表头数组
    private String[] dataStrMap;//对应数据字段数组
    private List<Map<String, Object>> dataList;//数据集合
}
public class SimpleWriteData implements Serializable {
    private String fileName;//文件名
    private List<?> dataList;//数据列表
}

2、添加工具类内容

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.fastjson.JSON;
import com.google.common.net.HttpHeaders;
import com.roc.common.model.NoModelWriteData;
import com.roc.common.model.SimpleWriteData;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.web.bind.annotation.RequestBody;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.*;

public class EasyExcelUtils {

    //不创建对象的导出
    public void noModleWrite(@RequestBody NoModelWriteData data, HttpServletResponse response) throws IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        try {
//            response.setContentType("application/vnd.ms-excel");
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode(data.getFileName(), "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            // 这里需要设置不关闭流
            EasyExcel.write(response.getOutputStream()).head(head(data.getHeadMap())).sheet(data.getFileName()).doWrite(dataList(data.getDataList(), data.getDataStrMap()));
        } catch (Exception e) {
            // 重置response
            response.reset();
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            Map<String, String> map = new HashMap<String, String>();
            map.put("status", "failure");
            map.put("message", "下载文件失败" + e.getMessage());
            response.getWriter().println(JSON.toJSONString(map));
        }
    }

    //创建对象的导出
    public <T> void simpleWrite(@RequestBody SimpleWriteData data,Class<T> clazz, HttpServletResponse response) throws IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
//        response.setContentType("application/vnd.ms-excel");
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode(data.getFileName(), "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), clazz).sheet(data.getFileName()).doWrite(data.getDataList());
    }

    //设置表头
    private List<List<String>> head(String[] headMap) {
        List<List<String>> list = new ArrayList<List<String>>();

        for (String head : headMap) {
            List<String> headList = new ArrayList<String>();
            headList.add(head);
            list.add(headList);
        }
        return list;
    }

    //设置导出的数据内容
    private List<List<Object>> dataList(List<Map<String, Object>> dataList, String[] dataStrMap) {
        List<List<Object>> list = new ArrayList<List<Object>>();
        for (Map<String, Object> map : dataList) {
            List<Object> data = new ArrayList<Object>();
            for (int i = 0; i < dataStrMap.length; i++) {
                data.add(map.get(dataStrMap[i]));
            }
            list.add(data);
        }
        return list;
    }
}

一:不使用实体类导出

这里只针对接口返回的List<Map<String,Object>>类型数据做后续操作,跟随文章的步骤操作即可

1、查询数据

如图获取了List<Map<String, Object>>类型的数据
在这里插入图片描述

2、定义数组

headMap数组定义的是导出文件表头标题的内容,要按顺序定义
dataStrMap数据定义的是标题对应的字段名(一定要按顺序对应)

String[] headMap = {"类型", "房号", "账单单号", "账单生成时间", "计算金额", "优惠金额", "违约金", "应收金额", "录入人", "账单状态"};
String[] dataStrMap = {"orderClassStr", "houseAddress", "payNo", "createDate", "sumCalAmount", "sumPValue", "sumBreachValue", "sumActualAmount", "creatorName", "payStateStr"};

3、将数据放入工具类方法的实体类中

NoModelWriteData d = new NoModelWriteData();
d.setFileName("账单流水");
d.setHeadMap(headMap);
d.setDataStrMap(dataStrMap);
d.setDataList(list);
EasyExcelUtils easyExcelUtils = new EasyExcelUtils();
easyExcelUtils.noModleWrite(d, response);

二:使用实体类导出

1、定义数据实体类

自行自动生成get,set方法,这里就不放出来了
实体类中的注解可以根据自己的需求使用,更多注解可查看文章开头的官方示例文档

@Data
public class PayInfoBillListExportDto implements Serializable {
    @ExcelProperty("类型")
    private String orderClassStr;
    @ExcelProperty("房号")
    private String houseAddress;
    @ExcelProperty("账单单号")
    private String payNo;
    @ExcelProperty("账单生辰时间")
    private String createDate;
    @ExcelProperty("计算金额")
    private BigDecimal sumCalAmount;
    @ExcelProperty("优惠金额")
    private BigDecimal sumPValue;
    @ExcelProperty("违约金")
    private BigDecimal sumBreachValue;
    @ExcelProperty("应收金额")
    private BigDecimal sumActualAmount;
    @ExcelProperty("录入人")
    private String creatorName;
    @ExcelProperty("账单状态")
    private String payStateStr;

//    @ExcelIgnore    此注解表示忽略这个字段
//    @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")  时间格式化注解
//    @NumberFormat("#.##%")  百分比表示
//    @ColumnWidth(50)   设置单元格宽度为50
//    @ExcelProperty(value = "标题", index = 0)   第0列为标题列
}

1、查询数据

在这里插入图片描述

2、将数据放入工具类方法的实体类中

SimpleWriteData d = new SimpleWriteData();
d.setFileName("账单流水");
d.setDataList(list);
EasyExcelUtils easyExcelUtils = new EasyExcelUtils();
easyExcelUtils.simpleWrite(d,PayInfoBillListExportDto.class,response);

结尾

此工具类只针对这两种数据进行封装,如有bug或修改建议欢迎留言讨论

  • 9
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
使用EasyExcel导出ListMap,需要遵循以下步骤: 1.添加EasyExcel依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.6</version> </dependency> ``` 2.编写导出逻辑: ```java //创建数据 List<Map<String, Object>> dataList = new ArrayList<>(); Map<String, Object> dataMap1 = new LinkedHashMap<>(); dataMap1.put("name", "张三"); dataMap1.put("age", 20); dataMap1.put("gender", "男"); dataList.add(dataMap1); Map<String, Object> dataMap2 = new LinkedHashMap<>(); dataMap2.put("name", "李四"); dataMap2.put("age", 21); dataMap2.put("gender", "女"); dataList.add(dataMap2); //设置导出参数 String fileName = "test.xlsx"; String sheetName = "Sheet1"; Class<? extends BaseRowModel> clazz = null; ExcelWriter excelWriter = null; try { excelWriter = EasyExcel.write(fileName).build(); WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).build(); if (!dataList.isEmpty()) { //获取首个Map对象的key,用于作为表头 Set<String> keySet = dataList.get(0).keySet(); List<List<String>> headList = new ArrayList<>(); List<String> headTitleList = new ArrayList<>(); for (String key : keySet) { headTitleList.add(key); } headList.add(headTitleList); //写出数据 excelWriter.write(dataList, writeSheet, EasyExcel.writerExcelDataHandler().build()); //写出表头 excelWriter.writeHead(headList, writeSheet); } } finally { if (excelWriter != null) { excelWriter.finish(); } } ``` 上面的代码中,我们先创建了一个List<Map<String, Object>>对象作为导出数据,然后设置导出参数,包括文件名、Sheet名、实体类类型等,最后使用EasyExcel的API进行导出。 注意,要写出表头,我们需要先获取首个Map对象的key,然后将其作为表头写入Excel文件中。 3.运行导出代码,查看结果。 导出的结果应该是一个包含数据和表头的Excel文件。其中,第一行为表头,后面的每一行为数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值