较大数据量Excel导出工具
需要提前导入easyexcel包
package com.xinmoren.util;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import lombok.Builder;
import lombok.Data;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
public class ExportExcel {
/**
* 一次最大写入数量
*/
private static final Integer ONCE_WRITE_MAX = 3000;
/**
* 默认sheetNo
*/
private static final Integer DEFAULT_SHEET_NO = 0;
/**
* 默认sheetName
*/
private static final String DEFAULT_SHEET_NAME = "sheet1";
@FunctionalInterface
public interface GetData<N extends Number, N extends Number, T extends Collection> {
R get(N page, N size);
}
@Data
@Builder
public static class Param {
/**
* 数据类
*/
private Class dataClass;
/**
* 一次写出多少行数据
*/
private Integer onceWriteNum;
/**
* 获取数据方法
*/
private GetData function;
/**
* 输出流
*/
private OutputStream outputStream;
}
public static void exportExcel(Param param) {
ExcelWriter excelWriter = EasyExcel.write(param.getOutputStream()).autoCloseStream(Boolean.FALSE).build();
WriteSheet writeSheet = EasyExcel.writerSheet(DEFAULT_SHEET_NO, DEFAULT_SHEET_NAME).head(param.getDataClass())
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
if (param.getOnceWriteNum() > ONCE_WRITE_MAX) {
param.setOnceWriteNum(ONCE_WRITE_MAX);
}
int page = 1;
Collection collection = param.function.get(page, param.getOnceWriteNum());
while (collection != null && collection.size() > 0) {
excelWriter.write(Arrays.asList(collection), writeSheet);
if (collection.size() != param.getOnceWriteNum()) {
break;
}
collection = param.function.get(page++, param.getOnceWriteNum());
}
excelWriter.finish();
}
}