• 【亲测可用】Java基于EasyExcel将数组数据存入Excel


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

    在这里插入图片描述

    前言

    本文章参考了官网上写Excel中重复多次写入部分的内容,本文的目的是将计算得到的一维或二维数组存入同一个Excel的不同Sheet当中。

    在这里插入图片描述

    EasyExcel写入Excel文件

    1. 导入依赖

    <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>3.1.1</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2. 将数组写入Excel文件

    EasyExcel写入Excel时,写入数据的类型需要为List<Map<>>类型,因此类型我们需要先将数组转化为指定的数据类型,如下所示:

    	public static List<Map<Integer,Double>> get_exportdata_list(String sheet,Double[] data1, Double[][] data2) 
    	{
    		List<Map<Integer,Double>> list = new LinkedList<>();
    		
    		if(data1!=null) //数据为一维
    		{
    			for(int i=0;i<data1.length;i++)
    			{
    				Map<Integer, Double> map = new HashedMap<>() ;
    				map.put(0, data1[i]);
    				list.add(map);
    			}	
    		}
    		else
    		{
    			for(int i=0;i<data2.length;i++)
    			{
    				Map<Integer, Double> map = new HashedMap<>() ;
    				for(int j=0;j<data2[0].length;j++)
    				{
    					map.put(j, data2[i][j]);
    				}
    				list.add(map);
    			}	
    		}		
    			
    		return list;		
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    函数的第一项为表名,第二项为一维数组,第三项为二维数组,二者只能有一项,另外一项为null

    例如我们数组为{1.0,2.0,3.0,4.0},运行程序后返回[{4=4.0, 3=3.0, 2=2.0, 1=1.0},序列中的每一项均为一个哈希表,即键值对类型。

    2.1 方式一:将所有数组组合起来一起写入

    import java.util.LinkedList;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.commons.collections4.map.HashedMap;
    
    import com.alibaba.excel.EasyExcel;
    import com.alibaba.excel.ExcelWriter;
    //import com.alibaba.excel.support.ExcelTypeEnum;
    import com.alibaba.excel.write.metadata.WriteSheet;
    
    
    public class ExportDemo {
    	
    	static Double[][] d = {{1.0,2.0,3.0},{4.0,5.0,6.0}};
    	static Double[] a = {6.0,7.0,8.0};
    	static String[] sheet = {"d","a"}; //sheet名
    	
    	public static void main(String[] args) {
    		
    		//将数组数据转化为列表
    		List<List<Map<Integer,Double>>> LIST = new LinkedList<>(); //创建一个总List存放两个数组返回的List
    		List<Map<Integer, Double>> list1 = new LinkedList<>();
    		list1 = get_exportdata_list("d",null,d);
    		System.out.println("list1="+list1);
    		LIST.add(list1);
    		list1 = get_exportdata_list("a",a,null);
    		System.out.println("list2="+list1);
    		LIST.add(list1);
    		
    		System.out.println("LIST="+LIST);
    		
    		//写入.xlsx文件
    		try (ExcelWriter excelWriter = EasyExcel.write("data/demo.xlsx").build())  //创建excel
    		{
                 //去调用写入,有几个数组就循环几次
    			for(int i=0;i<2;i++)
    			{
    				WriteSheet writeSheet = EasyExcel.writerSheet(sheet[i]).needHead(false).build();
                    // 将数组写入sheet[i]
    				excelWriter.write(LIST.get(i), writeSheet);
    			}
    		}
    	}
    	
    	public static List<Map<Integer,Double>> get_exportdata_list(String sheet,Double[] data1, Double[][] data2) 
    	{
    		List<Map<Integer,Double>> list = new LinkedList<>();
    		
    		if(data1!=null) //数据为一维
    		{
    			for(int i=0;i<data1.length;i++)
    			{
    				Map<Integer, Double> map = new HashedMap<>() ;
    				map.put(0, data1[i]);
    				list.add(map);
    			}	
    		}
    		else
    		{
    			for(int i=0;i<data2.length;i++)
    			{
    				Map<Integer, Double> map = new HashedMap<>() ;
    				for(int j=0;j<data2[0].length;j++)
    				{
    					map.put(j, data2[i][j]);
    				}
    				list.add(map);
    			}	
    		}		
    					
    		return list;		
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

    运行后输出如下所示:

    在这里插入图片描述
    生成data/demo.xlsx文件如下所示:

    在这里插入图片描述
    这种写法有一种缺陷,就是无法往现有Excel中追加写入数据,如果需要追加写入可以用下面这种方式。

    2.2 方式二:将数组追加写入Excel

    这种方式是将已有Excel复制一份,然后将新数据写入副本文件,最后将原始文件删除并将副本文件重命名为与原始文件相同。

    这种方式既可以将数据写入新的Excel,也可以在原始Excel上追加新数据。

    假设我们已有data/demo.xlsx如下所示:

    在这里插入图片描述
    运行如下程序:

    import java.io.File;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.commons.collections4.map.HashedMap;
    
    import com.alibaba.excel.EasyExcel;
    import com.alibaba.excel.ExcelWriter;
    //import com.alibaba.excel.support.ExcelTypeEnum;
    import com.alibaba.excel.write.metadata.WriteSheet;
    
    
    public class ExportDemo2 {
    	
    	static Double[][] d = {{1.0,2.0,3.0},{4.0,5.0,6.0}};
    	static List<List<Map<Integer,Double>>> list = new LinkedList<>();
    	
    	public static void main(String[] args) {
    		
    		//将数组数据转化为列表
    		exportdata("d",null,d);
    		//exportdata("c",a,null);
    	}
    	
    	public static void exportdata(String sheet,Double[] data1, Double[][] data2) 
    	{
    		List<Map<Integer,Double>> list = new LinkedList<>();
    		
    		if(data1!=null) //数据为一维
    		{
    			for(int i=0;i<data1.length;i++)
    			{
    				Map<Integer, Double> map = new HashedMap<>() ;
    				map.put(0, data1[i]);
    				list.add(map);
    			}	
    		}
    		else
    		{
    			for(int i=0;i<data2.length;i++)
    			{
    				Map<Integer, Double> map = new HashedMap<>() ;
    				for(int j=0;j<data2[0].length;j++)
    				{
    					map.put(j, data2[i][j]);
    				}
    				list.add(map);
    			}	
    		}	
    		
    		String filePath="data"; //路径
    		String fileName="demo.xlsx"; //目标excel文件名
    		ExcelWriter excelWriter = null;
            File destFile = new File(filePath, fileName);
            File transFile = new File(filePath, "test.xlsx"); //这个文件名取为什么都可以,中转文件
            System.out.println(destFile);
            System.out.println(transFile);
            try {
                if (destFile.exists()) 
                {
                	//创建中转文件
                    //追加数据,中转文件与目标文件不能是同一个文件名
                    //withTemplate()指定模板文件,即复制一份; file() 中间文件名; autoCloseStream() 必须为True,自动关闭输入流     	
                    excelWriter = EasyExcel.write().withTemplate(destFile)
                            //.file() 指定目标文件,不能与模板文件是同一个文件
                            .file(transFile).autoCloseStream(true).build(); //
                } 
                else 
                {
                    excelWriter = EasyExcel.write(destFile).build();
                }
                WriteSheet writeSheet = EasyExcel.writerSheet(sheet).needHead(false).build();
                excelWriter.write(list, writeSheet);
            } 
            finally 
            {
            	if (excelWriter != null)
            	{
            		excelWriter.finish();
            	}
            }
            
            if (transFile.exists()) 
            {
                //删除原模板文件,新生成的文件变成新的模板文件
            	destFile.delete();	
                boolean result = transFile.renameTo(destFile);
                if(result)System.out.println("改名成功");
                else System.out.println("改名失败");	
            }					
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93

    输出内容如下所示:
    在这里插入图片描述
    data/demo.xlsx中的内容如下所示:

    在这里插入图片描述
    可以看到数组d写入到Excel当中。

  • 相关阅读:
    Linux系列之查找命令
    组件通信$refs | $parent |$root
    CentOS 7 安装和配置java环境
    美妆行业的市场分析
    OpenFOAM类库介绍(一)网格和场
    使用sipParseArgs/sipBuildResult进行python/C++对象的转换
    概述Linux内核驱动之GPIO子系统API接口
    FPGA:单比特跨时钟域、多比特跨时钟域(更新中)
    形参与实参
    Linux Kafka 3.5 KRaft模式集群部署
  • 原文地址:https://blog.csdn.net/cyj972628089/article/details/125566583