本篇文章主要介绍一下使用阿里开源的Easyexcel工具处理读取excel文件,因为之前自己想在网上找一下这个简单的立即上手的博客,发现很多文章的教程都针对比较旧的版本的Easyexcel,没有使用新版本的方法,导致很多方法都标志过期了或者运行时报错,所以本篇博客主要是使用最新版的Easyexcel去读取excel文件,顺便说一下目前新版本的特性。

优化

  1. 目前读取excel文件不再需要指定ExcelTypeEnum,即excel的版本,会自动处理
  2. 之前创建ExcelReader都是自己new,现在是通过EasyExcelFactory创建,更加简单和具备通用性。
  3. 之前每解析一行的回调的invoke()方法,通用对象Object是list集合,目前是HashMap集合。

简单使用读取Excel,返回List集合

  1. 通过maven引入依赖
        <dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.0.5</version>
</dependency>
  1. 新建通用监听类StringExcelListener

/**
* StringList 解析监听器
*
* @author zhangcanlong
* @since 2019-10-21
*/
private static class StringExcelListener extends AnalysisEventListener { /**
* 自定义用于暂时存储data
* 可以通过实例获取该值
*/
private List<List<String>> datas = new ArrayList<>(); /**
* 每解析一行都会回调invoke()方法
*
* @param object 读取后的数据对象
* @param context 内容
*/
@Override
public void invoke(Object object, AnalysisContext context) {
@SuppressWarnings("unchecked") Map<String, String> stringMap = (HashMap<String, String>) object;
//数据存储到list,供批量处理,或后续自己业务逻辑处理。
datas.add(new ArrayList<>(stringMap.values()));
//根据自己业务做处理
} @Override
public void doAfterAllAnalysed(AnalysisContext context) {
//解析结束销毁不用的资源
//注意不要调用datas.clear(),否则getDatas为null
} /**
* 返回数据
*
* @return 返回读取的数据集合
**/
public List<List<String>> getDatas() {
return datas;
} /**
* 设置读取的数据集合
*
* @param datas 设置读取的数据集合
**/
public void setDatas(List<List<String>> datas) {
this.datas = datas;
}
}
  1. 创建ExcelReader读取,并从监听类中获取读取的数据
    /**
* 根据excel输入流,读取excel文件
*
* @param inputStream exece表格的输入流
* @return 返回双重list的集合
**/
public List<List<String>> writeWithoutHead(InputStream inputStream) {
StringExcelListener listener = new StringExcelListener();
ExcelReader excelReader = EasyExcelFactory.read(inputStream, null, listener).headRowNumber(0).build();
excelReader.read();
List<List<String>> datas = listener.getDatas();
excelReader.finish();
return datas;
}

完整的Excel简单读取类和测试

测试类:


import com.hiido.services.common.ExcelOptionsService;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List; /**
* excel操作的测试类
*
* @author zhangcanlong
* @since 2019/10/20 21:12
**/
@RunWith(SpringRunner.class)
@SpringBootTest
public class ExcelOptionsServiceTest { @Autowired
private ExcelOptionsService excelOptionsService; /**
* 测试读取excel
**/
@Test
public void testReadExcel() {
// 这里的excel文件可以 为xls或xlsx结尾
File file = new File("C:\\Users\\Administrator\\Desktop\\测试.xls");
List<List<String>> result = new ArrayList<>();
try {
result = excelOptionsService.writeWithoutHead(new FileInputStream(file));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Assert.assertNotNull(result);
System.out.println("读取结果:" + result);
}
}

读取类


import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import org.springframework.stereotype.Service; import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; /**
* excel文件的操作service
*
* @author zhangcanlong
* @since 2019/10/20 21:01
**/
@Service
public class ExcelOptionsService { /**
* 根据excel输入流,读取excel文件
*
* @param inputStream exece表格的输入流
* @return 返回双重list的集合
**/
public List<List<String>> writeWithoutHead(InputStream inputStream) {
StringExcelListener listener = new StringExcelListener();
ExcelReader excelReader = EasyExcelFactory.read(inputStream, null, listener).headRowNumber(0).build();
excelReader.read();
List<List<String>> datas = listener.getDatas();
excelReader.finish();
return datas;
} /**
* StringList 解析监听器
*
* @author zhangcanlong
* @since 2019-10-21
*/
private static class StringExcelListener extends AnalysisEventListener { /**
* 自定义用于暂时存储data
* 可以通过实例获取该值
*/
private List<List<String>> datas = new ArrayList<>(); /**
* 每解析一行都会回调invoke()方法
*
* @param object 读取后的数据对象
* @param context 内容
*/
@Override
public void invoke(Object object, AnalysisContext context) {
@SuppressWarnings("unchecked") Map<String, String> stringMap = (HashMap<String, String>) object;
// 这里可以获取excel的基本信息,包含excel的总行数
System.out.println("不一定十分准确的总行数:"+context.getTotalCount());
//数据存储到list,供批量处理,或后续自己业务逻辑处理。
datas.add(new ArrayList<>(stringMap.values()));
//根据自己业务做处理
} @Override
public void doAfterAllAnalysed(AnalysisContext context) {
//解析结束销毁不用的资源
//注意不要调用datas.clear(),否则getDatas为null
} /**
* 返回数据
*
* @return 返回读取的数据集合
**/
public List<List<String>> getDatas() {
return datas;
} /**
* 设置读取的数据集合
*
* @param datas 设置读取的数据集合
**/
public void setDatas(List<List<String>> datas) {
this.datas = datas;
}
}
}

参考:

  1. https://blog.csdn.net/alinyua/article/details/82859577
  2. https://github.com/alibaba/easyexcel/blob/master/quickstart.md

阿里的Easyexcel读取Excel文件(最新版本)的更多相关文章

  1. 读取Excel文件的版本

    读取xls文件和xlsx文件创建的版本号. 虽然xlsx声明的是向前兼容,但是不知道OleDb是不是也是这样,没有办法所以要读取文件版本,限定只能读取Excel2007保存的文件. using ICS ...

  2. C#读取excel文件的内容(使用DataSet)

    C#读取Excel文件的内容,通过OLEDB来连接,关键是连接的路径,如:string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data S ...

  3. 基于.NET的程序读取Excel文件的解决方案

    目录 0. 前言 1. 使用NPOI库读取Excel文件 2. 使用OleDbConnection 3. 相关参考 shanzm-2020年12月8日 23:48:11 0. 前言 以前基于 .NET ...

  4. ADO.NET 读取Excel文件,并作数据源

    项目中需要用的功能,贴上代码了. 需要注意的地方:配置Web.config的时候要注意版本问题! //若是在Web.config中配置数据源,如下 <add key="ExcelCon ...

  5. PHPExcel读取Excel文件的实现代码

    <?php require_once 'PHPExcel.php'; /**对excel里的日期进行格式转化*/ function GetData($val){ $jd = GregorianT ...

  6. .Net读取Excel文件时丢失数据的问题 (转载)

    相信很多人都试过通过OleDB读取Excel文件,这种方法效率十分高,只是有一点会让人十分头痛,就是当一列中既有混合型数据,又有纯数据时,往往容易丢失数据. 百度过后,改连接字符串 “HDR=YES; ...

  7. C# conn.open() 外部表不是预期的格式( 读取EXCEL文件出错)

    环境:win7+iis7+Office2007 在asp.net网站中导出Excel文件后,再把文件导入到数据库中. 读取Excel文件时,打开连接出错. 错误为:外部表不是预期的格式 解决:检查了一 ...

  8. (实用篇)PHPExcel读取Excel文件的实现代码

    用PHPExcel读取Excel 2007 或者Excel2003文件,需要的朋友,可以参考下. 涉及知识点:  php对excel文件进行循环读取 php对字符进行ascii编码转化,将字符转为十进 ...

  9. 读取Excel文件的两种方法

    第一种方法:传统方法,采用OleDB读取EXCEL文件, 优点:写法简单,缺点:服务器必须安有此组件才能用,不推荐使用 private DataSet GetConnect_DataSet2(stri ...

随机推荐

  1. 三、Jmeter 定时器

    首先需要清楚Jmeter中各个元件的执行顺序: 元件的执行顺序 了解了元件有作用域之后,来看看元件的执行顺序,元件执行顺序的规则很简单,在同一作用域名范围内,测试计划中的元件按照如下顺序执行. (1) ...

  2. spring再学习之简单测试

    一.spring是怎么工作的那,通过一个类装载进容器进行描述: 首先创建一个类user: package cn.itcast.bean; public class User { public User ...

  3. 图解算法——恢复一棵二叉搜索树(BST)

    题目来源 基础:给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换.请在不改变其结构的情况下,恢复这棵树. 进阶:使用 O(n) 空间复杂度的解法很容易实现.你能想出一个只使用常数空间的 ...

  4. 鸟哥的linux私房菜——第九章学习(vim编辑器)

    第九章vim编辑器 1.0).vi与vim Linux下文本界面的文书编辑器通常会有常常听到的就有: emacs, pico, nano, joe, 与 vim 等等. vi的优势: 所有的 Unix ...

  5. go modules——HelloWorld示例

    go modules--HelloWorld示例 go modules 存在的意义是方便代码的共享(虽然这会使自己开发过程中有一些小小的麻烦) 开发第一步,创建一个github仓库,然后克隆到本地 首 ...

  6. CSS 弹性盒子模型

    CSS 弹性盒子模型 https://www.w3.org/TR/2016/CR-css-flexbox-1-20160526/ CSS Flexible Box Layout Module Leve ...

  7. SSL/TLS All In One

    SSL/TLS All In One HTTPS SSL/TLS 的工作原理 https://www.websecurity.digicert.com/zh/cn/security-topics/ho ...

  8. 1+X 证书制度

    1+X 证书制度 教育部职业技术教育 http://www.cvae.com.cn/zgzcw/tzgg/202001/c0ddd6c87e6c42839f8cc3e09a2dce89.shtml 2 ...

  9. node cli & emoji

    node cli & emoji cli $ yarn add node-emoji $ npm i node-emoji https://github.com/omnidan/node-em ...

  10. record terminal sessions

    record terminal sessions asciinema https://asciinema.org/ # install $ brew install asciinema # Start ...