easyexcel源码分析

news/2025/1/17 4:50:00/

MAVEN依赖包

        <!--easyexcel依赖--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version></dependency><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.29</version></dependency>

demo代码

package com.example.demoeasyexcel.read;import java.io.File;
import java.util.List;
import java.util.Map;import com.alibaba.excel.EasyExcel;import lombok.extern.slf4j.Slf4j;/*** 读的常见写法** @author Jiaju Zhuang*/@Slf4j
public class ReadTest {public static void main(String[] args) {String fileName = "D:\\新建文本文档.csv";// 这里 需要指定读用哪个class去读,然后读取第一个sheetEasyExcel.read(fileName, ExceptionDemoData.class, new DemoExceptionListener()).sheet().doRead();}}

com.alibaba.excel.read.builder.ExcelReaderSheetBuilder#doRead

com.alibaba.excel.ExcelReader#read(java.util.List<com.alibaba.excel.read.metadata.ReadSheet>)

com.alibaba.excel.analysis.ExcelAnalyser#analysis

com.alibaba.excel.analysis.ExcelAnalyserImpl#analysis

com.alibaba.excel.analysis.ExcelReadExecutor#execute

com.alibaba.excel.analysis.csv.CsvExcelReadExecutor#execute

往后用了org.apache.commons.csv中的CSVParser来读取excel

============

所以直接再写个org.apache.commons.csv的demo

package com.example.demoeasyexcel.read;import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;public class CsvReaderDemo {public static void main(String[] args) {String fileName = "D:\\新建文本文档.csv";try {Reader reader = new FileReader(fileName);// Create a CSVParser with the appropriate formatCSVFormat aDefault = CSVFormat.DEFAULT;CSVParser csvParser = new CSVParser(reader,aDefault);// Loop through each record (row) in the CSV filefor (CSVRecord record : csvParser) {// Access data from each record by column index or column nameString column1Value = record.get(0); // Get data from the first columnString column2Value = record.get(1); // Get data from the second column// and so on...// Process or print the data as neededSystem.out.println("Column 1: " + column1Value + ", Column 2: " + column2Value);}// Close the CSVParser and underlying ReadercsvParser.close();reader.close();} catch (IOException e) {e.printStackTrace();}}
}

在CSVFormat aDefault = CSVFormat.DEFAULT;这行代码中,指定了后续读取CSV文件的一些规则,比如分隔符(delimiter)是逗号,每行数据的分隔符(recordSeparator)是CRLF(\r\n)。

开始迭代读取

org.apache.commons.csv.CSVParser#nextRecord

org.apache.commons.csv.Lexer#nextToken

每次读一个char

org.apache.commons.csv.Lexer#parseSimpleToken

拼接完成

token.content.append((char) ch);
ch = reader.read(); // continue


http://www.ppmy.cn/news/974392.html

相关文章

2023牛客暑假多校训练营2

D.The Game of Eating 贪心 题目说每个人只关心自己享用的菜肴,而不考虑他人,每个人的目标都是使得自己喜欢的菜肴尽可能多 也就是说每个人都很鸡贼,它们当下都是做出最有利于自己的选择,对于某一个人,他首先会算在他之后他最喜欢的菜是否会被选择,如果会被选择,那么他就不选自…

tp6 实现excel 导入功能

在项目根目录安装 composer require phpoffice/phpspreadsheet 我们看一下郊果图&#xff0c;如下 点击导入excel表格数据 出现弹窗选择文件&#xff0c;控制台打开输出文档内容 前端layui代码 <form id"uploadForm" class"form-horizontal" encty…

SpringBoot(三)

文章目录 前言一.日志的作用二.日志的使用2.1 自定义日志打印三.日志的级别3.1 日志级别的作用3.2 日志级别的分类和使用 四.⽇志持久化 前言 日志在应用程序中扮演着至关重要的角色&#xff0c;它是软件开发、运维和故障排查中不可或缺的工具。无论是大型企业级应用还是小型个…

无涯教程-HTML Event Reference

当用户访问您的网站时,他们会执行诸如单击文本和图像以及给定的链接,将鼠标悬停在事物上等操作。这些都是JavaScript称为事件的Example。 我们可以用Javascript或vbscript编写事件处理程序,并可以将这些事件处理程序指定为事件标签属性的值。 HTML 4.01规范定义了19个事件属性…

二分搜索树的特性

一、顺序性 二分搜索树可以当做查找表的一种实现。 我们使用二分搜索树的目的是通过查找 key 马上得到 value。minimum、maximum、successor&#xff08;后继&#xff09;、predecessor&#xff08;前驱&#xff09;、floor&#xff08;地板&#xff09;、ceil&#xff08;天…

整车总线系列——FlexRay 五

整车总线系列——FlexRay 五 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 没有人关注你。也无需有人关注你。你必须承认自己的价值&#xff0c;你不能…

RocketMQ教程-(4)-领域模型-消费者(Consumer)

本文介绍 Apache RocketMQ 中消费者&#xff08;Consumer&#xff09;的定义、模型关系、内部属性、行为约束、版本兼容性及使用建议。 定义​ 消费者是 Apache RocketMQ 中用来接收并处理消息的运行实体。 消费者通常被集成在业务系统中&#xff0c;从 Apache RocketMQ 服务…

SAP从放弃到入门系列之批次派生-Batch Derivation-Part2

文章目录 一、派生的类型1.1 静态派生1.2 动态派生 二、派生的方向 通过批次派生的基本配置和简单功能的介绍&#xff0c;大家应该对批次派生有一个基本的了解&#xff0c;这篇文章从批次派生的类型和批次派生的方向两个维度更深入的聊一下它的功能。 一、派生的类型 派生的类…