package com.terra.system.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.terra.system.annotation.ExcelHead; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; /** * Excel帮助类 * @author WWW */ public class ExcelHelper { /** * 读取Excel * * @param pathName 文件路径 * @param 泛型类 * @return 泛型类集合 */ public static List 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 excludeSheets = null == strs ? null : Arrays.asList(strs); List list = new ArrayList(); ExcelReader reader = EasyExcel.read(pathName, clazz, new AnalysisEventListener() { @Override public void invoke(T t, AnalysisContext context) { list.add(t); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { // } }).headRowNumber(headRowNumber).build(); List 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 泛型类 * @return 头行数 */ public static 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 void writeToTemplate(String source, String target, Map map, Map> 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(); // 写入数据 if (null != map && map.size() > 0) { excelWriter.fill(map, writeSheet); } if (null != listMap && listMap.size() > 0) { listMap.forEach((k, v) -> excelWriter.fill(new FillWrapper(k, v), fillConfig, writeSheet)); } // 结束写入 excelWriter.finish(); } /** * 写入Excel模板 * * @param source 源文件(模板) * @param target 目录文件 * @param map 数据源 */ public static void writeToTemplate(String source, String target, Map> 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(); } }