From 8074ac28f992b593674793cbd03e5b95f77209a7 Mon Sep 17 00:00:00 2001 From: dota17 Date: Fri, 10 Apr 2020 17:32:10 +0800 Subject: [PATCH] Make columns sort by parameter order and modified some typos --- .../metadata/property/ExcelHeadProperty.java | 101 +++++++++++++++--- .../AbstractExcelWriterParameterBuilder.java | 4 +- .../write/metadata/WriteBasicParameter.java | 20 ++-- .../metadata/holder/AbstractWriteHolder.java | 40 +++---- 4 files changed, 117 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/alibaba/excel/metadata/property/ExcelHeadProperty.java b/src/main/java/com/alibaba/excel/metadata/property/ExcelHeadProperty.java index 34109adc..c3454755 100644 --- a/src/main/java/com/alibaba/excel/metadata/property/ExcelHeadProperty.java +++ b/src/main/java/com/alibaba/excel/metadata/property/ExcelHeadProperty.java @@ -2,6 +2,7 @@ package com.alibaba.excel.metadata.property; import java.lang.reflect.Field; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -24,6 +25,8 @@ import com.alibaba.excel.util.ClassUtils; import com.alibaba.excel.util.StringUtils; import com.alibaba.excel.write.metadata.holder.AbstractWriteHolder; +import javafx.util.Pair; + /** * Define the header attribute of excel * @@ -61,7 +64,7 @@ public class ExcelHeadProperty { */ private Map ignoreMap; - public ExcelHeadProperty(Holder holder, Class headClazz, List> head, Boolean convertAllFiled) { + public ExcelHeadProperty(Holder holder, Class headClazz, List> head, Boolean convertAllField) { this.headClazz = headClazz; headMap = new TreeMap(); contentPropertyMap = new TreeMap(); @@ -73,7 +76,7 @@ public class ExcelHeadProperty { int headIndex = 0; for (int i = 0; i < head.size(); i++) { if (holder instanceof AbstractWriteHolder) { - if (((AbstractWriteHolder)holder).ignore(null, i)) { + if (((AbstractWriteHolder) holder).ignore(null, i)) { continue; } } @@ -84,7 +87,7 @@ public class ExcelHeadProperty { headKind = HeadKindEnum.STRING; } // convert headClazz to head - initColumnProperties(holder, convertAllFiled); + initColumnProperties(holder, convertAllField); initHeadRowNumber(); if (LOGGER.isDebugEnabled()) { @@ -112,32 +115,98 @@ public class ExcelHeadProperty { } } - private void initColumnProperties(Holder holder, Boolean convertAllFiled) { + private void initColumnProperties(Holder holder, Boolean convertAllField) { if (headClazz == null) { return; } // Declared fields List defaultFieldList = new ArrayList(); - Map customFiledMap = new TreeMap(); - ClassUtils.declaredFields(headClazz, defaultFieldList, customFiledMap, ignoreMap, convertAllFiled); + Map customFieldMap = new TreeMap(); + ClassUtils.declaredFields(headClazz, defaultFieldList, customFieldMap, ignoreMap, convertAllField); + List> exportFieldBoolPairsList = new ArrayList>(); int index = 0; + while (customFieldMap.containsKey(index)) { + Field field = customFieldMap.get(index); + Pair fieldBooleanPair = new Pair(field, Boolean.TRUE); + exportFieldBoolPairsList.add(fieldBooleanPair); + index++; + } for (Field field : defaultFieldList) { - while (customFiledMap.containsKey(index)) { - Field customFiled = customFiledMap.get(index); - customFiledMap.remove(index); - if (!initOneColumnProperty(holder, index, customFiled, Boolean.TRUE)) { - index++; + Pair fieldBoolPair = new Pair(field, Boolean.FALSE); + exportFieldBoolPairsList.add(fieldBoolPair); + } + + sortExportColumnFields(holder, exportFieldBoolPairsList); + initColumnProperties(holder, exportFieldBoolPairsList); + + for (Map.Entry entry : customFieldMap.entrySet()) { + initOneColumnProperty(holder, entry.getKey(), entry.getValue(), Boolean.TRUE); + } + headKind = HeadKindEnum.CLASS; + } + + /** + * Give the field and flag pair list and arrange them in the specified order according to the user's settings. + * The field is what the user want to export to excel, the flag indicates whether the order of the field in excel is + * specified. + * + * @param holder Write holder which keeps the parameters of a sheet. + * @param exportFieldBoolPairList Keep all the fields and the flag(which indicate whether the field order is specified) + * of the head class except the ignored. It will be modified after this function is called. + */ + private void sortExportColumnFields(Holder holder, List> exportFieldBoolPairList) { + if (holder instanceof AbstractWriteHolder) { + Collection includeColumnFieldNames = ((AbstractWriteHolder) holder).getIncludeColumnFieldNames(); + if (includeColumnFieldNames != null) { + Map> exportFieldMap = new TreeMap>(); + List includeColumnFieldNameList = new ArrayList(includeColumnFieldNames); + for (Pair fieldBoolPair : exportFieldBoolPairList) { + if (includeColumnFieldNameList.contains(fieldBoolPair.getKey().getName())) { + exportFieldMap.put(fieldBoolPair.getKey().getName(), fieldBoolPair); + } } + exportFieldBoolPairList.clear(); + for (String fieldName : includeColumnFieldNameList) { + exportFieldBoolPairList.add(exportFieldMap.get(fieldName)); + } + return; + } + + Collection includeColumnIndexes = ((AbstractWriteHolder) holder).getIncludeColumnIndexes(); + if (includeColumnIndexes != null) { + List> tempFieldsList = new ArrayList>(); + for (Integer includeColumnIndex : includeColumnIndexes) { + tempFieldsList.add(exportFieldBoolPairList.get(includeColumnIndex)); + } + exportFieldBoolPairList.clear(); + exportFieldBoolPairList.addAll(tempFieldsList); + return; } - if (!initOneColumnProperty(holder, index, field, Boolean.FALSE)) { + + int index = 0; + for (Pair fieldBoolPair : exportFieldBoolPairList) { + if (((AbstractWriteHolder) holder).ignore(fieldBoolPair.getKey().getName(), index)) { + exportFieldBoolPairList.remove(fieldBoolPair); + } index++; } } - for (Map.Entry entry : customFiledMap.entrySet()) { - initOneColumnProperty(holder, entry.getKey(), entry.getValue(), Boolean.TRUE); + } + + /** + * Initialize column properties. + * + * @param holder Write holder which keeps the parameters of a sheet. + * @param exportFieldBoolPairList Keep the fields which will be exported to excel and the flag which indicate whether + * the field order in excel is specified. + */ + private void initColumnProperties(Holder holder, List> exportFieldBoolPairList) { + int index = 0; + for (Pair fieldBoolPair : exportFieldBoolPairList) { + initOneColumnProperty(holder, index, fieldBoolPair.getKey(), fieldBoolPair.getValue()); + index++; } - headKind = HeadKindEnum.CLASS; } /** @@ -151,7 +220,7 @@ public class ExcelHeadProperty { */ private boolean initOneColumnProperty(Holder holder, int index, Field field, Boolean forceIndex) { if (holder instanceof AbstractWriteHolder) { - if (((AbstractWriteHolder)holder).ignore(field.getName(), index)) { + if (((AbstractWriteHolder) holder).ignore(field.getName(), index)) { return true; } } diff --git a/src/main/java/com/alibaba/excel/write/builder/AbstractExcelWriterParameterBuilder.java b/src/main/java/com/alibaba/excel/write/builder/AbstractExcelWriterParameterBuilder.java index d44c0ad0..751ae5cd 100644 --- a/src/main/java/com/alibaba/excel/write/builder/AbstractExcelWriterParameterBuilder.java +++ b/src/main/java/com/alibaba/excel/write/builder/AbstractExcelWriterParameterBuilder.java @@ -81,7 +81,7 @@ public abstract class AbstractExcelWriterParameterBuilder excludeColumnFiledNames) { - parameter().setExcludeColumnFiledNames(excludeColumnFiledNames); + parameter().setExcludeColumnFieldNames(excludeColumnFiledNames); return self(); } @@ -97,7 +97,7 @@ public abstract class AbstractExcelWriterParameterBuilder includeColumnFiledNames) { - parameter().setIncludeColumnFiledNames(includeColumnFiledNames); + parameter().setIncludeColumnFieldNames(includeColumnFiledNames); return self(); } diff --git a/src/main/java/com/alibaba/excel/write/metadata/WriteBasicParameter.java b/src/main/java/com/alibaba/excel/write/metadata/WriteBasicParameter.java index b582576e..e6d2b9f0 100644 --- a/src/main/java/com/alibaba/excel/write/metadata/WriteBasicParameter.java +++ b/src/main/java/com/alibaba/excel/write/metadata/WriteBasicParameter.java @@ -40,7 +40,7 @@ public class WriteBasicParameter extends BasicParameter { /** * Ignore the custom columns. */ - private Collection excludeColumnFiledNames; + private Collection excludeColumnFieldNames; /** * Only output the custom columns. */ @@ -48,7 +48,7 @@ public class WriteBasicParameter extends BasicParameter { /** * Only output the custom columns. */ - private Collection includeColumnFiledNames; + private Collection includeColumnFieldNames; public Integer getRelativeHeadRowIndex() { return relativeHeadRowIndex; @@ -98,12 +98,12 @@ public class WriteBasicParameter extends BasicParameter { this.excludeColumnIndexes = excludeColumnIndexes; } - public Collection getExcludeColumnFiledNames() { - return excludeColumnFiledNames; + public Collection getExcludeColumnFieldNames() { + return excludeColumnFieldNames; } - public void setExcludeColumnFiledNames(Collection excludeColumnFiledNames) { - this.excludeColumnFiledNames = excludeColumnFiledNames; + public void setExcludeColumnFieldNames(Collection excludeColumnFieldNames) { + this.excludeColumnFieldNames = excludeColumnFieldNames; } public Collection getIncludeColumnIndexes() { @@ -114,12 +114,12 @@ public class WriteBasicParameter extends BasicParameter { this.includeColumnIndexes = includeColumnIndexes; } - public Collection getIncludeColumnFiledNames() { - return includeColumnFiledNames; + public Collection getIncludeColumnFieldNames() { + return includeColumnFieldNames; } - public void setIncludeColumnFiledNames(Collection includeColumnFiledNames) { - this.includeColumnFiledNames = includeColumnFiledNames; + public void setIncludeColumnFieldNames(Collection includeColumnFieldNames) { + this.includeColumnFieldNames = includeColumnFieldNames; } } diff --git a/src/main/java/com/alibaba/excel/write/metadata/holder/AbstractWriteHolder.java b/src/main/java/com/alibaba/excel/write/metadata/holder/AbstractWriteHolder.java index 00f2ef74..aa7cbc35 100644 --- a/src/main/java/com/alibaba/excel/write/metadata/holder/AbstractWriteHolder.java +++ b/src/main/java/com/alibaba/excel/write/metadata/holder/AbstractWriteHolder.java @@ -82,7 +82,7 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ /** * Ignore the custom columns. */ - private Collection excludeColumnFiledNames; + private Collection excludeColumnFieldNames; /** * Only output the custom columns. */ @@ -90,10 +90,10 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ /** * Only output the custom columns. */ - private Collection includeColumnFiledNames; + private Collection includeColumnFieldNames; public AbstractWriteHolder(WriteBasicParameter writeBasicParameter, AbstractWriteHolder parentAbstractWriteHolder, - Boolean convertAllFiled) { + Boolean convertAllField) { super(writeBasicParameter, parentAbstractWriteHolder); if (writeBasicParameter.getUse1904windowing() == null) { if (parentAbstractWriteHolder == null) { @@ -146,20 +146,20 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ this.automaticMergeHead = writeBasicParameter.getAutomaticMergeHead(); } - if (writeBasicParameter.getExcludeColumnFiledNames() == null && parentAbstractWriteHolder != null) { - this.excludeColumnFiledNames = parentAbstractWriteHolder.getExcludeColumnFiledNames(); + if (writeBasicParameter.getExcludeColumnFieldNames() == null && parentAbstractWriteHolder != null) { + this.excludeColumnFieldNames = parentAbstractWriteHolder.getExcludeColumnFieldNames(); } else { - this.excludeColumnFiledNames = writeBasicParameter.getExcludeColumnFiledNames(); + this.excludeColumnFieldNames = writeBasicParameter.getExcludeColumnFieldNames(); } if (writeBasicParameter.getExcludeColumnIndexes() == null && parentAbstractWriteHolder != null) { this.excludeColumnIndexes = parentAbstractWriteHolder.getExcludeColumnIndexes(); } else { this.excludeColumnIndexes = writeBasicParameter.getExcludeColumnIndexes(); } - if (writeBasicParameter.getIncludeColumnFiledNames() == null && parentAbstractWriteHolder != null) { - this.includeColumnFiledNames = parentAbstractWriteHolder.getIncludeColumnFiledNames(); + if (writeBasicParameter.getIncludeColumnFieldNames() == null && parentAbstractWriteHolder != null) { + this.includeColumnFieldNames = parentAbstractWriteHolder.getIncludeColumnFieldNames(); } else { - this.includeColumnFiledNames = writeBasicParameter.getIncludeColumnFiledNames(); + this.includeColumnFieldNames = writeBasicParameter.getIncludeColumnFieldNames(); } if (writeBasicParameter.getIncludeColumnIndexes() == null && parentAbstractWriteHolder != null) { this.includeColumnIndexes = parentAbstractWriteHolder.getIncludeColumnIndexes(); @@ -168,7 +168,7 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ } // Initialization property - this.excelWriteHeadProperty = new ExcelWriteHeadProperty(this, getClazz(), getHead(), convertAllFiled); + this.excelWriteHeadProperty = new ExcelWriteHeadProperty(this, getClazz(), getHead(), convertAllField); // Compatible with old code compatibleOldCode(writeBasicParameter); @@ -446,10 +446,10 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ @Override public boolean ignore(String fieldName, Integer columnIndex) { if (fieldName != null) { - if (includeColumnFiledNames != null && !includeColumnFiledNames.contains(fieldName)) { + if (includeColumnFieldNames != null && !includeColumnFieldNames.contains(fieldName)) { return true; } - if (excludeColumnFiledNames != null && excludeColumnFiledNames.contains(fieldName)) { + if (excludeColumnFieldNames != null && excludeColumnFieldNames.contains(fieldName)) { return true; } } @@ -520,12 +520,12 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ this.excludeColumnIndexes = excludeColumnIndexes; } - public Collection getExcludeColumnFiledNames() { - return excludeColumnFiledNames; + public Collection getExcludeColumnFieldNames() { + return excludeColumnFieldNames; } - public void setExcludeColumnFiledNames(Collection excludeColumnFiledNames) { - this.excludeColumnFiledNames = excludeColumnFiledNames; + public void setExcludeColumnFieldNames(Collection excludeColumnFieldNames) { + this.excludeColumnFieldNames = excludeColumnFieldNames; } public Collection getIncludeColumnIndexes() { @@ -536,12 +536,12 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ this.includeColumnIndexes = includeColumnIndexes; } - public Collection getIncludeColumnFiledNames() { - return includeColumnFiledNames; + public Collection getIncludeColumnFieldNames() { + return includeColumnFieldNames; } - public void setIncludeColumnFiledNames(Collection includeColumnFiledNames) { - this.includeColumnFiledNames = includeColumnFiledNames; + public void setIncludeColumnFieldNames(Collection includeColumnFieldNames) { + this.includeColumnFieldNames = includeColumnFieldNames; } @Override