【EasyExcel】Excel操作(九):Excel读取写入一条龙

如果你想和别人制造牵绊,就要承受流泪的风险。

简单介绍

在之前的excel系列博客 [点击进入] 中给大家带来了Apace POI对excel的操作,今天给大家带来顾名思义炒鸡简单的EasyExcel对excel的操作!!!

那么什么是EasyExcel呢?我们来到它的github地址:https://github.com/alibaba/easyexcel,发现:
在这里插入图片描述
或者我们来到它的官方文档:https://www.yuque.com/easyexcel/doc/easyexcel
在这里插入图片描述
再点击 关于EasyExcel
在这里插入图片描述
我们就会发现:其实EasyExcel底层就是我们之前讲的Apache POI,但是又有着一些不同

至于更多精彩内容,大家可以自行通过以上我提供的EasyExcel的GitHub和文档地址去发掘。下面,我们就进入实战吧,让大家能够快速上手!!!

快速上手

所需依赖

		<!-- web的起步依赖 -->
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>
		<!-- EasyExcel的依赖 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.6</version>
        </dependency>
        <!-- 测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

所需实体类

EasyExcel是直接基于实体类读写的,使用它提供的注解即可,再也不用像以前POI那样麻烦了:

package start.excel.entity;

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

import java.util.Date;

@Data // 若未使用lombok插件,请自行生成getter、setter以及toString方法
public class DemoData {

    @ExcelProperty("字符串标题")
    private String string;

    @ExcelProperty("日期标题")
    private Date date;

    @ExcelProperty("数字标题")
    private Double doubleData;
    
    /**
     * 忽略这个字段
     */
    @ExcelIgnore
    private String ignore;
}

以下是EasyExcel官方给的注解解释:
在这里插入图片描述

基本的写

直接上代码,解释见注释:

package start.excel.easyexcel;

import com.alibaba.excel.EasyExcel;
import org.junit.Test;
import start.excel.entity.DemoData;

import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @ClassName EasyExcelRead
 * @Description easyexcel本地生成文件演示
 * @Author 古阙月
 * @Date 2020/11/28 10:47
 * @Version 1.0
 */
public class EasyExcelWrite {

    /**
     * 需要写入的文件路径
     */
    private static final String PATH = "D:\\IdeaProjects\\my_study_demo\\src\\main\\java\\start\\excel\\easyexcel";

    /**
     * 数据部分 - 生成实体类集合
     * @return
     */
    private List<DemoData> data() {
        List<DemoData> list = new ArrayList<DemoData>();
        for (int i = 0; i < 10; i++) {
            DemoData data = new DemoData();
            data.setString("字符串" + i);
            data.setDate(new Date());
            data.setDoubleData(0.56);
            list.add(data);
        }
        return list;
    }

    /**
     * 最简单的写
     */
    @Test
    public void simpleWrite() {

        String fileName = PATH + File.separator + "demo.xlsx";
        String sheetName = "模板";

        /**
         * fileName - 文件名(包含路径)
         * DemoData.class - 实体类的反射对象
         * sheetName - 工作表的名称
         * data() - 数据部分(实体类集合)
         */
        EasyExcel.write(fileName, DemoData.class).sheet(sheetName).doWrite(data());
    }
}

运行后到PATH的路径下找到名为demo.xlsx的excel文件查看:
在这里插入图片描述
写入成功!!!

基本的读

读入部分:

package start.excel.easyexcel;

import com.alibaba.excel.EasyExcel;
import org.junit.Test;
import start.excel.entity.DemoData;

import java.io.File;

/**
 * @ClassName EasyExcelRead
 * @Description easyexcel读取示范
 * @Author 古阙月
 * @Date 2020/11/28 11:01
 * @Version 1.0
 */
public class EasyExcelRead {

    /**
     * 读取的excel所在的路径
     */
    private static final String PATH = "D:\\IdeaProjects\\my_study_demo\\src\\main\\java\\start\\excel\\easyexcel";

    /**
     * 最简单的读
     * 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
     * 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
     */
    @Test
    public void simpleRead() {
        
        // 路径的文件名 - 即文件所在位置,通过它能找到这个文件
        String fileName = PATH + File.separator + "demo.xlsx";
        
        /**
         * fileName - 文件名(包含路径)
         * DemoData.class - 实体类的反射对象
         * new DemoDataListener() - 监听器
         * sheetName - 工作表的名称
         * data() - 数据部分(实体类集合)
         */
        EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();

    }
}

在监听器里面拿到数据:

package start.excel.easyexcel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import start.excel.entity.DemoData;

import java.util.ArrayList;
import java.util.List;

// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
public class DemoDataListener extends AnalysisEventListener<DemoData> {

    /**
     * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 6;
    
    List<DemoData> list = new ArrayList<DemoData>();

    /**
     * 这个每一条数据解析都会来调用
     * @param data
     * @param context
     */
    @Override
    public void invoke(DemoData data, AnalysisContext context) {

        System.out.println("解析到一条数据:" + JSON.toJSONString(data));
        list.add(data);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (list.size() >= BATCH_COUNT) {

            // 存储完成清理 list
            list.clear();
        }
    }
    /**
     * 所有数据解析完成了 都会来调用
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println("最后一次解析了" + list.size() + "条数据!");
        System.out.println("所有数据解析完成!");
    }
}

运行得:
在这里插入图片描述
解析完成!这里在监听器DemoDataListener里面采取了分批处理数据,如我们现在总共有10条数据,我们选择一次解析6条,那么第2次还剩下4条数据也就是最后一次解析了4条数据。当然,如果我们想把数据存入数据库,在监听器DemoDataListener里面操作就好。

web端的写入

代码如下:

package start.excel.easyexcel;

import com.alibaba.excel.EasyExcel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import start.excel.entity.DemoData;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @ClassName EasyExcelWriteWeb
 * @Description Web中的写
 * @Author 古阙月
 * @Date 2020/12/8 21:38
 * @Version 1.0
 */
@RestController
@RequestMapping("excel")
public class EasyExcelWriteWeb {

    /**
     * 数据部分 - 生成实体类集合
     * @return
     */
    private List<DemoData> data() {
        List<DemoData> list = new ArrayList<DemoData>();
        for (int i = 0; i < 10; i++) {
            DemoData data = new DemoData();
            data.setString("字符串" + i);
            data.setDate(new Date());
            data.setDoubleData(0.56);
            list.add(data);
        }
        return list;
    }

    /**
     * excel文件下载(失败了会返回一个有部分数据的Excel)
     */
    @GetMapping("download")
    public void download(HttpServletResponse response) throws IOException {
        // 使用swagger 会导致各种问题,请直接用浏览器或者用postman
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");

        // 文件名 - URLEncoder.encode可以防止中文乱码
        String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

        // 工作表名称
        String sheetName = "测试";

        /**
         * DemoData.class  - 创建excel对应的实体对象
         * sheetName - 工作表名称
         * data() - 数据部分
         */
        EasyExcel.write(response.getOutputStream(), DemoData.class).sheet(sheetName).doWrite(data());
    }
}

本地启动SpringBoot应用程序,因为没有在配置文件application.yml中配置端口,所以端口默认为8080
在这里插入图片描述
在浏览器输入:http://localhost:8080/excel/download
在这里插入图片描述
点开左下角的excel文件:
在这里插入图片描述
完美!!!

  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
你可以使用阿里巴巴的EasyExcel开源库来读取Excel文件,并将其写入到List<Map>中。下面是一个示例代码: ```java public List<Map<String, Object>> readExcel(File file) { List<Map<String, Object>> list = new ArrayList<>(); ExcelReader excelReader = null; try { // 创建 ExcelReader 对象 excelReader = EasyExcel.read(file).build(); // 获取第一个工作表 ReadSheet readSheet = EasyExcel.readSheet(0).build(); // 读取数据并写入到 List<Map> 中 excelReader.read(readSheet).headRowNumber(1).registerReadListener(new ReadListener() { private List<String> headList; @Override public void onReadSheet(int sheetIndex, String sheetName) { } @Override public void onReadRowData(List<String> rowData, AnalysisContext context) { if (headList == null) { // 第一为表头,记录表头信息 headList = rowData; } else { // 将每数据转换为 Map,并添加到 List 中 Map<String, Object> map = new HashMap<>(); for (int i = 0; i < headList.size(); i++) { map.put(headList.get(i), rowData.get(i)); } list.add(map); } } @Override public void onException(Exception exception, AnalysisContext context) { } }).doRead(); } catch (Exception e) { e.printStackTrace(); } finally { // 关闭 ExcelReader 对象 if (excelReader != null) { excelReader.finish(); } } return list; } ``` 该方法接收一个Excel文件作为参数,并返回一个List<Map>对象。在方法中,我们使用EasyExcel库的read方法创建ExcelReader对象,然后使用readSheet方法获取第一个工作表。接着,我们使用registerReadListener方法注册一个ReadListener实例,该实例在读取Excel文件时会被调用。在ReadListener实例中,我们通过onReadRowData方法读取每一数据并将其转换为Map对象,最后将Map对象添加到List中。最后,我们关闭ExcelReader对象并返回List<Map>对象。 需要注意的是,该代码使用了Java 8的Lambda表达式语法。如果你使用的是Java 7或更早的版本,请将Lambda表达式替换为匿名内部类。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值