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

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

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

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

新建一个工具类

1.导入

代码如下:

/**
* 导入
*
* @param file Excel文件
* @param t 类型
* @param consumer 消费者
* @param capacity 最大容量
* @param headRowNumber 头行数
* @param <T> 泛型
* @return
*/
public static <T> boolean readExcel(MultipartFile file, Class<T> t, Consumer<List<T>> 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 <T> 自定义类型
* @return
*/
public static <T> AnalysisEventListener<T> getListener(Consumer<List<T>> consumer, int capacity) {
        return new AnalysisEventListener<T>() {
            private List<T> 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<List<User>> consumer(){
    return list->{
    // 这里面是业务逻辑代码,根据实际使用情况编写。作为演示,这个做个遍历打印输出
    list.forEach(System.out::println);
    };
}

User实体类

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

演示表格

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

 

 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<User> 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完成导入导出。如有错误之处,欢迎各位指正。

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值