[EasyExcel] Java는 배열 데이터를 Excel에 저장합니다.

EasyExcel은 대용량 파일의 메모리 오버플로를 해결하는 Java 기반의 빠르고 간결한 Excel 처리 도구입니다. 성능, 메모리 등의 요소를 고려하지 않고 엑셀 읽기, 쓰기 등의 기능을 빠르게 완성할 수 있습니다.

여기에 이미지 설명 삽입

머리말

이 글은 공식 홈페이지 있는 엑셀에서 반복해서 쓰는 부분에 대한 내용을 참고한 것 입니다.

여기에 이미지 설명 삽입

EasyExcel은 Excel 파일을 씁니다.

1. 종속성 가져오기

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

2. Excel 파일에 배열 쓰기

EasyExcel이 Excel에 쓸 때 쓰는 데이터의 타입이 type이어야 하므로 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차원 배열로 둘 중 하나의 항목만 존재할 수 있으며 다른 항목은null

{1.0,2.0,3.0,4.0}예를 들어 프로그램을 실행한 후 배열이 반환되고 [{4=4.0, 3=3.0, 2=2.0, 1=1.0}시퀀스의 각 항목은 키-값 쌍 유형인 해시 테이블입니다.

2.1 방법 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;		
	}
}

실행 후 출력은 다음과 같습니다.

여기에 이미지 설명 삽입
생성된 data/demo.xlsx파일은 다음과 같습니다.

여기에 이미지 설명 삽입
이러한 작성 방식은 기존 엑셀에 데이터를 추가할 수 없다는 단점이 있는데, 데이터를 추가해야 하는 경우 다음과 같은 방법을 사용할 수 있습니다.

2.2 방법 2: 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("改名失败");	
        }					
	}
}

출력은 다음과 같습니다.
여기에 이미지 설명 삽입
data/demo.xlsx내용은 다음과 같습니다.

여기에 이미지 설명 삽입
배열 d가 Excel에 기록된 것을 볼 수 있습니다.

추천

출처blog.csdn.net/cyj972628089/article/details/125566583