JAVA代码优化:Easy Excel(操作Excel文件的开源工具)

news/2024/7/10 20:06:26 标签: excel, java, 开发语言, 开源

Easy Excel官网:

EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel (alibaba.com)

https://easyexcel.opensource.alibaba.com/

Easy Excel的特点和优势:

  1. 简单易用:Easy Excel提供了简洁的API,使用起来非常方便。开发人员可以通过几行代码就能实现Excel文件的读写操作。

  2. 高性能:Easy Excel采用了基于流的方式进行读写操作,能够处理大规模的Excel文件,并且具有较高的读写性能。

  3. 多格式支持:Easy Excel支持多种常见的Excel文件格式,包括xls、xlsx等。开发人员可以根据自己的需求选择适合的格式进行读写操作。

  4. 数据转换:Easy Excel提供了灵活的数据转换功能,可以将Excel文件中的数据转换成Java对象或者将Java对象转换成Excel文件中的数据。

  5. 样式设置:Easy Excel支持设置Excel文件中单元格的样式,包括字体、颜色、边框等,可以使生成的Excel文件更加美观。

  6. 导入导出功能:Easy Excel提供了便捷的导入导出功能,可以快速地将Java对象导出为Excel文件,或者将Excel文件中的数据导入到Java对象中进行处理。 

前期准备:

Excel表格位置为(d:\\read.xlsx):

 导入依赖:

java"><dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.0.5</version>
</dependency>

DemoData对象类:

java">package com.muyuan.review.pojo;


import com.alibaba.excel.annotation.ExcelProperty;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

import java.util.Date;

@Getter
@Setter
@EqualsAndHashCode
public class DemoData {
    //注意名字与表格列名匹配
    //否则会报错  can not find data format for:
    //字段顺序与表格列顺序一致

    //注解优先级大于索引
    @ExcelProperty("数字")
    private Double doubleData;
    @ExcelProperty("用户名")
    private String string;
    @ExcelProperty("日期")
    private Date date;
}

简单用法一:

ReadDemo:

java">import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.listener.PageReadListener;
import com.alibaba.fastjson.JSON;
import com.muyuan.review.pojo.DemoData;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class ReadDemo {
    public static void main(String[] args) {
        // 写法1:JDK8+ ,不用额外写一个DemoDataListener
        // since: 3.0.0-beta1
        //原:  String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
        //改: 获取文件路径
        String fileName = "d:\\read.xlsx";
        // 这里默认每次会读取100条数据 然后返回过来 直接调用使用数据就行
        // 具体需要返回多少行可以在`PageReadListener`的构造函数设置
        EasyExcel.read(
                //文件路径
                fileName,
                //字体类的字节码DemoData对象
                DemoData.class,
                //读取到一条数据的监听器
                new PageReadListener<DemoData>(dataList -> {
            for (DemoData demoData : dataList) {
                log.info("读取到一条数据{}",
                        //格式化转化读到的数据转化为JSON字符串
                        JSON.toJSONString(demoData));
            }
        })).sheet().doRead();
    }
}

结果:

简单用法二(使用监听器): 

注意:很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去

 监听器(ReadDemoListener):

java">package com.muyuan.review.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.muyuan.review.pojo.DemoData;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.ReadListener;
import javax.swing.event.AncestorListener;
import java.io.IOException;

/**
 * @Classname ReadDemoListener
 * @Description
 * @Date 2023/12/3 12:17
 * @Created by 玉满堂
 */
// 有个很重要的点 DemoDataListener 不能被spring管理,
// 要每次读取excel都要new,然后里面用到spring可以构造方法传进去
//DemoData读取到每一个对象的泛型
@Slf4j
public class ReadDemoListener extends AnalysisEventListener<DemoData> {

    @Override
    public void invoke(DemoData data, AnalysisContext context) {
        //没读取到一条数据,执行一次
        System.out.println(JSON.toJSONString(data));
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 读取完所有执行
        log.info("所有数据解析完成!");
    }

}

ReadDemo:

java">import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.PageReadListener;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.fastjson.JSON;
import com.muyuan.review.listener.ReadDemoListener;
import com.muyuan.review.pojo.DemoData;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class ReadDemo {
    public static void main(String[] args) {
        // 写法1:JDK8+ ,不用额外写一个DemoDataListener
        // since: 3.0.0-beta1
        //原:  String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
        //改: 获取文件路径
        String fileName = "d:\\read.xlsx";
        EasyExcel.read(
                //文件路径
                fileName,
                //文件字节码对象
                DemoData.class,
                //监听器(在解析过程中接收和处理数据)
                new ReadDemoListener()
        )
                //指定要读取的Sheet页,默认为第一个Sheet页
                .sheet()
                //执行实际的读取和解析操作
                .doRead();

    }
}

结果:


http://www.niftyadmin.cn/n/5242410.html

相关文章

【一周AI简讯】亚马逊推出企业级生成式AI聊天机器人,英伟达黄仁勋称AI将在5年内赶超人类

亚马逊推出企业级生成式AI聊天机器人Amazon Q 周二&#xff0c;亚马逊的云计算部门亚马逊网络服务 (AWS)推出了 Amazon Q&#xff0c;这是一款生成式 AI 聊天机器人。与 ChatGPT 和 Bard 不同&#xff0c;Amazon Q 并不基于单一的 AI 模型。相反&#xff0c;它在一个名为 Bedr…

浅谈可重入与线程安全

文章目录 可重入与线程安全的关系 可重入 若一个程序或子程序可以“在任意时刻被中断然后操作系统调度执行另一段代码&#xff0c;这段代码又使用了该副程序不会出错”&#xff0c;则称其为可重入&#xff08;reentrant 或 re-entrant&#xff09;的。即当该副程序正在运作时&…

信息化系列——企业信息化建设(3)

期待已久的对策&#xff0c;马上”出炉“&#xff0c;第一次看的朋友&#xff0c;建议现在主页看看&#xff08;1&#xff09;和&#xff08;2&#xff09;&#xff0c;那咱们就废话少说了&#xff0c;开始今天的正题。 企业信息化建设对策 1、增强企业信息化意识 企业管理者…

c++--类型的基础

1.常量对象&#xff0c;常量成员函数 (1).常量对象 常量对象的引用和指针不能调用类的普通的成员函数。只能调用常量成员函数。 (2).常量成员函数&#xff1a;把const放在类成员函数参数列表后。表示隐含的this是一个指向常量的指针 (3).当创建一个const对象时&#xff0c;直到…

力扣labuladong——一刷day63

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣1080. 根到叶路径上的不足节点二、力扣117. 填充每个节点的下一个右侧节点指针 II三、力扣662. 二叉树最大宽度 前言 二叉树大部分题目都可以用递归的算…

Python 围圈报数

题目:有n个人围成一圈&#xff0c;顺序排号。从第一个人开始报数&#xff08;从1到3报数&#xff09;&#xff0c;凡报到3的人退出圈子&#xff0c;问最后留下的是原来第几号的那位。 输入&#xff1a;8 输出&#xff1a;7 用list实现循环遍历的过程 import copy a[1,2,3,4…

python爬虫-某公开数据网站实例小记

注意&#xff01;&#xff01;&#xff01;&#xff01;某XX网站逆向实例仅作为学习案例&#xff0c;禁止其他个人以及团体做谋利用途&#xff01;&#xff01;&#xff01; 第一步&#xff1a;分析页面和请求方式 此网站没有技巧的加密&#xff0c;仅是需要携带cookie和请求…

Linux定时器

setitimer实现定时器 通过itimerval结构体以及setitimer函数产生的信号&#xff0c;系统随之使用signal信号处理函数来处理产生的定时信号&#xff0c;从而实现定时器。 itimerval结构体 struct itimerval {struct timeval it_interval;struct timeval it_value; };//it_int…