EasyExcel使用

引入官方依赖

  <!--EasyExcel依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.0-beta2</version>
        </dependency>

创建你的实体类,实体类主要用于和你生成表格的字段相对应,主要通过 @ExcelProperty指定在你的excel生成的表头是什么

@Data
public class DemoData {
    //复杂头写入, @ExcelProperty({"标题头,所有的注解都需要加","字符串标题"})

    @ExcelProperty("字符串标题")
    private String string;
    @ExcelProperty("日期标题")
    private Date date;
    @ExcelProperty("数字标题")
    private Double doubleData;
    /**
     * 忽略这个字段
     */
    @ExcelIgnore
    private String ignore;
}

然后写上一个函数,用于模拟数据库读取的内容


public class demo {
    /**
     * 写入excel是以一个List集合,或者对象进行写入
     * **/
    public List<DemoData> demoDataList(){
        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;
    }
  
}

开始实现写入的操作。他的写入原理就是你传递一个List集合(类型是你要生成excel的对象的类型),并且指定你的生成路径就OK了

public class WriteExcel {
    /**
     * 写入excel
     * **/
     //获取电脑桌面的路径
    FileSystemView view = FileSystemView.getFileSystemView();
    File file = view.getHomeDirectory();
    final String desktop=file.getPath()+"\\";
    //传递的路径=生成文件的路径+你的文件名(后缀.xlsx根据需求改变)
    final String fileName = desktop+"EasyExcel.xlsx";
    @Test
    public void simpleWrite(){
        //路径加上名称
        EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(new demo().demoDataList());
    }
}

写入完成之后,怎么进行读取呢。首先原理是,定义一个类通过继承监听器AnalysisEventListener《你生成excel的实体类对象》并且实现他的接口方法。
invoke()方法主要作用:每当我们读取一行excel信息,他就会执行一次 invoke()方法,这个时候我们就可以在这方法中,进行数据持久化
doAfterAllAnalysed()方法作用:就是在excel全部读取完成之后在执行。

public class DemoDataListener extends AnalysisEventListener<DemoData> {
    private static final int BATCH_COUNT = 5;
    List<DemoData> list = new ArrayList<DemoData>();
    /**
     * 这个事情监听(每读取excel一条数据就会执行一次)。
     * **/
    @Override
    public void invoke(DemoData demoData, AnalysisContext analysisContext) {
        list.add(demoData);
        // 对于数据量大的时候达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
       /* if (list.size() >= BATCH_COUNT) {
        }*/
        // 调用持久层
        System.err.println(demoData.toString());
      //  SaveDate(list);
        list.clear();//清空每次读取的内容,释放内存
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        //注意,如果想要在全部读取完成之后在插入,上面的  list.clear();一定要注释
        SaveDate(list);
        System.err.println("Excel全都读取完成后执行这个函数");
    }

    public void SaveDate(List<DemoData> demoData){
        List<DemoData> save = new ArrayList<>();
        System.out.println("进行持久化,数组长度是:"+demoData.size());
    }
}

监听器写完之后,开始进行读取操作,持久化数据在监听器中完成即可

  /**
     * 读取---需要写上监听器继承他封装的AnalysisEventListener<我们读取的类型>
     * **/
    @Test
    public void ReadExcel(){
           EasyExcel.read(fileName,DemoData.class,new DemoDataListener()).sheet().doRead();
    }

这样一来就完成简单的读写操作了。
进阶操作
1:通过流上传

 <input type="file" name="editormd-image-file"  id="file2" onchange="updateHead(this)>"
 //js
   function updateHead(e) {
        var form = new FormData();
        form.append("editormd-image-file", document.getElementById("file2").files[0]);
        $.ajax({
            url: "/file/upload",    //后台url
            data: form,
            cache: false,
            async: false,
            type: "POST",          //类型,POST或者GET
            dataType: 'json',       //数据返回类型,可以是xml、json等
            processData: false,
            contentType: false,
            success: function (data) {
                console.log(data)
            },

        });
    }

通过java获取InputStream 流对象,然后将流对象传入到上面方法中,但是参数改变了不在是路径,而是流的对象InputStream类型

   MultipartHttpServletRequest multipartHttpServletRequest=(MultipartHttpServletRequest) request;
            MultipartFile file = multipartHttpServletRequest.getFile("editormd-image-file");
            InputStream inputStream = file.getInputStream();//获取文件名

重写刚刚读取的方法

 public void ReadExcel2(InputStream fileName){
        System.err.println("fileName:"+fileName);
        EasyExcel.read(fileName,DemoData.class,new DemoDataListener()).sheet().doRead();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值