手机版 欢迎访问it开发者社区(www.mfbz.cn)网站

当前位置: > 开发

【项目复盘】easyExcel的简单使用

时间:2021/5/15 8:40:16|来源:|点击: 次

【项目复盘】easyExcel的简单使用

easyExcel官方文档:https://www.yuque.com/easyexcel/doc/read#1bfaf593

引入依赖

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

创建实体类

创建实体类,并在实体类字段上添加注解,如:

package com.example.demo;

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
public class User {
	@ExcelIgnore
	private Integer id;
	@ExcelProperty("name")
	private String name;
	@ExcelProperty("password")
	private String password;
	public User() {
		super();
		// TODO 自动生成的构造函数存根
	}
	public User(Integer id, String name, String password) {
		super();
		this.id = id;
		this.name = name;
		this.password = password;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", password=" + password + "]";
	}
	
}

编写业务层

如:

		List<User> lis = new ArrayList<>();
		for(int i = 0; i < 10; i++) {
			User user = new User();
			user.setId(i);
			user.setName("df"+i);
			user.setPassword("sdf");
			lis.add(user);
		}
		String fileNameString = "d:/geng.xlsx";
		EasyExcel.write(fileNameString, User.class).sheet("模板").doWrite(lis);

也是需要实体类和实体类字段上需要标明注解

创建一个类继承AnalysisEventListener<实体类>,并重写方法

	@Override
	public void invoke(User data, AnalysisContext context) {
		
	}

data参数为解析出来的一排数据

	@Override
	public void doAfterAllAnalysed(AnalysisContext context) {
		// TODO 自动生成的方法存根
		
	}

做完之后执行的操作

如:

public class EasyExcelListener extends AnalysisEventListener<User> {
	private static final org.slf4j.Logger LOGGER =  LoggerFactory.getLogger(EasyExcelListener.class);
    /**
     * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 5;
    List<User> list = new ArrayList<User>();
   
 
    /**
     * 加上存储数据库
     */
    private void saveData() {
        LOGGER.info("{}条数据,开始存储数据库!", list.size());
       
        LOGGER.info("存储数据库成功!");
    }
	@Override
	public void invoke(User data, AnalysisContext context) {
		// TODO 自动生成的方法存根
		LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));
        list.add(data);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (list.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            list.clear();
        }
	}
	@Override
	public void doAfterAllAnalysed(AnalysisContext context) {
		// TODO 自动生成的方法存根
		
	}
}

业务层调用:

	String fileName = "d:/geng.xlsx";
	        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
	        EasyExcel.read(fileName, User.class, new EasyExcelListener()).sheet("模板").doRead();

下面举官网的例子

web 中的写

    /**
     * 文件下载(失败了会返回一个有部分数据的Excel)
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link DownloadData}
     * <p>
     * 2. 设置返回的 参数
     * <p>
     * 3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大
     */
    @GetMapping("download")
    public void download(HttpServletResponse response) throws IOException {
    
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        
        try{
        	 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        	 
        response.setCharacterEncoding("utf-8");
        
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
        
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        
        EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data());
        } catch(Exception e){
        	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));
        }
       
    }

web 中的读

    /**
     * 文件上传
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link UploadData}
     * <p>
     * 2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link UploadDataListener}
     * <p>
     * 3. 直接读即可
     */
    @PostMapping("upload")
    @ResponseBody
    public String upload(MultipartFile file) throws IOException {
        EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();
        return "success";
    }

Copyright © 2002-2019 某某自媒体运营 版权所有