diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/MultiSheetExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/MultiSheetExcelUtil.java index be38b9b..83e20ba 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/MultiSheetExcelUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/MultiSheetExcelUtil.java @@ -1,6 +1,7 @@ package com.ruoyi.common.utils.poi; import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.utils.StringUtils; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.streaming.SXSSFWorkbook; @@ -9,10 +10,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.lang.reflect.Field; import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.UUID; +import java.util.*; /** * ClassName: MultiSheetExcelUtil @@ -40,7 +38,7 @@ public class MultiSheetExcelUtil { public void createSheet(List list, String sheetName, Class clazz) { Sheet sheet = workbook.createSheet(sheetName); - List fields = getFields(clazz); + List fields = getFields(clazz); // 使用新版getFields createTitleRow(sheet, fields); fillDataRows(sheet, list, fields); } @@ -68,54 +66,86 @@ public class MultiSheetExcelUtil { } } - private static List getFields(Class clazz) { - List fields = new ArrayList<>(); - Field[] declaredFields = clazz.getDeclaredFields(); - for (Field field : declaredFields) { - Excel excel = field.getAnnotation(Excel.class); - if (excel != null) { - fields.add(new Object[]{field.getName(), excel.name(), excel.readConverterExp(), excel.dictType(), excel.sort()}); - } + + private static class FieldMeta { + private final Field field; // 反射字段对象 + private final String title; // 表头名称(@Excel.name) + private final String dateFormat; // 日期格式(@Excel.dateFormat) + private final int sort; // 排序(@Excel.sort) + + public FieldMeta(Field field, String title, String dateFormat, int sort) { + this.field = field; + this.title = title; + this.dateFormat = dateFormat; + this.sort = sort; + this.field.setAccessible(true); // 提前设置可访问 } - Class superClass = clazz.getSuperclass(); - while (superClass != null) { - Field[] superFields = superClass.getDeclaredFields(); - for (Field field : superFields) { - Excel excel = field.getAnnotation(Excel.class); - if (excel != null) { - fields.add(new Object[]{field.getName(), excel.name(), excel.readConverterExp(), excel.dictType(), excel.sort()}); + + // Getter 方法 + public Field getField() { return field; } + public String getTitle() { return title; } + public String getDateFormat() { return dateFormat; } + public int getSort() { return sort; } + } + + /** + * 获取所有带@Excel注解的字段(包含父类) + */ + private static List getFields(Class clazz) { + List fields = new ArrayList<>(); + + // 递归获取所有字段(包括父类) + Class currentClass = clazz; + while (currentClass != null) { + for (Field field : currentClass.getDeclaredFields()) { + Excel excelAnno = field.getAnnotation(Excel.class); + if (excelAnno != null) { + fields.add(new FieldMeta( + field, + excelAnno.name(), + excelAnno.dateFormat(), + excelAnno.sort() + )); } } - superClass = superClass.getSuperclass(); + currentClass = currentClass.getSuperclass(); } - fields.sort(Comparator.comparing(o -> (Integer) o[4])); + + // 按sort排序 + fields.sort(Comparator.comparingInt(FieldMeta::getSort)); return fields; } - private Object getFieldValueByName(String fieldName, Object obj) { - try { - Field field = obj.getClass().getDeclaredField(fieldName); - field.setAccessible(true); - return field.get(obj); - } catch (Exception e) { - return null; - } - } - private void setCellValue(Cell cell, Object value) { + + + private void setCellValue(Cell cell, Object value, FieldMeta meta) { if (value == null) { cell.setCellValue(""); - } else if (value instanceof String) { - cell.setCellValue((String) value); - } else if (value instanceof Integer) { - cell.setCellValue((Integer) value); - } else if (value instanceof Long) { - cell.setCellValue((Long) value); - } else if (value instanceof Double) { - cell.setCellValue((Double) value); - } else if (value instanceof Boolean) { - cell.setCellValue((Boolean) value); - } else { + return; + } + + // 处理日期类型 + if (value instanceof Date) { + String format = StringUtils.isNotEmpty(meta.getDateFormat()) + ? meta.getDateFormat() + : "yyyy-MM-dd"; // 默认格式 + + CellStyle style = workbook.createCellStyle(); + style.setDataFormat( + workbook.getCreationHelper() + .createDataFormat() + .getFormat(format) + ); + cell.setCellValue((Date) value); + cell.setCellStyle(style); + } + // 处理数字类型 + else if (value instanceof Number) { + cell.setCellValue(((Number) value).doubleValue()); + } + // 其他类型 + else { cell.setCellValue(value.toString()); } } @@ -162,21 +192,42 @@ public class MultiSheetExcelUtil { return style; } - private void createTitleRow(Sheet sheet, List fields) { + + private void createTitleRow(Sheet sheet, List fields) { + Row headerRow = sheet.createRow(0); CellStyle headerStyle = createHeaderStyle(workbook); - CellStyle dataStyle = createDataStyle(workbook); // 数据行样式(可选) - Row row = sheet.createRow(0); + for (int i = 0; i < fields.size(); i++) { - Cell cell = row.createCell(i); - cell.setCellValue((String) fields.get(i)[1]); + Cell cell = headerRow.createCell(i); + cell.setCellValue(fields.get(i).getTitle()); cell.setCellStyle(headerStyle); - // 设置列宽 - sheet.setColumnWidth(i, Math.max(sheet.getColumnWidth(i), 3000)); + sheet.setColumnWidth(i, 6000); // 默认列宽 } } - private void fillDataRows(Sheet sheet, List list, List fields) { - CellStyle dataStyle = createDataStyle(workbook); // 应用数据行样式 + + private void fillDataRows(Sheet sheet, List list, List fields) { + int rowNum = 1; + for (T item : list) { + Row row = sheet.createRow(rowNum++); + for (int i = 0; i < fields.size(); i++) { + FieldMeta meta = fields.get(i); + Cell cell = row.createCell(i); + + try { + // 直接通过缓存的Field对象获取值 + Object value = meta.getField().get(item); + setCellValue(cell, value, meta); // 传递FieldMeta对象 + } catch (IllegalAccessException e) { + cell.setCellValue("N/A"); + } + } + } + } + + + /*private void fillDataRows(Sheet sheet, List list, List fields) { + CellStyle dataStyle = createDataStyle(workbook); int rowNum = 1; for (T item : list) { Row row = sheet.createRow(rowNum++); @@ -185,10 +236,16 @@ public class MultiSheetExcelUtil { Object[] fieldInfo = fields.get(i); String fieldName = (String) fieldInfo[0]; Object value = getFieldValueByName(fieldName, item); - setCellValue(cell, value); - cell.setCellStyle(dataStyle); // 应用数据行样式 + // 获取Field对象并传递 + try { + Field field = item.getClass().getDeclaredField(fieldName); + setCellValue(cell, value, field); // 调用新版方法 + } catch (NoSuchFieldException e) { + setCellValue(cell, value, null); // 降级处理 + } + cell.setCellStyle(dataStyle); } } - } + }*/ }