当前位置: 首页 > news >正文

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

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):

 导入依赖:

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

DemoData对象类:

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:

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):

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> {@Overridepublic void invoke(DemoData data, AnalysisContext context) {//没读取到一条数据,执行一次System.out.println(JSON.toJSONString(data));}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 读取完所有执行log.info("所有数据解析完成!");}}

ReadDemo:

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();}
}

结果:

相关文章:

  • 基于ssm Vue的戒烟网站源码和论文
  • 实时流式计算 kafkaStream
  • 【算法思考记录】力扣2653. 滑动子数组的美丽值【C++,滑动窗口】
  • 【算法】希尔排序
  • HR看好的字符函数和字符串处理函数!!!
  • [MySQL]日期和时间函数
  • 计算机网络体系的形成
  • leetcode977. 有序数组的平方
  • springBoot整合task
  • 【STL】手撕 string类
  • llama.cpp部署通义千问Qwen-14B
  • 五分钟带你看完黑客设备
  • WPF窗口样式的比较
  • Chrome显示分享按钮
  • 如何解决谷歌浏览器无法更新、谷歌翻译无法使用问题
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • create-react-app项目添加less配置
  • CSS盒模型深入
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Java,console输出实时的转向GUI textbox
  • python大佬养成计划----difflib模块
  • Python实现BT种子转化为磁力链接【实战】
  • Spring Boot MyBatis配置多种数据库
  • VUE es6技巧写法(持续更新中~~~)
  • 百度小程序遇到的问题
  • 如何设计一个微型分布式架构?
  • 在Docker Swarm上部署Apache Storm:第1部分
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (26)4.7 字符函数和字符串函数
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (九)信息融合方式简介
  • (数据结构)顺序表的定义
  • (转)德国人的记事本
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转)项目管理杂谈-我所期望的新人
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .net core 依赖注入的基本用发
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .NET轻量级ORM组件Dapper葵花宝典
  • .sys文件乱码_python vscode输出乱码
  • :not(:first-child)和:not(:last-child)的用法
  • @property python知乎_Python3基础之:property
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [] 与 [[]], -gt 与 > 的比较
  • [14]内置对象
  • [2016.7 test.5] T1
  • [JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别