欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java操作excel表格详解

程序员文章站 2022-03-23 11:02:43
目录什么是easyexcel使用场景1、将用户信息导出为excel表格(导出数据....)2、将excel表中的信息录入到网站数据库(习题上传....)大大减轻网站录入量!开发中经常会设计到excel...

使用场景

1、将用户信息导出为excel表格(导出数据....)

2、将excel表中的信息录入到网站数据库(习题上传....)大大减轻网站录入量!开发中经常会设计到excel的处理,如导出excel,导入excel到数据库中!

操作excel目前比较流行的就是apache poi和阿里巴巴的easyexcel !

这里我们主要使用easyexcel进行操作

什么是easyexcel

easyexcel是一个基于java的简单、省内存的读写excel的开源项目。在尽可能节约内存的情况下支持读写百m的excel。

官网:easyexcel · 语雀 (yuque.com)

一个excel表格由工作簿、工作表、行、列组成

写入表格

java操作excel表格详解

1、引入依赖

       <!-- easyexcel-->
        <dependency>
            <groupid>com.alibaba</groupid>
            <artifactid>easyexcel</artifactid>
            <version>2.2.0-beta2</version>
        </dependency>
        <dependency>
            <groupid>com.alibaba</groupid>
            <artifactid>fastjson</artifactid>
            <version>1.2.54</version>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupid>org.projectlombok</groupid>
            <artifactid>lombok</artifactid>
            <version>1.18.20</version>
        </dependency>
        <!--日期格式化工具-->
        <dependency>
            <groupid>joda-time</groupid>
            <artifactid>joda-time</artifactid>
            <version>2.10.10</version>
        </dependency>
        <!--test-->
        <dependency>
            <groupid>junit</groupid>
            <artifactid>junit</artifactid>
            <version>4.13.2</version>
        </dependency>

2、先创建与表对应的实体类

@data
public class demodata {
    @excelproperty("字符串标题")
    private string string;
    @excelproperty("日期标题")
    private date date;
    @excelproperty("数字标题")
    private double doubledata;
    /**
     * 忽略这个字段
     */
    @excelignore
    private string ignore;
}

3、生成表格

 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;
    }
     //根据list 写入excel
    @test
    public void simplewrite() {
        string path = "d:\\qdsystem\\resources\\下载\\";
        // 写法1
        string filename = path + "qiadnu.xlsx";
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        easyexcel.write(filename, demodata.class).sheet("模板").dowrite(data());
    }

读取表格

1、实体类 同上。

2、解析

// 有个很重要的点 demodatalistener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
public class demodatalistener extends analysiseventlistener<demodata> {
    private static final logger logger = loggerfactory.getlogger(demodatalistener.class);
    /**
     * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int batch_count = 5;
    list<demodata> list = new arraylist<demodata>();
    /**
     * 假设这个是一个dao,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
     */
    private demodao demodao;
    public demodatalistener() {
        // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
        demodao = new demodao();
    }
    /**
     * 如果使用了spring,请使用这个构造方法。每次创建listener的时候需要把spring管理的类传进来
     *
     * @param demodao
     */
    public demodatalistener(demodao demodao) {
        this.demodao = demodao;
    }
    /**
     * 这个每一条数据解析都会来调用
     * @param context
     */
    @override
    public void invoke(demodata data, analysiscontext context) {
        logger.info("解析到一条数据:{}", json.tojsonstring(data));
        list.add(data);
        // 达到batch_count了,需要去存储一次数据库,防止数据几万条数据在内存,容易oom
        if (list.size() >= batch_count) {
            savedata();
            // 存储完成清理 list
            list.clear();
        }
    }
    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context
     */
    @override
    public void doafterallanalysed(analysiscontext context) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
        savedata();
        logger.info("所有数据解析完成!");
    }
    /**
     * 加上存储数据库
     */
    private void savedata() {
        logger.info("{}条数据,开始存储数据库!", list.size());
        demodao.save(list);
        logger.info("存储数据库成功!");
    }
}

dao层

/**
 * 假设这个是你的dao存储。当然还要这个类让spring管理,当然你不用需要存储,也不需要这个类。
 **/
public class demodao {
    public void save(list<demodata> list) {
        // 如果是mybatis,尽量别直接调用多次insert,自己写一个mapper里面新增一个方法batchinsert,所有数据一次性插入
    }
}

3、测试

    @test
    public void simpleread() {
        // 有个很重要的点 demodatalistener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
        // 写法1:
        string filename = path + "qiadnu.xlsx";
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
        easyexcel.read(filename, demodata.class, new demodatalistener()).sheet().doread();
    }

这里只是简单使用,具体到官方文档进行解读

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!

相关标签: java excel 操作