草庐IT

EasyExcel轻松读取Excel文件!

北可 2023-04-11 原文

EasyExcel是一个Java库,用于快速、简单地读写Excel文件。要使用EasyExcel,您首先需要将其添加为项目的依赖:

如果使用Maven,可以添加以下依赖项:

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

一下几种方式读取文件

1、EasyExcel.read()

例如,下面的代码演示了如何使用EasyExcel读取一个Excel文件中的数据:

// 创建一个ExcelReader对象,用于读取Excel文件
ExcelReader reader = EasyExcel.read("/path/to/file.xlsx", MyModel.class, new MyListener())
    .build();

// 读取Excel文件中的数据
reader.read();

// 关闭reader
reader.finish();

在上面的代码中,MyModel.class指定了用于表示Excel文件中的数据的Java类,而MyListener类实现了一个事件监听器,用于处理读取过程中发生的事件。

下面的代码演示了如何使用EasyExcel将数据写入Excel文件:

// 创建一个ExcelWriter对象,用于写入Excel文件
ExcelWriter writer = EasyExcel.write("/path/to/file.xlsx", MyModel.class)

2、ExcelReader.read()

可以通过为ExcelReader.read()方法传递一个List对象来读取Excel文件中的数据并存储到一个集合中。例如:

// 创建一个用于存储数据的List
List<MyModel> data = new ArrayList<>();

// 创建一个ExcelReader对象,用于读取Excel文件
ExcelReader reader = EasyExcel.read("/path/to/file.xlsx", MyModel.class, new MyListener())
    .build();

// 读取Excel文件中的数据
reader.read(data);

// 关闭reader
reader.finish();

// 在这里,data中存储了读取出来的数据

在上面的代码中,ExcelReader.read()方法会将读取到的数据添加到传入的List对象中。可以在读取完成后使用该集合进行进一步的操作。

3、实现ExcelListener

在EasyExcel中,您可以通过实现ExcelListener接口来创建一个监听器,用于在读取Excel文件中的数据时处理事件。例如,下面的代码演示了如何实现一个监听器:

public class MyListener implements ExcelListener {

  // 在读取Excel开始时调用
  @Override
  public void onStart(ExcelReaderContext context) {
    // do something
  }

  // 在读取完一行数据后调用
  @Override
  public void onRow(ExcelReaderContext context) {
    // do something
  }

  // 在读取完所有数据后调用
  @Override
  public void onFinish(ExcelReaderContext context) {
    // do something
  }

}

在上面的代码中,MyListener类实现了ExcelListener接口,并重写了接口中定义的三个方法。在读取Excel文件时,EasyExcel会在适当的时候调用这些方法,您可以在这些方法中处理事件。

例如,您可以在onRow()方法中处理读取完一行数据后的事件,并在onFinish()方法中处理读取完所有数据后的事件。

下面的代码演示了如何使用一个监听器读取Excel文件中的数据:

// 创建一个ExcelReader对象,用于读取Excel文件
ExcelReader reader = EasyExcel.read("/path/to/file.xlsx", MyModel.class, new MyListener())
    .build();

// 读取Excel文件中的数据
reader.read();

// 关闭reader
reader.finish();

4、实现AnalysisEventListener

除了实现ExcelListener接口和使用回调函数,EasyExcel还提供了另一种方式来处理读取Excel文件中的数据:继承AnalysisEventListener类。

AnalysisEventListener是一个抽象类,它实现了ExcelListener接口,并为每一行数据提供了一个默认的实现。您可以继承AnalysisEventListener类,并重写其中的方法来实现您自己的监听器。

例如,下面的代码演示了如何继承AnalysisEventListener类来实现一个监听器:

public class MyListener extends AnalysisEventListener<MyModel> {

  // 在读取完一行数据后调用
  @Override
  public void invoke(MyModel data, AnalysisContext context) {
    // do something
  }

  // 在读取完所有数据后调用
  @Override
  public void doAfterAllAnalysed(AnalysisContext context) {
    // do something
  }

}

在上面的代码中,MyListener类继承了AnalysisEventListener类,并重写了其中的两个方法。在读取Excel文件时,EasyExcel会在适当的时候调用这些方法,您可以在这些方法中处理事件。

例如,您可以在invoke()方法中处理读取完一行数据后的事件,并在doAfterAllAnalysed()方法中处理读取完所有数据后的事件。

5、以上方法的优缺点

实现ExcelListener接口:

优点:

  • 可以处理读取过程中的更多事件,包括读取开始和结束时的事件。
  • 可以更灵活地处理读取的每一行数据。

缺点:

  • 需要实现接口并重写多个方法,可能需要更多的代码。

使用回调函数:

优点:

  • 可以更灵活地处理读取的每一行数据。
  • 代码简洁,易于理解和维护。

缺点:

  • 不能处理读取过程中的更多事件,只能处理读取完一行数据后的事件。

继承AnalysisEventListener类:

优点:

  • 已经为每一行数据提供了默认的实现,只需要重写其中的方法即可。
  • 代码简洁,易于理解和维护。

缺点:

  • 不能处理读取过程中的更多事件,只能处理读取完一行数据和读取完所有数据后的事件。
  • 如果需要更灵活地处理读取的每一行数据,可能需要实现更多的代码。

总之,您可以根据自己的需要选择实现ExcelListener接口、使用回调函数或继承AnalysisEventListener类来处理读取Excel文件中的。

有关EasyExcel轻松读取Excel文件!的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  8. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  9. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  10. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

随机推荐