diff --git a/src/main/java/com/alibaba/excel/util/ClassUtils.java b/src/main/java/com/alibaba/excel/util/ClassUtils.java index 4f14ac2ceeb44f9fbb77a78caab6b35098346e76..bd41b17e78d6fe2da33c596ffd536a705ce87d23 100644 --- a/src/main/java/com/alibaba/excel/util/ClassUtils.java +++ b/src/main/java/com/alibaba/excel/util/ClassUtils.java @@ -1,5 +1,13 @@ package com.alibaba.excel.util; +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.exception.ExcelCommonException; +import com.alibaba.excel.metadata.BaseRowModel; +import com.alibaba.excel.metadata.Holder; +import com.alibaba.excel.write.metadata.holder.WriteHolder; + import java.lang.ref.SoftReference; import java.lang.reflect.Field; import java.lang.reflect.Modifier; @@ -13,6 +21,7 @@ import java.util.Map; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; + import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; @@ -44,25 +53,32 @@ public class ClassUtils { } tempIndexFildMap.putAll(fieldCache.getIndexFiledMap()); + Map originSortedAllFiledMap = fieldCache.getSortedAllFiledMap(); if (!needIgnore) { - sortedAllFiledMap.putAll(fieldCache.getSortedAllFiledMap()); + sortedAllFiledMap.putAll(originSortedAllFiledMap); return; } - int index = 0; - for (Map.Entry entry : fieldCache.getSortedAllFiledMap().entrySet()) { - Field field = entry.getValue(); - if (((WriteHolder)holder).ignore(entry.getValue().getName(), entry.getKey())) { - if (ignoreMap != null) { - ignoreMap.put(field.getName(), field); - } - while (tempIndexFildMap.containsKey(index)) { - tempIndexFildMap.remove(index); - index++; + // 获取到属性字段的最大index + int maxIndex = -1; + for (Integer filedIndex : originSortedAllFiledMap.keySet()) { + maxIndex = Math.max(filedIndex, maxIndex); + } + // 被忽略的属性数量 + int ignoreNum = 0; + // 当有属性被忽略时,需要将其后面的所有属性 index 前移 + for (int index = 0; index <= maxIndex; index++) { + Field field = originSortedAllFiledMap.get(index); + String name = field == null? null: field.getName(); + if (((WriteHolder) holder).ignore(name, index)) { + if (ignoreMap != null && name != null) { + ignoreMap.put(name, field); } - } else { - sortedAllFiledMap.put(index, field); - index++; + tempIndexFildMap.remove(index); + ignoreNum++; + } else if(field != null){ + int finalIndex = index - ignoreNum; + sortedAllFiledMap.put(finalIndex, field); } } } diff --git a/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java b/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java index c0d2f47f5d6e5ec8cd35b57dd3f29c36973e74d3..9a9271761eded9420008356f3e3bdefe56f8c831 100644 --- a/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java +++ b/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java @@ -1,5 +1,6 @@ package com.alibaba.excel.write.executor; + import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; @@ -18,18 +19,23 @@ import com.alibaba.excel.util.ClassUtils; import com.alibaba.excel.util.FieldUtils; import com.alibaba.excel.util.WorkBookUtil; import com.alibaba.excel.util.WriteHandlerUtils; -import com.alibaba.excel.write.metadata.CollectionRowData; -import com.alibaba.excel.write.metadata.MapRowData; -import com.alibaba.excel.write.metadata.RowData; +import com.alibaba.excel.write.metadata.holder.AbstractWriteHolder; + import com.alibaba.excel.write.metadata.holder.WriteHolder; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; -import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; - import net.sf.cglib.beans.BeanMap; -import org.apache.commons.collections4.CollectionUtils; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; + + /** * Add the data into excel * @@ -183,13 +189,17 @@ public class ExcelWriteAddExecutor extends AbstractExcelWriteExecutor { if (!sortedAllFiledMap.isEmpty()) { return; } - WriteWorkbookHolder writeWorkbookHolder = writeContext.writeWorkbookHolder(); - boolean needIgnore = - !CollectionUtils.isEmpty(writeWorkbookHolder.getExcludeColumnFieldNames()) || !CollectionUtils - .isEmpty(writeWorkbookHolder.getExcludeColumnIndexes()) || !CollectionUtils - .isEmpty(writeWorkbookHolder.getIncludeColumnFieldNames()) || !CollectionUtils - .isEmpty(writeWorkbookHolder.getIncludeColumnIndexes()); - ClassUtils.declaredFields(clazz, sortedAllFiledMap, needIgnore, writeWorkbookHolder); + + // 获取当前的使用的 holder + WriteHolder holder = writeContext.currentWriteHolder(); + boolean needIgnore = (holder instanceof AbstractWriteHolder) && ( + !CollectionUtils.isEmpty(((AbstractWriteHolder) holder).getExcludeColumnFiledNames()) || !CollectionUtils + .isEmpty(((AbstractWriteHolder) holder).getExcludeColumnIndexes()) || !CollectionUtils + .isEmpty(((AbstractWriteHolder) holder).getIncludeColumnFiledNames()) || !CollectionUtils + .isEmpty(((AbstractWriteHolder) holder).getIncludeColumnIndexes())); + + ClassUtils.declaredFields(clazz, sortedAllFiledMap, + writeContext.writeWorkbookHolder().getWriteWorkbook().getConvertAllFiled(), needIgnore, holder); } }