EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。它能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。
在这里插入图片描述

前言

这几天需要使用Java读取Excel文件中的数据,在查阅了官方文档和大量资料后,感觉写的还是挺晦涩难懂,也没办法实现我想要的功能(可能是我太菜了)。正当我愁眉不展之际,我在B站上看到了这个视频:神器!阿里开源的Excel操作工具,短短半个小时就解决了我的问题,在此特意表示感谢,并且将视频中的内容记录一下,传递知识!

EasyExcel读取Excel文件

1. Excel示例

我想要读取的Excel分别为一维浮点型数据和二维浮点型数据,在Java中读取Excel的数据并且存储在一维数组和二维数组中。由于EasyExcel会默认将第一行认定为表头,因此我们的数据从第二行开始存储,后面我们会讲如何从指定行开始读,如图:

在这里插入图片描述
其他类型的Excel数据也可以用同样的方法读取,只需要稍作改动即可。

2. 导入依赖

在maven官网上找到EasyExcel的最新版本,复制黏贴.xml命令即可:

<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.1</version>
</dependency>

3. 数据的读取

3.1 一维数据的读取

以map集合的形式读取excel中的数据,自行修改文件路径和表单名称即可使用。

package easyexcel;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class demo {
	static double[] data1 = new double[9];
	
	public static void main(String[] args)
	{
		importdata_1("data1", data1);
		for(int j=0;j<9;j++)
		{
			System.out.print("data1["+j+"]="+data1[j]+",");
		}
	}
	
	//一维数据导入
	public static void importdata_1(String sheet, final double[] data)
	{
		int i=0;		
		List<Map<Integer,String>> list = new LinkedList<>(); //初始化列表
		
		EasyExcel.read("demo.xlsx") //文件路径
				.sheet(sheet) //表单名
				.registerReadListener(new AnalysisEventListener<Map<Integer,String>>() { //监听器,以行的形式读取Excel

					//一行一行读取Excel,在这里处理读取到的数据
					@Override
					public void invoke(Map<Integer, String> integerStringMap, AnalysisContext analysisContext) {
						// TODO Auto-generated method stub
						list.add(integerStringMap); //将读取到的每一行为一组存入列表中
					}
					
					//数据读取完毕后运行下面
					@Override
					public void doAfterAllAnalysed(AnalysisContext context) {
						// TODO Auto-generated method stub
						System.out.println("数据读取完毕");
					}
				}).headRowNumber(1).doRead(); //headRowNumber(num)为指定前num行为表头,从num+1开始读,默认为1

		//遍历列表存储数据
		for (Map<Integer, String> integerStringMap : list) 
		{
			Set<Integer> keySet =integerStringMap.keySet();
			Iterator<Integer> iterator = keySet.iterator();
			while (iterator.hasNext()) 
			{
				Integer key = iterator.next();
				Double val = Double.valueOf(integerStringMap.get(key));
				System.out.print(val+",");
				data[i++] = val;
			}
		}	
		System.out.println();
		System.out.println(i+"条数据已导入");
	}
}

运行后输出以下内容,可以看到数组data1中存储了Excel中的9条数据:

在这里插入图片描述
headRowNumber(num)为指定前num行为表头,从num+1开始读,如果不指定则默认为1。

3.2 一维数据和二维数据的读取函数封装

package easyexcel;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class demo {
	static double[] data1 = new double[9];
	static double[][] data2 = new double[5][5]; 
	
	public static void main(String[] args)
	{
		//函数输入:表单名,一维数组,二维数组
		importdata("data1", data1, null);
		importdata("data2", null, data2);
		
		//一维数组输出
		System.out.println("一维数组输出");
		for(int j=0;j<9;j++)
		{
			System.out.print("data1["+j+"]="+data1[j]+" ");
		}
		//二维数组输出
		System.out.println();
		System.out.println("二维数组输出");
		for(int i=0;i<5;i++)
		{
			for(int j=0;j<5;j++)
			{
				System.out.print("data2["+i+"]["+j+"]="+data2[i][j]+" ");
			}
			System.out.println();
		}
	}
	
	public static void importdata(String sheet, final double[] data1, final double[][] data2) //数据导入,sheet为表单名
	{
		int i=0, j=0; //i代表行,j代表列
		
		int flag=0;
		if(data1 != null && data2 == null) flag=1; //输入的是一维数组
		else if(data1 == null && data2 != null) flag=2; //输入的是二维数组
		else System.out.println("输入参数错误");
		
		List<Map<Integer,String>> list = new LinkedList<>();
		
		EasyExcel.read("demo.xlsx")
				.sheet(sheet)
				.registerReadListener(new AnalysisEventListener<Map<Integer,String>>() {

					@Override
					public void invoke(Map<Integer, String> integerStringMap, AnalysisContext analysisContext) {
						// TODO Auto-generated method stub
						list.add(integerStringMap);
					}

					@Override
					public void doAfterAllAnalysed(AnalysisContext context) {
						// TODO Auto-generated method stub
						System.out.println("数据读取完毕");
					}
				}).headRowNumber(1).doRead();

		for (Map<Integer, String> integerStringMap : list) // 行循环
		{
			j=0;//新的一行循环
			Set<Integer> keySet =integerStringMap.keySet();
			Iterator<Integer> iterator = keySet.iterator();
			while (iterator.hasNext()) //列循环
			{
				Integer key = iterator.next();
				Double val = Double.valueOf(integerStringMap.get(key));
				if(flag==1)//一维数组
				{
					data1[i] = val;
				}
				else if(flag==2) //二维数组
				{
					data2[i][j++] = val;
				}
			}
			i+=1; //新的一行循环
		}
		if(flag==1)System.out.println(i+"条数据已导入");
		else if(flag==2) System.out.println(i+"行"+j+"列数据已导入");
	}
}

运行后输出以下内容:

在这里插入图片描述

最后

以上就是Java基于EasyExcel读取一维及二维Excel数据并存入数组,若Excel数据有差异在以上基础上稍微修改一下即可,建议大家配合视频食用。

视频配套程序及文档资料链接:https://pan.baidu.com/s/1WNEFpK1edt9mR-GVraWuyw
提取码:N5V6

GitHub 加速计划 / ea / easyexcel
14
5
下载
快速、简洁、解决大文件内存溢出的java处理Excel工具
最近提交(Master分支:4 个月前 )
c42183df Bugfix 4 个月前
efa7dff6 * 重新加回 `commons-io` 4 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐