zoukankan      html  css  js  c++  java
  • java 导入导出比较好用的两个工具

    1.easypoi

    说明:easypoi 的底层也是基于 apache poi 进行深度开发的,它主要的特点就是将更多重复的工作,全部简单化,避免编写重复的代码!

    下面,我们就一起来了解一下这款高大上的开源工具:easypoi

    详细配置:

    1.1添加依赖包

    <dependencies>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-web</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-annotation</artifactId>
            <version>4.1.0</version>
        </dependency>
    </dependencies>

    1.2 采用注解导入导出

    easypoi 最大的亮点就是基于注解实体类来导出、导入excel,使用起来非常简单!

    首先,我们创建一个实体类teatcherEntity,其中@Excel注解表示导出文件的头部信息。

    @Data
    public class UserEntity { @Excel(name = "姓名") private String name; @Excel(name = "年龄") private int age; @Excel(name = "操作时间",format="yyyy-MM-dd HH:mm:ss", width = 20.0) private Date time; //set、get省略 }

    接着,我们来编写导出服务!

    public static void main(String[] args) throws Exception {
        List<UserEntity> dataList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            UserEntity userEntity = new UserEntity();
            userEntity.setName("张三" + i);
            userEntity.setAge(20 + i);
            userEntity.setTime(new Date(System.currentTimeMillis() + i));
            dataList.add(userEntity);
        }
        //生成excel文档
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户","用户信息"),
                UserEntity.class, dataList);
        FileOutputStream fos = new FileOutputStream("/Users/hello/Documents/easypoi-user1.xls");
        workbook.write(fos);
        fos.close();
    }

    导出的文件预览如下:

     

    对应的导入操作,也很简单,源码如下:

    public static void main(String[] args) {
        ImportParams params = new ImportParams();
        params.setTitleRows(1);
        params.setHeadRows(1);
        long start = new Date().getTime();
        List<StudentEntity> list = ExcelImportUtil.importExcel(new File("/Users/hello/Documents/easypoi-user1.xls"),
                UserEntity.class, params);
        System.out.println(new Date().getTime() - start);
        System.out.println(JSONArray.toJSONString(list));
    }

    运行程序,输出结果如下:

    [{"age":20,"name":"张三0","time":1616919493000},
    {"age":21,"name":"张三1","time":1616919493000},
    {"age":22,"name":"张三2","time":1616919493000},
    {"age":23,"name":"张三3","time":1616919493000}]

    1.3自定义数据结构导出导入
    easypoi 同样也支持自定义数据结构导出导入excel。
    public static void main(String[] args) throws Exception {
        //封装表头
        List<ExcelExportEntity> entityList = new ArrayList<ExcelExportEntity>();
        entityList.add(new ExcelExportEntity("姓名", "name"));
        entityList.add(new ExcelExportEntity("年龄", "age"));
        ExcelExportEntity entityTime = new ExcelExportEntity("操作时间", "time");
        entityTime.setFormat("yyyy-MM-dd HH:mm:ss");
        entityTime.setWidth(20.0);
        entityList.add(entityTime);
        //封装数据体
        List<Map<String, Object>> dataList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Map<String, Object> userEntityMap = new HashMap<>();
            userEntityMap.put("name", "张三" + i);
            userEntityMap.put("age", 20 + i);
            userEntityMap.put("time", new Date(System.currentTimeMillis() + i));
            dataList.add(userEntityMap);
        }
        //生成excel文档
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("学生","用户信息"), entityList, dataList);
        FileOutputStream fos = new FileOutputStream("/Users/panzhi/Documents/easypoi-user2.xls");
        workbook.write(fos);
        fos.close();
    }
    导入 excel
    public static void main(String[] args) {
        ImportParams params = new ImportParams();
        params.setTitleRows(1);
        params.setHeadRows(1);
        long start = new Date().getTime();
        List<Map<String, Object>> list = ExcelImportUtil.importExcel(new File("/Users/panzhi/Documents/easypoi-user2.xls"),
                Map.class, params);
        System.out.println(new Date().getTime() - start);
        System.out.println(JSONArray.toJSONString(list));
    }
     

    2.easyexcel

    easyexcel 是阿里巴巴开源的一款 excel 解析工具,底层逻辑也是基于 apache poi 进行二次开发的。不同的是,再读写数据的时候,采用 sax 模式一行一行解析,在并发量很大的情况下,依然能稳定运行!

    2.1首先添加依赖包

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.6</version>
        </dependency>
     <!--常用工具库-->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>29.0-jre</version>
        </dependency>
    </dependencies>

    采用注解导出导入

    easyexcel 同样也支持采用注解方式进行导出、导入!

    首先,我们创建一个实体类UserEntity,其中@ExcelProperty注解表示导出文件的头部信息

    @Data
    public class UserEntity { @ExcelProperty(value = "姓名") private String name; @ExcelProperty(value = "年龄") private int age; @DateTimeFormat("yyyy-MM-dd HH:mm:ss") @ExcelProperty(value = "操作时间") private Date time; //set、get省略 }
    接着,我们来编写导出服务
    public static void main(String[] args) {
        List<UserEntity> dataList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            UserEntity userEntity = new UserEntity();
            userEntity.setName("张三" + i);
            userEntity.setAge(20 + i);
            userEntity.setTime(new Date(System.currentTimeMillis() + i));
            dataList.add(userEntity);
        }
        EasyExcel.write("/Users/hello/Documents/easyexcel-user1.xls", UserEntity.class).sheet("用户信息").doWrite(dataList);
    }

     导出的图片:

    导入操作也很简单,源码如下:

     
    public static void main(String[] args) {
        String filePath = "/Users/hello/Documents/easyexcel-user1.xls";
        List<DemoData> list = EasyExcel.read(filePath).head(UserEntity.class).sheet().doReadSync();
        System.out.println(JSONArray.toJSONString(list));
    }

    2.2自定义导入导出也很简单:

      自定义数据导出 excel:

    public static void main(String[] args) {
        //表头
        List<List<String>> headList = new ArrayList<>();
        headList.add(Lists.newArrayList("姓名"));
        headList.add(Lists.newArrayList("年龄"));
        headList.add(Lists.newArrayList("操作时间"));
    
        //数据体
        List<List<Object>> dataList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            List<Object> data = new ArrayList<>();
            data.add("张三" + i);
            data.add(20 + i);
            data.add(new Date(System.currentTimeMillis() + i));
            dataList.add(data);
        }
        EasyExcel.write("/Users/hello/Documents/easyexcel-user2.xls").head(headList).sheet("用户信息").doWrite(dataList);
    }

    自定义数据导入 excel:

     
    public static void main(String[] args) {
        String filePath = "/Users/panzhi/Documents/easyexcel-user2.xls";
        UserDataListener userDataListener = new UserDataListener();
        EasyExcel.read(filePath, userDataListener).sheet().doRead();
        System.out.println("表头:" + JSONArray.toJSONString(userDataListener.getHeadList()));
        System.out.println("数据体:" + JSONArray.toJSONString(userDataListener.getDataList()));
    }

     总结:

    总体来说,easypoi和easyexcel都是基于apache poi进行二次开发的。

    不同点在于:

    1、easypoi 在读写数据的时候,优先是先将数据写入内存,优点是读写性能非常高,但是当数据量很大的时候,会出现oom,当然它也提供了 sax 模式的读写方式,需要调用特定的方法实现。

    2、easyexcel 基于sax模式进行读写数据,不会出现oom情况,程序有过高并发场景的验证,因此程序运行比较稳定,相对于 easypoi 来说,读写性能稍慢!

    easypoi 与 easyexcel 还有一点区别在于,easypoi 对定制化的导出支持非常的丰富,如果当前的项目需求,并发量不大、数据量也不大,但是需要导出 excel 的文件样式千差万别,那么我推荐你用 easypoi;反之,使用 easyexcel !

     
    我是个双鱼座的小王子,沉浸在自己的代码世界里,去探索这未知的世界,希望遇到更多的小伙伴一起前行!
  • 相关阅读:
    从解放劳动力来看未来的科技进程
    流程变换与抽象
    EntityFramework Any 生成的sql语句超长。
    值类型引用类型List Remove 方法Remove不掉哪一个项。
    CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14
    SVN的安装配置(linux)
    【题解】洛谷 P1979 [NOIP2013 提高组] 华容道 | 20211119 模拟赛 Y【BFS 最短路】
    【题解】[Codechef CALLSCHE] Call Center Schedule | 20211127 模拟赛 或负(fortune)【网络流】
    【题解】[Codeforces 1086F] Forest Fires | 20211119 模拟赛 o【插值 扫描线】
    NOIP2021 SC 迷惑行为小赏
  • 原文地址:https://www.cnblogs.com/zxy-come-on/p/15190947.html
Copyright © 2011-2022 走看看