1、导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.2</version>
</dependency>
2、简单的对象写
这是一个开发中所用到的对象
public class DemoData {
@ExcelProperty("字符串标题")
private String string;
@ExcelProperty("日期标题")
private Date date;
@ExcelProperty("数字标题")
private Double doubleData;
/**
* 忽略这个字段
*/
@ExcelIgnore
private String ignore;
}
下面是写方法
官方提示:简单写可以在数据量不大的情况下可以使用(5000以内,具体也要看实际情况),数据量大参照 重复多次写入
@Test
public void t1() {
// 绝对路径与文件名称
String fileName = "这里写绝对路径与文件名称" + ".xlsx";
// write方法第一个参数是 文件名称 ,第二个参数是head头
ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build();
// 创建WriteSheet对象 sheet是工作表的名称
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet").build();
// DemoDataList是要保存到excel的数据
List<DemoData> DemoDataList = new ArrayList<DemoData>();
// 将数据写入到excel工作表
excelWriter.write(DemoDataList, writeSheet);
// 保存对 Excel文件所做的更改及关闭文件流
excelWriter.finish();
}
3、重复多次写入
@Test
public void t1() {
// 绝对路径与文件名称
String fileName = "这里写绝对路径与文件名称" + ".xlsx";
// write方法第一个参数是 文件名称 ,第二个参数是head头
ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build();
// 创建WriteSheet对象
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet").build();
for (int i = 0; i < size; i++) {
// 查询数据这里有两种处理方案
// 1、一次性查询出所有的数据,对List<Object>进行分页查询
List<DemoData> DemoDataList = new ArrayList<DemoData>();
// 对List<Object>进行分页
this.startPage(DemoDataList, n, 5000);
// 2、查询mysql时就进行分页查询
// 这里是mysql的分页查询操作。。。
// 写
excelWriter.write(DemoDataList, writeSheet);
}
// 保存对 Excel文件所做的更改及关闭文件流
excelWriter.finish();
}
// List 分页查询
public static List startPage(List list, Integer pageNum, Integer pageSize) {
if (list == null) {
return Collections.emptyList();
}
if (list.isEmpty()) {
return Collections.emptyList();
}
//记录总数
Integer count = list.size();
//开始索引
int fromIndex = (pageNum - 1) * pageSize;
//结束索引
int toIndex = pageNum * pageSize;
if (fromIndex + 1 > count) {
return Collections.emptyList();
}
if (pageNum * pageSize > count) {
toIndex = count;
}
return list.subList(fromIndex, toIndex);
}
4、不创建对象的写,例如List<Object>等
这里是作者自定义的做法,符合我的开发应用。
功能场景:我需要同时从第三方数据库查询多个点位的数据,其中有一个属性的值是我需要的excel头,所以就需要一列一列的新增数据。
步骤如下:
1、一次性查询出所有的数据。
2、因为所有数据中包含着多个点位的多条历史数据,所以需要将单个点位的历史数据组合成一个新的集合。
3、然后将组合的新集合保存到一列Excel中,第一行就是点位名称。
4、如此以来就是一个点位一列,循环保存,直至结束。
代码步骤如下:
@Test
public void t1() {
// 将属性名相同的历史数据一组一组的保存到 dataListList中
List<List<String>> dataListList = new ArrayList<>();
// 遍历
for (String sensorTag : processInfo.getSensorTag()) {
// 将相等的点位数据取出,组成新的list
List<BatchQueryTagData> collect = batchQueryTagData.stream()
.filter(data -> sensorTag.equals(data.getTagName()))
.collect(Collectors.toList());
// 遍历取出数据,保存到新的集合中
List<String> data = new ArrayList<>();
for (int i = 0; i < collect.size(); i++) {
BatchQueryTagData batchQueryTagData1 = collect.get(i);
data.add(batchQueryTagData1.getValue());
}
dataListList.add(data);
}
// 转换好的数据
List<List<String>> lists = this.formatConversion(dataListList);
// execl名称
String fileName = "这里写绝对路径与文件名称" + ".xlsx";
// head头
List<List<String>> headList = new ArrayList<>();
// 组装head
for (String s : processInfo.getSensorTag()) {
List<String> strings = new ArrayList<>();
strings.add(s);
headList.add(strings);
}
ExcelWriter excelWriter = EasyExcel.write(fileName).build();
// 创建WriteSheet对象
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").head(headList).build();
// 写入数据
excelWriter.write(lists, writeSheet);
// 关闭ExcelWriter对象
excelWriter.finish();
}
// 因为阿里的写是一行一行的写,所以需要通过如下工具类,将数据的格式进行转换
// 从而让同一属性的数据从行 变为 列
private List<List<String>> formatConversion(List<List<String>> dataListList){
// 这是用于接受转换好格式的表格数据
List<List<String>> dataList = new ArrayList<>();
// 找到列表中最大的列数
int maxColumns = dataListList.stream()
.mapToInt(List::size)
.max()
.orElse(0);
// 逐列遍历
for (int i = 0; i < maxColumns; i++) {
List<String> columnData = new ArrayList<>();
// 逐行遍历
for (List<String> rowData : dataListList) {
// 获取当前行的元素或空字符串(如果当前行的列数小于当前列数)
String cellValue = (i < rowData.size()) ? rowData.get(i) : "";
columnData.add(cellValue);
}
dataList.add(columnData);
}
return dataList;
}