feat:自查自评检查导入实现

hangao
wangxy 3 days ago
parent 0145e8f852
commit e7ada916a9

@ -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 <T> void createSheet(List<T> list, String sheetName, Class<T> clazz) {
Sheet sheet = workbook.createSheet(sheetName);
List<Object[]> fields = getFields(clazz);
List<FieldMeta> fields = getFields(clazz); // 使用新版getFields
createTitleRow(sheet, fields);
fillDataRows(sheet, list, fields);
}
@ -68,54 +66,86 @@ public class MultiSheetExcelUtil {
}
}
private static List<Object[]> getFields(Class<?> clazz) {
List<Object[]> 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<FieldMeta> getFields(Class<?> clazz) {
List<FieldMeta> 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<Object[]> fields) {
private void createTitleRow(Sheet sheet, List<FieldMeta> 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 <T> void fillDataRows(Sheet sheet, List<T> list, List<Object[]> fields) {
CellStyle dataStyle = createDataStyle(workbook); // 应用数据行样式
private <T> void fillDataRows(Sheet sheet, List<T> list, List<FieldMeta> 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 <T> void fillDataRows(Sheet sheet, List<T> list, List<Object[]> 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);
}
}
}
}*/
}

Loading…
Cancel
Save