package com.lf.server.helper;
|
|
import com.alibaba.excel.EasyExcel;
|
import com.alibaba.excel.ExcelReader;
|
import com.alibaba.excel.ExcelWriter;
|
import com.alibaba.excel.context.AnalysisContext;
|
import com.alibaba.excel.enums.WriteDirectionEnum;
|
import com.alibaba.excel.event.AnalysisEventListener;
|
import com.alibaba.excel.read.metadata.ReadSheet;
|
import com.alibaba.excel.write.metadata.WriteSheet;
|
import com.alibaba.excel.write.metadata.fill.FillConfig;
|
import com.alibaba.excel.write.metadata.fill.FillWrapper;
|
import com.lf.server.annotation.ExcelHead;
|
|
import java.util.*;
|
|
/**
|
* Excel帮助类
|
* @author WWW
|
*/
|
public class ExcelHelper {
|
/**
|
* 读取Excel
|
*
|
* @param pathName 文件路径
|
* @param <T> 泛型类
|
* @return 泛型类集合
|
*/
|
public static <T> List<T> readExcel(Class<?> clazz, String pathName) {
|
ExcelHead head = getExcelHead(clazz);
|
int headRowNumber = head == null ? 1 : head.headRows();
|
String[] strs = null == head || StringHelper.isEmpty(head.excludeSheets()) ? null : head.excludeSheets().split(",");
|
List<String> excludeSheets = null == strs ? null : Arrays.asList(strs);
|
|
List<T> list = new ArrayList<T>();
|
ExcelReader reader = EasyExcel.read(pathName, clazz, new AnalysisEventListener<T>() {
|
@Override
|
public void invoke(T t, AnalysisContext context) {
|
list.add(t);
|
}
|
|
@Override
|
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
|
//
|
}
|
}).headRowNumber(headRowNumber).build();
|
|
List<ReadSheet> sheets = reader.excelExecutor().sheetList();
|
for (ReadSheet sheet : sheets) {
|
if (strs != null && excludeSheets.contains(sheet.getSheetName())) {
|
continue;
|
}
|
|
reader.read(sheet);
|
}
|
reader.finish();
|
|
return list;
|
}
|
|
/**
|
* 获取Excel头注解类
|
*
|
* @param clazz Class
|
* @param <T> 泛型类
|
* @return 头行数
|
*/
|
public static <T> ExcelHead getExcelHead(Class<?> clazz) {
|
ExcelHead head = clazz.getAnnotation(ExcelHead.class);
|
|
return head;
|
}
|
|
/**
|
* 写入Excel模板
|
*
|
* @param source 源文件(模板)
|
* @param target 目录文件
|
* @param map 键值对Map
|
* @param listMap 列表Map
|
*/
|
public static <T> void writeToTemplate(String source, String target, Map<String, Object> map, Map<String, List<T>> listMap) {
|
// 根据模板写入数据,如果目标文件不存在,则自动创建文件
|
ExcelWriter excelWriter = EasyExcel.write(target).withTemplate(source).build();
|
|
// 在工作簿0中写入数据,如果模板中不存在练习工作簿,则会在目标文件中自动创建
|
WriteSheet writeSheet = EasyExcel.writerSheet(0).build();
|
|
// 垂直写入数据,如果要水平写入,将VERTICAL替换为HORIZONTAL
|
FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).build();
|
|
// 写入数据
|
excelWriter.fill(map, writeSheet);
|
listMap.forEach((k, v) -> excelWriter.fill(new FillWrapper(k, v), fillConfig, writeSheet));
|
|
// 结束写入
|
excelWriter.finish();
|
}
|
|
/**
|
* 写入Excel模板
|
*
|
* @param source 源文件(模板)
|
* @param target 目录文件
|
* @param map 数据源
|
*/
|
public static <T> void writeToTemplate(String source, String target, Map<String, List<T>> map) {
|
// 根据模板写入数据,如果目标文件不存在,则自动创建文件
|
ExcelWriter excelWriter = EasyExcel.write(target).withTemplate(source).build();
|
|
// 在工作簿0中写入数据,如果模板中不存在练习工作簿,则会在目标文件中自动创建
|
WriteSheet writeSheet = EasyExcel.writerSheet(0).build();
|
|
// 垂直写入数据,如果要水平写入,将VERTICAL替换为HORIZONTAL
|
FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).build();
|
|
// 写入数据
|
map.forEach((k, v) -> excelWriter.fill(new FillWrapper(k, v), fillConfig, writeSheet));
|
|
// 结束写入
|
excelWriter.finish();
|
}
|
}
|