简单好用的EasyExcel导入导出工具类

本文直接以Spring-Boot项目为例,通过流的形式进行,方便大家理解。

在Spring-Boot项目中引入EasyExcel依赖,


    com.alibaba
    easyexcel
    3.0.5

新建一个工具类

1.导入

代码如下:

/**
* 导入
*
* @param file Excel文件
* @param t 类型
* @param consumer 消费者
* @param capacity 最大容量
* @param headRowNumber 头行数
* @param  泛型
* @return
*/
public static  boolean readExcel(MultipartFile file, Class t, Consumer> consumer, Integer capacity, Integer headRowNumber) {
        try {
            InputStream inputStream = file.getInputStream();
            EasyExcel.read(inputStream, t, EasyExcelUtil.getListener(consumer, capacity)).sheet().headRowNumber(headRowNumber).doRead();
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

/**
* 自定义监听器
*
* @param consumer 消费者
* @param capacity list最大容量,即单次读取最大条数
* @param  自定义类型
* @return
*/
public static  AnalysisEventListener getListener(Consumer> consumer, int capacity) {
        return new AnalysisEventListener() {
            private List list = new LinkedList<>();

            @Override
            public void invoke(T t, AnalysisContext context) {
                list.add(t);
                if (list.size() == capacity) {
                    accept();
                }
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {
                if (list.size() > 0) {
                    accept();
                }
            }

            private void accept() {
                consumer.accept(list);
                list.clear();
            }
        };
    }

使用时需要调用readExcel方法,传入对应参数,这里作为演示,代码都在controller层。代码如下:

@PostMapping("/readExcel")
@ResponseBody
public void readExcel(@RequestPart MultipartFile file) {
    EasyExcelUtil.readExcel(file,User.class,consumer(),10,1);
}

public Consumer> consumer(){
    return list->{
    // 这里面是业务逻辑代码,根据实际使用情况编写。作为演示,这个做个遍历打印输出
    list.forEach(System.out::println);
    };
}

User实体类

@Data
public class User {
    // @ExcelProperty 这个注解用来指定excel中的列
    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("年龄")
    private Integer age;
}

演示表格

简单好用的EasyExcel导入导出工具类_第1张图片

使用测试接口工具进行测试演示结果如下:

 

 2.导出

工具类代码:

/**
* 导出
*
* @param list 导出数据集合
* @param clazz 类型
* @param response HttpServletResponse
* @param fileName 文件名称
* @return
* @throws Exception
*/
public static Boolean writeExcel(List list, Class clazz, HttpServletResponse response, String fileName) throws Exception {
    String file = URLEncoder.encode(fileName + ".xlsx", "UTF-8");
    response.setHeader("Content-disposition", "attachment;filename=" + file);
    response.setCharacterEncoding("utf-8");
    ServletOutputStream outputStream = response.getOutputStream();
    try {
        EasyExcel.write(outputStream, clazz).sheet().doWrite(list);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    } finally {
        outputStream.flush();
        outputStream.close();
    }
}

正常业务中的代码如下:

@GetMapping("/downloadExcel")
public void downloadExcel(HttpServletResponse response) throws Exception {
    // 导出的文件名
    String fileName="用户列表";
    // 此处用来模拟正常业务中从数据库取出的数据
    List list=new ArrayList<>();
    for (int i=1;i<=10;i++){
        User user = new User();
        user.setName("用户"+i);
        user.setAge(18+i);
        list.add(user);
    }
    EasyExcelUtil.writeExcel(list,User.class,response,fileName);
}

controller层切记不要加@ResponseBody这个注解,注解不要使用@RestController

这两个注解会报错,返回的类型不一样

使用get请求,为了方便测试,可以直接在浏览器地址栏输入请求地址就能下载。测试结果如下

 简单好用的EasyExcel导入导出工具类_第2张图片

至此,使用EasyExcel完成导入导出。如有错误之处,欢迎各位指正。

 

你可能感兴趣的:(EasyExcel,spring,boot,spring,java,后端)