首先需要定义动态导出的表头列集合
其中 fieldName 为要导出的字段名称 也就是 数据对象 中与之对应的字段名称
headName 为与字段对应的表头(我这里默认用的就是导出表头集合中字段排序就是导出的表头排序 如有需要,可以自己定义导出表头顺序)
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author: chenjiaxiang
* @create: 2023/4/11 11:05
**/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ExcelHeader {
/**
* 要导出的字段名称
*/
private String fieldName;
/**
* 要导出的表头名称
*/
private String headName;
}
导出util类,直接上代码
import cn.hutool.core.util.ReflectUtil;
import com.alibaba.excel.EasyExcel;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 动态导出 exl
* @author: chenjiaxiang
* @create: 2023/4/11 16:20
**/
@Slf4j
public class EasyExcelUtils {
/**
* 动态导出exl
*
* @param headers 要导出的头集合
* @param dataList 数据集合
*/
public static <T> void dynamicExportExcel(List<ExcelHeader> headers, List<T> dataList, HttpServletResponse response) {
long startTime = System.currentTimeMillis();
List<List<T>> allList = new ArrayList<>();
for (T detail : dataList) {
allList.addAll(EasyExcelUtils.dataList(headers, detail));
}
try (ServletOutputStream outputStream = response.getOutputStream()) {
EasyExcel.write(outputStream).head(EasyExcelUtils.headers(headers))
//文件样式
.registerWriteHandler(new CellStyle())
.sheet("sheet").doWrite(allList);
} catch (IOException e) {
log.error("生成动态EXL失败,字段", e);
}
long endTime = System.currentTimeMillis();
log.info("动态导出耗时:{}", endTime - startTime);
}
//excel表头
public static List<List<String>> headers(List<ExcelHeader> excelHeaders) {
List<List<String>> headers = new ArrayList<>();
for (ExcelHeader header : excelHeaders) {
List<String> head = new ArrayList<>();
head.add(header.getHeadName());
headers.add(head);
}
return headers;
}
/**
* 要导出的字段
*
* @param exportFields 表头集合
* @param obj 数据对象
* @return 集合
*/
@SneakyThrows
public static <T> List<List<T>> dataList(List<ExcelHeader> exportFields, T obj) {
List<List<T>> list = new ArrayList<>();
List<T> data = new ArrayList<>();
List<String> propList = exportFields.stream().map(ExcelHeader::getFieldName).collect(Collectors.toList());
//先根据反射获取实体类的class对象
Class<?> objClass = obj.getClass();
//设置实体类属性的集合
Field[] fields = ReflectUtil.getFields(objClass);
for (String prop : propList) {
//循环实体类对象集合
for (Field field : fields) {
field.setAccessible(true);
//判断实体类属性跟特定字段集合名是否一样
if (field.getName().equals(prop)) {
T object = (T) field.get(obj);
//获取属性对应的值
data.add(object);
}
}
}
list.add(data);
return list;
}
}
其中 CellStyle() 是设置的默认样式
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import java.util.List;
/**
* @author: chenjiaxiang
* @create: 2022-08-11 14:53
**/
public class CellStyle extends AbstractColumnWidthStyleStrategy {
@Override
protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<CellData> cellDataList, Cell cell, Head head,
Integer relativeRowIndex, Boolean isHead) {
// 简单设置
Sheet sheet = writeSheetHolder.getSheet();
sheet.setColumnWidth(cell.getColumnIndex(), 5000);
}
}
运行代码
@PostMapping("/exlOut")
public void exlOut(HttpServletResponse response) {
//导出字段集合
List<ExcelHeader> excelHeaders = Arrays.asList(new ExcelHeader("phone", "手机号"), new ExcelHeader("sexStr", "性别"));
//数据集合
List<GetSchoolExpertsDeriveExlVo> getSchoolExpertsDeriveExlVos = Arrays.asList(new GetSchoolExpertsDeriveExlVo("男", "1231231"), new GetSchoolExpertsDeriveExlVo("nn", "adadad"));
EasyExcelUtils.dynamicExportExcel(excelHeaders,getSchoolExpertsDeriveExlVos,response);
}
导出效果:
文章来源:https://www.toymoban.com/news/detail-505381.html
文章来源地址https://www.toymoban.com/news/detail-505381.html
到了这里,关于Java 利用Easyexcel动态导出表头列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!