【EasyExcel】Java将数组数据存入Excel
easyexcel
快速、简洁、解决大文件内存溢出的java处理Excel工具
项目地址:https://gitcode.com/gh_mirrors/ea/easyexcel
免费下载资源
·
EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。它能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。
Java基于EasyExcel将数组数据存入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>
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;
}
函数的第一项为表名,第二项为一维数组,第三项为二维数组,二者只能有一项,另外一项为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;
}
}
运行后输出如下所示:
生成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("改名失败");
}
}
}
输出内容如下所示:
data/demo.xlsx
中的内容如下所示:
可以看到数组d写入到Excel当中。
GitHub 加速计划 / ea / easyexcel
14
5
下载
快速、简洁、解决大文件内存溢出的java处理Excel工具
最近提交(Master分支:4 个月前 )
c42183df
Bugfix 4 个月前
efa7dff6 * 重新加回 `commons-io`
4 个月前
更多推荐
已为社区贡献10条内容
所有评论(0)