Loading...
墨滴

李泽涛。

2021/12/29  阅读:105  主题:极客黑

easyexcel读写、追加操作

easyexcel读写、追加操作

起源

  • 客户又来问题了,csv格式的文件虽然导出数据快了很多,但是呢,有一个问题,开头的0消失,0123导出后为123
  • 我找了几个解决方法,比如在后面在制表符/t,加tab符号,他们还是不满意,原因是他们要统计数据,如果有这些东西,虽然表面上看不出来,但是他们用公司统计的时候会出错
  • 于是我不得不另选办法,比如easy excel这个据说测试 百万数据只要40多秒,我开始尝试了.

POM

<!-- easyexcel 依赖 -->
  <dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>easyexcel</artifactId>
   <version>2.2.7</version>
  </dependency>
  <dependency>
   <groupId>org.apache.xmlbeans</groupId>
   <artifactId>xmlbeans</artifactId>
   <version>2.6.0</version>
  </dependency>

easy excel写入(可追加)

  • 最开始我看博客,搜百度,发现调用真的很简单,加个jar包,一句代码就可以轻松写入,后面我发现这种轻松写入其实不能追加,或者说可以追加,但是需要啥模板,抱歉我不懂,所以我选用了笨一点的方法
  • 第一步 我写了一个方法 init()
    • 这个方法的作用,就是初始化excelWriter和writeSheet
    • excelWriter 写入数据需要的对象
    • writeSheet 写入哪一个标签页 也就是sheet
  • 第二步 doExportExcel()
    • 写入数据 里面就一行代码 excelWriter.write(dataList,writeSheet);
    • excelWriter 刚刚初始化的对象
    • dataList 是写入到excel的数据
    • writeSheet 就是刚刚初始化的sheet
    • 如果需要多次写入,那就多次调用这个方法即可(前提是 这个对象的引用你要一直持有并且没有关闭流)
  • 第三步 finish() 调用关闭流 记住所有操作都做完了,一定要关闭流
  • 下面是例子,我真实用过的,不过我不知道是不是我服务器不行,30w数据需要144秒,用csv的话只用72秒.
package com.eam.util;

import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;

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

/**
 * EasyExcel 操作工具类(写,追加)
 * @author lzt
 * editUser:lizetao
 * editdate:2021/12/28
 *
 */

public class EasyExcelUtil2 {
    private ExcelWriter excelWriter = null;
    private WriteSheet writeSheet = null;

    /** ===========================================================
     *
     *    Purpose      :   EasyExcel工具类 初始化(最先调用)
     *    @params:  absFilePath  绝对路径
     *    @params:  sheetName 标签页名字
     *    @params:  titleList 标题头(第一行)
     *    @return
     *    Author       :   lzt
     *    Created Date :   2021-12-28
     *    Update History
     *    Version       Date               Name            Description
     *    --------  ---------------   --------------  --------------------
     *     V1.0       2021-12-28           lzt            Creation
     * ===========================================================*/

    public void init(String absFilePath, String sheetName, List<String> titleList){
        if(excelWriter ==null&&writeSheet==null){
            List<List<String>> heads = new ArrayList<>(1);
            //表格头标题
            heads.add(titleList);
            // 这里 需要指定写用哪个标题头去写 可以用class 也可以不用
            excelWriter = EasyExcelFactory.write(absFilePath).head(heads).build();
            // 这里注意 如果同一个sheet只要创建一次
            writeSheet = EasyExcelFactory.writerSheet(sheetName).build();
        }
    }
    /** ===========================================================
     *
     *    Purpose      :   EasyExcel工具类 写入excel写内容
     *    @params:  dataList  要插入的数据(多行插入)
     *    @return
     *    Author       :   lzt
     *    Created Date :   2021-12-28
     *    Update History
     *    Version       Date               Name            Description
     *    --------  ---------------   --------------  --------------------
     *     V1.0       2021-12-28           lzt            Creation
     * ===========================================================*/

    public void doExportExcel(List<List<String>> dataList){
        try{
            excelWriter.write(dataList,writeSheet);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    /** ===========================================================
     *
     *    Purpose      :   EasyExcel工具类 关闭(最后调用 关闭流)
     *    @return
     *    Author       :   lzt
     *    Created Date :   2021-12-28
     *    Update History
     *    Version       Date               Name            Description
     *    --------  ---------------   --------------  --------------------
     *     V1.0       2021-12-28           lzt            Creation
     * ===========================================================*/

    public void finish(){
        if(excelWriter!=null){
            excelWriter.finish();
        }
    }

    public static void main(String[] args) {
        EasyExcelUtil2 easyExcelUtil = new EasyExcelUtil2();
        //使用原文件名在java的临时文件夹中创建临时文件
        File file = new File(System.getProperty("java.io.tmpdir"),"测试.xlsx");
        //若临时文件夹中已经存在该文件,则先删除
        if (file.exists()){
            file.delete();
        }
        String absFilePath = file.getAbsolutePath();
        String title = "sheet第1页";
        List<String> lsCol = new ArrayList<>(1);
        lsCol.add("学生");
        lsCol.add("年龄");
        lsCol.add("性别");
        //初始化
        easyExcelUtil.init(absFilePath,title,lsCol);
        //写入数据
        List<List<String>> sumDataList = new ArrayList<>(1);
        List<String> dataList = new ArrayList<>(1);
        dataList.add("张三");
        dataList.add("16");
        dataList.add("女");
        sumDataList.add(dataList);
        //我的追加数据 其实是伪追加 因为只要你没有把流关闭 还是持有这个流的 那么你就可以一直调用这个方法 往里面写数据
        easyExcelUtil.doExportExcel(sumDataList);
        //关闭流
        easyExcelUtil.finish();
    }
}

简单写

/**
 * 学生类
 */

public class Student{
    /**名字*/
    private String name;
    /**年龄*/
    private int age;
    /**金钱*/
    private double money;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }
}
public void simpleWrite() {
        // 文件路径
        String fileName = "c://temp//temp.xlsx";
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        //dataList 就是要插入的数据
        List<Student> dataList = new ArrayList<>(1);
        Student student = new Student();
        student.setName("张三");
        student.setAge(15);
        student.setMoney(100);
        dataList.add(student);
        //Student.class 就是写到表格数据类型的class对象
        //一行代码 把数据写入
        EasyExcel.write(fileName, Student.class).sheet("模板").doWrite(dataList);

    }
  • 关键代码 EasyExcel.write(fileName, Student.class).sheet("模板").doWrite(dataList);
    • write()
      • 第一个参数 文件的绝对路径
      • 第二个参数 写到表格数据类型的class对象
      • 其实write还可以传入file、OutputStream,按实际情况决定传什么,总的来说,我就是哪个简单就传哪个.
    • sheet()
      • 代表要在excel 那个sheet页写入数据,如果不指定,默认在第一个sheet页写入数据,其sheet页的值为:0
      • 也可以指定名字
    • doWrite()
      • 写入数据 里面传的值就是要写入的List集合

忽略列和指定列

/**
     * 忽略列(排除列) excludeColumnFiledNames
     * 指定列(包含列) includeColumnFiledNames
     */

    public void excludeOrIncludeWrite() {
        // 文件路径
        String fileName = "c://temp//temp.xlsx";
        //dataList 就是要插入的数据
        List<Student> dataList = new ArrayList<>(1);
        Student student = new Student();
        student.setName("张三");
        student.setAge(15);
        student.setMoney(100);
        dataList.add(student);
        // 根据用户传入字段 假设我们要忽略 金钱
        Set<String> excludeColumnFiledNames = new HashSet<>(1);
        //注意名字必须要一样
        excludeColumnFiledNames.add("money");
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName, Student.class).excludeColumnFiledNames(excludeColumnFiledNames).sheet("模板")
                .doWrite(dataList)
;

        // 根据用户传入字段 假设我们只要导出 name
        Set<String> includeColumnFiledNames = new HashSet<String>();
        includeColumnFiledNames.add("name");
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName, Student.class).includeColumnFiledNames(includeColumnFiledNames).sheet("模板")
                .doWrite(dataList)
;
    }
  • 主要的差别就是excludeColumnFiledNames和includeColumnFiledNames
  • EasyExcel.write(fileName, Student.class).excludeColumnFiledNames(excludeColumnFiledNames).sheet("模板") .doWrite(dataList);
    • excludeColumnFiledNames 是忽略列的意思,也就是说写入的时候不写入这个列
  • EasyExcel.write(fileName, Student.class).includeColumnFiledNames(includeColumnFiledNames).sheet("模板") .doWrite(dataList);
    • includeColumnFiledNames 是指定列的意思,也就是说写入的时候 写入这个列

结论

  • 不知道是不是服务器的问题还是什么,我测30w数据,其实还是csv比easy excel快,我觉得还是easy excel写入excel操作比写入文本麻烦一些
  • 最后加一下我的微信公众号 楼梯间的男孩 一起成长

李泽涛。

2021/12/29  阅读:105  主题:极客黑

作者介绍

李泽涛。