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

本文详细介绍了如何使用EasyExcel进行Excel数据的读写操作,包括创建实体类、写入数据到Excel以及读取Excel数据。此外,还展示了EasyExcel在Web应用中的下载和上传功能,提供了详细的代码示例,帮助开发者快速理解和应用EasyExcel。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【项目复盘】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";
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GengMS_DEV

你的鼓励就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值