EasyExcel은 대용량 파일의 메모리 오버플로를 해결하는 Java 기반의 빠르고 간결한 Excel 처리 도구입니다. 성능, 메모리 등의 요소를 고려하지 않고 엑셀 읽기, 쓰기 등의 기능을 빠르게 완성할 수 있습니다.
Java는 EasyExcel을 기반으로 배열 데이터를 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에 기록된 것을 볼 수 있습니다.