springboot使用easyexcel导出excel(使用converter转换Integer成String)

1.引入依赖

<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>easyexcel</artifactId>
     <version>2.2.6</version>
</dependency>

2.写一个简单的工具类

import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSON;
import com.sun.deploy.net.URLEncoder;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 项目名称:test_excel
 * 类 名 称:EasyExcelUtil
 * 类 描 述:TODO
 * 创建时间:2020/8/12 11:35
 * 创 建 人:li
 */
public class EasyExcelUtil {
    public static <T> void writeExcel(HttpServletResponse response, List<T> data, Class tClass,String name){
        try {
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode(name + System.currentTimeMillis(), "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            // 这里需要设置不关闭流
            EasyExcel.write(response.getOutputStream(), tClass).autoCloseStream(Boolean.FALSE).sheet(name)
                    .doWrite(data);
        } 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());
            try {
                response.getWriter().println(JSON.toJSONString(map));
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }
    }
}

3.编写对应导出的类

public class Route {
    @ExcelProperty(value = "流水号", index = 0)
    private String routeNo;
    @ExcelProperty(value = "是否异常", index = 1,converter = IsExceptionConverter.class)
    private Integer isException;
    @ExcelProperty(value = "异常描述", index = 2)
    private String exceptionReason;
    @ExcelIgnore
    private String msg;

只给出了部分字段,其中
对于不需要表示出的,只需要@ExcelIgnore进行表明即可。
对于需要导出的,@ExcelProperty(value = "列名", index = 0)
如果需要根据值进行转换,需要编写Converter,是否异常,0表示正常,1表示异常。要根据0和1来导出成对应的字符串描述。

4.编写IsExceptionConverter

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.alibaba.excel.util.NumberUtils;

import java.math.BigDecimal;
import java.text.ParseException;


public class IsExceptionConverter implements Converter<Integer> {
    @Override
    public Class supportJavaTypeKey() {
        return Integer.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    @Override
    public Integer convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
                                     GlobalConfiguration globalConfiguration) throws ParseException {
        return NumberUtils.parseInteger(cellData.getStringValue(), contentProperty);
    }
    @Override
    public CellData convertToExcelData(Integer value, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        //0 正常 1 异常
        if (value == null) {
            return new CellData("");
        } else if (value == 0) {
            return new CellData("正常");
        } else if (value == 1) {
            return new CellData("异常");
        } else {
            return new CellData("状态异常");
        }
    }
}

5.编写Controller代码进行调用

   @RequestMapping("/route")
    public void routeTest(HttpServletRequest request, HttpServletResponse response, QueryRouteParam queryRouteParam){
        List<Route> data = RouteMapper.findRoute(queryRouteParam);
        EasyExcelUtil.writeExcel(response,data,Route.class,"行程");
    }

6.导出

在这里插入图片描述
进行调用导出,其中是否异常列,不是0和1,根据数据库中的信息显示成了正常或者异常。

7.不同类型的Converter

https://github.com/alibaba/easyexcel项目中在这里插入图片描述
里面有更多的用法示例。

官方文档:让您快速的入门EasyExcel

Spring Boot集EasyExcel可以方便地实现Excel文件的读写。如果要自定义Excel文件的格式,可以通过EasyExcel提供的注解来实现。 首先,导入EasyExcel依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.6</version> </dependency> ``` 假设我们要导出一个学生信息列表,包括学生姓名、学号、年龄和性别,并且要求在表头中添加“导出时间”信息。那么可以定义一个Student实体类,并在需要导出的字段上添加@ExcelProperty注解,如下所示: ```java public class Student { @ExcelProperty(value = "姓名", index = 0) private String name; @ExcelProperty(value = "学号", index = 1) private String studentNo; @ExcelProperty(value = "年龄", index = 2) private Integer age; @ExcelProperty(value = "性别", index = 3) private String gender; // getter/setter省略 } ``` 在导出Excel时,需要通过EasyExcel提供的ExcelWriter对象来写入数据。在写入数据之前,需要先创建一个WriteSheet对象,并通过WriteSheet对象的setHead方法来设置表头信息。 ```java public void exportStudents(HttpServletResponse response, List<Student> students) throws IOException { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); String fileName = "students.xlsx"; response.setHeader("Content-disposition", "attachment;filename=" + fileName); try (ServletOutputStream outputStream = response.getOutputStream()) { ExcelWriter excelWriter = EasyExcel.write(outputStream).build(); WriteSheet writeSheet = EasyExcel.writerSheet("学生信息").build(); // 设置表头信息 List<List<String>> head = new ArrayList<>(); List<String> head0 = new ArrayList<>(); head0.add("导出时间:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); head.add(head0); writeSheet.setHead(head); excelWriter.write(students, writeSheet); excelWriter.finish(); } } ``` 在上述代码中,我们先创建了一个WriteSheet对象,并将其命名为“学生信息”。然后,通过创建一个二维List来设置表头信息,将第一行的单元格内容设置为“导出时间:当前时间”。最后,将这个表头信息设置到WriteSheet对象中。在写入数据时,ExcelWriter会根据注解信息自动将Student对象的属性值写入相应的单元格中。 需要注意的是,EasyExcel提供了很多其他的注解和配置项,可以根据实际需求进行使用和设置。例如,可以通过@ExcelIgnore注解来忽略某个属性;可以通过@ExcelProperty(index = 0, converter = LocalDateTimeConverter.class)注解来自定义属性值的转换器等。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值