Merge pull request #853 from hushaoge/master-jdk17

Excel导出时,下拉选择列错位问题修改
This commit is contained in:
芋道源码 2025-06-15 15:18:59 +08:00 committed by GitHub
commit f897ae9225
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -10,6 +10,8 @@ import cn.iocoder.yudao.framework.common.core.KeyValue;
import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
import cn.iocoder.yudao.framework.excel.core.annotations.ExcelColumnSelect;
import cn.iocoder.yudao.framework.excel.core.function.ExcelColumnSelectFunction;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
@ -20,6 +22,7 @@ import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddressList;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
@ -56,7 +59,17 @@ public class SelectSheetWriteHandler implements SheetWriteHandler {
public SelectSheetWriteHandler(Class<?> head) {
// 解析下拉数据
int colIndex = 0;
boolean ignoreUnannotated = head.isAnnotationPresent(ExcelIgnoreUnannotated.class);
for (Field field : head.getDeclaredFields()) {
// 忽略 static final transient 的字段
if(isStaticFinalOrTransient(field) ) {
continue;
}
// 忽略的字段跳过
if((ignoreUnannotated && !field.isAnnotationPresent(ExcelProperty.class))
|| field.isAnnotationPresent(ExcelIgnore.class)){
continue;
}
if (field.isAnnotationPresent(ExcelColumnSelect.class)) {
ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);
if (excelProperty != null && excelProperty.index() != -1) {
@ -68,6 +81,18 @@ public class SelectSheetWriteHandler implements SheetWriteHandler {
}
}
/**
* 判断字段是否是静态的最终的 transient
* EasyExcel 默认是忽略 static final transient 的字段所以需要判断
* @param field 字段
* @return 是否是静态的最终的 transient
*/
private boolean isStaticFinalOrTransient(Field field) {
return (Modifier.isStatic(field.getModifiers()) && Modifier.isFinal(field.getModifiers()))
|| Modifier.isTransient(field.getModifiers());
}
/**
* 获得下拉数据并添加到 {@link #selectMap}
*