【EasyExcel】Java读取一维及二维Excel数据并存入数组

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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EasyExcel是一个基于注解、无依赖、低内存占用的Java读写Excel的开源项目。它可以非常方便地读取Excel文件中的数据,并将其转换为Java对象。下面是一个示例代码,演示了如何使用EasyExcel读取Excel文件并将其转换为Java对象: ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.metadata.Sheet; import com.alibaba.excel.read.builder.ExcelReaderBuilder; import com.alibaba.excel.read.listener.ReadListener; import java.util.ArrayList; import java.util.List; public class ExcelToObjectConverter { public static void main(String[] args) { String fileName = "path/to/excel/file.xlsx"; List<MyObject> objects = new ArrayList<MyObject>(); ReadListener<MyObject> listener = new ReadListener<MyObject>() { @Override public void onException(Exception exception) { exception.printStackTrace(); } @Override public void onReadError(Exception exception) { exception.printStackTrace(); } @Override public void onAllSheetFinish() { } @Override public void onSheetFinish(int sheetIndex) { } @Override public void onReadFinish() { } @Override public void onRowRead(List<MyObject> rowData, int rowIndex) { objects.addAll(rowData); } }; ExcelReaderBuilder readerBuilder = EasyExcel.read(fileName, MyObject.class, listener); Sheet sheet = new Sheet(1, 1, MyObject.class); readerBuilder.sheet(sheet).doRead(); // Do something with the objects... } public static class MyObject { @ExcelProperty(index = 0) private String property1; @ExcelProperty(index = 1) private double property2; @ExcelProperty(index = 2) private Date property3; // Getters and setters... } } ``` 在这个示例中,我们首先定义了一个MyObject类,并使用@ExcelProperty注解将Excel文件中的列与Java属性进行映射。然后,我们创建一个ReadListener对象,用于处理读取Excel文件中的数据。在onRowRead方法中,我们将读取到的Java对象添加到一个列表中。最后,我们使用EasyExcel读取Excel文件,并将其转换为Java对象。读取完成后,我们可以对生成的Java对象进行处理。 需要注意的是,EasyExcel默认会将Excel文件中的所有数据读取到内存中,因此在读取大文件时可能会出现内存占用过高的问题。如果需要处理大文件,可以使用EasyExcel的分段读取功能,将文件拆分成多个小文件进行读取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值