mirror of https://github.com/alibaba/easyexcel
zhuangjiaju
6 years ago
67 changed files with 2233 additions and 869 deletions
@ -0,0 +1,25 @@ |
|||||||
|
package com.alibaba.excel.enums; |
||||||
|
|
||||||
|
/** |
||||||
|
* The types of holder |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
**/ |
||||||
|
public enum HolderEnum { |
||||||
|
/** |
||||||
|
* workbook |
||||||
|
*/ |
||||||
|
WORKBOOK, |
||||||
|
/** |
||||||
|
* sheet |
||||||
|
*/ |
||||||
|
SHEET, |
||||||
|
/** |
||||||
|
* table |
||||||
|
*/ |
||||||
|
TABLE, |
||||||
|
/** |
||||||
|
* row |
||||||
|
*/ |
||||||
|
ROW; |
||||||
|
} |
@ -0,0 +1,86 @@ |
|||||||
|
package com.alibaba.excel.metadata; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* Write/read holder |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
*/ |
||||||
|
public abstract class AbstractHolder implements Holder { |
||||||
|
/** |
||||||
|
* Record whether it's new or from cache |
||||||
|
*/ |
||||||
|
private Boolean newInitialization; |
||||||
|
/** |
||||||
|
* You can only choose one of the {@link AbstractHolder#head} and {@link AbstractHolder#clazz} |
||||||
|
*/ |
||||||
|
private List<List<String>> head; |
||||||
|
/** |
||||||
|
* You can only choose one of the {@link AbstractHolder#head} and {@link AbstractHolder#clazz} |
||||||
|
*/ |
||||||
|
private Class clazz; |
||||||
|
/** |
||||||
|
* Some global variables |
||||||
|
*/ |
||||||
|
private GlobalConfiguration globalConfiguration; |
||||||
|
|
||||||
|
public AbstractHolder(BasicParameter basicParameter, AbstractHolder prentAbstractHolder) { |
||||||
|
this.newInitialization = Boolean.TRUE; |
||||||
|
this.head = basicParameter.getHead(); |
||||||
|
this.clazz = basicParameter.getClazz(); |
||||||
|
this.globalConfiguration = new GlobalConfiguration(); |
||||||
|
if (basicParameter.getAutoTrim() == null) { |
||||||
|
if (prentAbstractHolder == null) { |
||||||
|
globalConfiguration.setAutoTrim(Boolean.TRUE); |
||||||
|
} else { |
||||||
|
globalConfiguration.setAutoTrim(prentAbstractHolder.getGlobalConfiguration().getAutoTrim()); |
||||||
|
} |
||||||
|
} else { |
||||||
|
globalConfiguration.setAutoTrim(basicParameter.getAutoTrim()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean getNewInitialization() { |
||||||
|
return newInitialization; |
||||||
|
} |
||||||
|
|
||||||
|
public void setNewInitialization(Boolean newInitialization) { |
||||||
|
this.newInitialization = newInitialization; |
||||||
|
} |
||||||
|
|
||||||
|
public List<List<String>> getHead() { |
||||||
|
return head; |
||||||
|
} |
||||||
|
|
||||||
|
public void setHead(List<List<String>> head) { |
||||||
|
this.head = head; |
||||||
|
} |
||||||
|
|
||||||
|
public Class getClazz() { |
||||||
|
return clazz; |
||||||
|
} |
||||||
|
|
||||||
|
public void setClazz(Class clazz) { |
||||||
|
this.clazz = clazz; |
||||||
|
} |
||||||
|
|
||||||
|
public GlobalConfiguration getGlobalConfiguration() { |
||||||
|
return globalConfiguration; |
||||||
|
} |
||||||
|
|
||||||
|
public void setGlobalConfiguration(GlobalConfiguration globalConfiguration) { |
||||||
|
this.globalConfiguration = globalConfiguration; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public GlobalConfiguration globalConfiguration() { |
||||||
|
return getGlobalConfiguration(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isNew() { |
||||||
|
return getNewInitialization(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,37 @@ |
|||||||
|
package com.alibaba.excel.metadata; |
||||||
|
|
||||||
|
/** |
||||||
|
* Global configuration |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
*/ |
||||||
|
public class GlobalConfiguration { |
||||||
|
/** |
||||||
|
* Automatic trim includes sheet name and content |
||||||
|
*/ |
||||||
|
private Boolean autoTrim; |
||||||
|
/** |
||||||
|
* true if date uses 1904 windowing, or false if using 1900 date windowing. |
||||||
|
* |
||||||
|
* default is false |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
private Boolean use1904windowing; |
||||||
|
|
||||||
|
public Boolean getUse1904windowing() { |
||||||
|
return use1904windowing; |
||||||
|
} |
||||||
|
|
||||||
|
public void setUse1904windowing(Boolean use1904windowing) { |
||||||
|
this.use1904windowing = use1904windowing; |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean getAutoTrim() { |
||||||
|
return autoTrim; |
||||||
|
} |
||||||
|
|
||||||
|
public void setAutoTrim(Boolean autoTrim) { |
||||||
|
this.autoTrim = autoTrim; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
package com.alibaba.excel.metadata; |
||||||
|
|
||||||
|
import com.alibaba.excel.enums.HolderEnum; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* Get the corresponding holder |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
**/ |
||||||
|
public interface Holder { |
||||||
|
|
||||||
|
/** |
||||||
|
* What holder is the return |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
HolderEnum holderType(); |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* Record whether it's new or from cache |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
boolean isNew(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Some global variables |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
GlobalConfiguration globalConfiguration(); |
||||||
|
} |
@ -1,51 +1,60 @@ |
|||||||
package com.alibaba.excel.metadata; |
package com.alibaba.excel.metadata; |
||||||
|
|
||||||
import com.alibaba.excel.write.style.RowCellStyleStrategy; |
import java.util.List; |
||||||
|
|
||||||
/** |
/** |
||||||
* table |
|
||||||
* |
|
||||||
* @author jipengfei |
* @author jipengfei |
||||||
*/ |
*/ |
||||||
public class Table extends BasicParameter { |
public class Table { |
||||||
/** |
/** |
||||||
* Starting from 0 |
|
||||||
*/ |
*/ |
||||||
private Integer tableNo; |
private Class<? extends BaseRowModel> clazz; |
||||||
|
|
||||||
|
/** |
||||||
|
*/ |
||||||
|
private List<List<String>> head; |
||||||
|
|
||||||
|
/** |
||||||
|
*/ |
||||||
|
private int tableNo; |
||||||
|
|
||||||
/** |
/** |
||||||
* |
|
||||||
* @deprecated please use{@link RowCellStyleStrategy} |
|
||||||
*/ |
*/ |
||||||
@Deprecated |
|
||||||
private TableStyle tableStyle; |
private TableStyle tableStyle; |
||||||
|
|
||||||
public Table() { |
public TableStyle getTableStyle() { |
||||||
super(); |
return tableStyle; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTableStyle(TableStyle tableStyle) { |
||||||
|
this.tableStyle = tableStyle; |
||||||
} |
} |
||||||
|
|
||||||
public Table(Integer tableNo) { |
public Table(Integer tableNo) { |
||||||
super(); |
|
||||||
this.tableNo = tableNo; |
this.tableNo = tableNo; |
||||||
} |
} |
||||||
|
|
||||||
public Integer getTableNo() { |
public Class<? extends BaseRowModel> getClazz() { |
||||||
return tableNo; |
return clazz; |
||||||
} |
} |
||||||
|
|
||||||
public void setTableNo(Integer tableNo) { |
public void setClazz(Class<? extends BaseRowModel> clazz) { |
||||||
this.tableNo = tableNo; |
this.clazz = clazz; |
||||||
} |
} |
||||||
|
|
||||||
public TableStyle getTableStyle() { |
public List<List<String>> getHead() { |
||||||
return tableStyle; |
return head; |
||||||
} |
} |
||||||
|
|
||||||
public void setTableStyle(TableStyle tableStyle) { |
public void setHead(List<List<String>> head) { |
||||||
this.tableStyle = tableStyle; |
this.head = head; |
||||||
} |
} |
||||||
|
|
||||||
@Override |
public int getTableNo() { |
||||||
public String toString() { |
return tableNo; |
||||||
return "Table{" + "tableNo=" + tableNo + '}'; |
} |
||||||
|
|
||||||
|
public void setTableNo(int tableNo) { |
||||||
|
this.tableNo = tableNo; |
||||||
} |
} |
||||||
} |
} |
||||||
|
@ -0,0 +1,43 @@ |
|||||||
|
package com.alibaba.excel.read.metadata; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.alibaba.excel.metadata.BasicParameter; |
||||||
|
import com.alibaba.excel.read.listener.ReadListener; |
||||||
|
|
||||||
|
/** |
||||||
|
* Read basic parameter |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
**/ |
||||||
|
public class ReadBasicParameter extends BasicParameter { |
||||||
|
/** |
||||||
|
* Count the number of added heads when read sheet. |
||||||
|
* |
||||||
|
* <li>0 - This Sheet has no head ,since the first row are the data |
||||||
|
* <li>1 - This Sheet has one row head , this is the default |
||||||
|
* <li>2 - This Sheet has two row head ,since the third row is the data |
||||||
|
*/ |
||||||
|
private Integer headRowNumber; |
||||||
|
/** |
||||||
|
* Custom type listener run after default |
||||||
|
*/ |
||||||
|
private List<ReadListener> customReadListenerList = new ArrayList<ReadListener>(); |
||||||
|
|
||||||
|
public Integer getHeadRowNumber() { |
||||||
|
return headRowNumber; |
||||||
|
} |
||||||
|
|
||||||
|
public void setHeadRowNumber(Integer headRowNumber) { |
||||||
|
this.headRowNumber = headRowNumber; |
||||||
|
} |
||||||
|
|
||||||
|
public List<ReadListener> getCustomReadListenerList() { |
||||||
|
return customReadListenerList; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCustomReadListenerList(List<ReadListener> customReadListenerList) { |
||||||
|
this.customReadListenerList = customReadListenerList; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
package com.alibaba.excel.read.metadata; |
||||||
|
|
||||||
|
/** |
||||||
|
* Read sheet |
||||||
|
* |
||||||
|
* @author jipengfei |
||||||
|
*/ |
||||||
|
public class ReadSheet extends ReadBasicParameter { |
||||||
|
/** |
||||||
|
* Starting from 0 |
||||||
|
*/ |
||||||
|
private Integer sheetNo; |
||||||
|
/** |
||||||
|
* sheet name |
||||||
|
*/ |
||||||
|
private String sheetName; |
||||||
|
|
||||||
|
public Integer getSheetNo() { |
||||||
|
return sheetNo; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSheetNo(Integer sheetNo) { |
||||||
|
this.sheetNo = sheetNo; |
||||||
|
} |
||||||
|
|
||||||
|
public String getSheetName() { |
||||||
|
return sheetName; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSheetName(String sheetName) { |
||||||
|
this.sheetName = sheetName; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,95 @@ |
|||||||
|
package com.alibaba.excel.read.metadata; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.io.InputStream; |
||||||
|
|
||||||
|
import com.alibaba.excel.support.ExcelTypeEnum; |
||||||
|
|
||||||
|
/** |
||||||
|
* Workbook |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
**/ |
||||||
|
public class ReadWorkbook extends ReadBasicParameter { |
||||||
|
/** |
||||||
|
* Excel type |
||||||
|
*/ |
||||||
|
private ExcelTypeEnum excelType; |
||||||
|
/** |
||||||
|
* Read InputStream |
||||||
|
* <p> |
||||||
|
* If 'inputStream' and 'file' all not empty,file first |
||||||
|
*/ |
||||||
|
private InputStream inputStream; |
||||||
|
/** |
||||||
|
* Read file |
||||||
|
* <p> |
||||||
|
* If 'inputStream' and 'file' all not empty,file first |
||||||
|
*/ |
||||||
|
private File file; |
||||||
|
/** |
||||||
|
* Default true |
||||||
|
*/ |
||||||
|
private Boolean autoCloseStream; |
||||||
|
/** |
||||||
|
* Mandatory use 'inputStream' .Default is false |
||||||
|
*/ |
||||||
|
private Boolean mandatoryUseInputStream; |
||||||
|
/** |
||||||
|
* The default is all excel objects.Default is true. |
||||||
|
* <li>if true , you can use {@link com.alibaba.excel.annotation.ExcelIgnore} ignore a field. |
||||||
|
* <li>if false , you must use {@link com.alibaba.excel.annotation.ExcelProperty} to use a filed. |
||||||
|
* |
||||||
|
* @deprecated Just to be compatible with historical data, The default is always going to be convert all filed. |
||||||
|
*/ |
||||||
|
@Deprecated |
||||||
|
private Boolean convertAllFiled; |
||||||
|
|
||||||
|
public ExcelTypeEnum getExcelType() { |
||||||
|
return excelType; |
||||||
|
} |
||||||
|
|
||||||
|
public void setExcelType(ExcelTypeEnum excelType) { |
||||||
|
this.excelType = excelType; |
||||||
|
} |
||||||
|
|
||||||
|
public InputStream getInputStream() { |
||||||
|
return inputStream; |
||||||
|
} |
||||||
|
|
||||||
|
public void setInputStream(InputStream inputStream) { |
||||||
|
this.inputStream = inputStream; |
||||||
|
} |
||||||
|
|
||||||
|
public File getFile() { |
||||||
|
return file; |
||||||
|
} |
||||||
|
|
||||||
|
public void setFile(File file) { |
||||||
|
this.file = file; |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean getAutoCloseStream() { |
||||||
|
return autoCloseStream; |
||||||
|
} |
||||||
|
|
||||||
|
public void setAutoCloseStream(Boolean autoCloseStream) { |
||||||
|
this.autoCloseStream = autoCloseStream; |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean getMandatoryUseInputStream() { |
||||||
|
return mandatoryUseInputStream; |
||||||
|
} |
||||||
|
|
||||||
|
public void setMandatoryUseInputStream(Boolean mandatoryUseInputStream) { |
||||||
|
this.mandatoryUseInputStream = mandatoryUseInputStream; |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean getConvertAllFiled() { |
||||||
|
return convertAllFiled; |
||||||
|
} |
||||||
|
|
||||||
|
public void setConvertAllFiled(Boolean convertAllFiled) { |
||||||
|
this.convertAllFiled = convertAllFiled; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,240 @@ |
|||||||
|
package com.alibaba.excel.read.metadata.holder; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import com.alibaba.excel.context.AnalysisContext; |
||||||
|
import com.alibaba.excel.converters.Converter; |
||||||
|
import com.alibaba.excel.converters.ConverterKey; |
||||||
|
import com.alibaba.excel.enums.HeadKindEnum; |
||||||
|
import com.alibaba.excel.event.AnalysisEventListener; |
||||||
|
import com.alibaba.excel.exception.ExcelAnalysisException; |
||||||
|
import com.alibaba.excel.exception.ExcelDataConvertException; |
||||||
|
import com.alibaba.excel.metadata.AbstractHolder; |
||||||
|
import com.alibaba.excel.metadata.CellData; |
||||||
|
import com.alibaba.excel.metadata.Head; |
||||||
|
import com.alibaba.excel.metadata.property.ExcelContentProperty; |
||||||
|
import com.alibaba.excel.read.listener.ReadListener; |
||||||
|
import com.alibaba.excel.read.listener.ReadListenerRegistryCenter; |
||||||
|
import com.alibaba.excel.read.listener.event.AnalysisFinishEvent; |
||||||
|
import com.alibaba.excel.read.metadata.ReadBasicParameter; |
||||||
|
import com.alibaba.excel.read.metadata.property.ExcelReadHeadProperty; |
||||||
|
import com.alibaba.excel.util.StringUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* Read Holder |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
*/ |
||||||
|
public abstract class AbstractReadHolder extends AbstractHolder implements ReadHolder, ReadListenerRegistryCenter { |
||||||
|
/** |
||||||
|
* Count the number of added heads when read sheet. |
||||||
|
* |
||||||
|
* <li>0 - This Sheet has no head ,since the first row are the data |
||||||
|
* <li>1 - This Sheet has one row head , this is the default |
||||||
|
* <li>2 - This Sheet has two row head ,since the third row is the data |
||||||
|
*/ |
||||||
|
private Integer headRowNumber; |
||||||
|
/** |
||||||
|
* Excel head property |
||||||
|
*/ |
||||||
|
private ExcelReadHeadProperty excelReadHeadProperty; |
||||||
|
/** |
||||||
|
* Read listener |
||||||
|
*/ |
||||||
|
private List<ReadListener> readListenerList; |
||||||
|
/** |
||||||
|
* Converter for workbook |
||||||
|
*/ |
||||||
|
private Map<ConverterKey, Converter> converterMap; |
||||||
|
|
||||||
|
public AbstractReadHolder(ReadBasicParameter readBasicParameter, AbstractReadHolder parentAbstractReadHolder, |
||||||
|
Boolean convertAllFiled) { |
||||||
|
super(readBasicParameter, parentAbstractReadHolder); |
||||||
|
if (readBasicParameter.getUse1904windowing() == null && parentAbstractReadHolder != null) { |
||||||
|
getGlobalConfiguration() |
||||||
|
.setUse1904windowing(parentAbstractReadHolder.getGlobalConfiguration().getUse1904windowing()); |
||||||
|
} else { |
||||||
|
getGlobalConfiguration().setUse1904windowing(readBasicParameter.getUse1904windowing()); |
||||||
|
} |
||||||
|
|
||||||
|
if (readBasicParameter.getHeadRowNumber() == null) { |
||||||
|
if (parentAbstractReadHolder == null) { |
||||||
|
this.headRowNumber = 1; |
||||||
|
} else { |
||||||
|
this.headRowNumber = parentAbstractReadHolder.getHeadRowNumber(); |
||||||
|
} |
||||||
|
} else { |
||||||
|
this.headRowNumber = readBasicParameter.getHeadRowNumber(); |
||||||
|
} |
||||||
|
// Initialization property
|
||||||
|
this.excelReadHeadProperty = new ExcelReadHeadProperty(getClazz(), getHead(), convertAllFiled); |
||||||
|
|
||||||
|
if (parentAbstractReadHolder == null) { |
||||||
|
this.readListenerList = new ArrayList<ReadListener>(); |
||||||
|
} else { |
||||||
|
this.readListenerList = new ArrayList<ReadListener>(parentAbstractReadHolder.getReadListenerList()); |
||||||
|
} |
||||||
|
if (readBasicParameter.getCustomReadListenerList() != null |
||||||
|
&& !readBasicParameter.getCustomReadListenerList().isEmpty()) { |
||||||
|
this.readListenerList.addAll(readBasicParameter.getCustomReadListenerList()); |
||||||
|
} |
||||||
|
|
||||||
|
if (parentAbstractReadHolder == null) { |
||||||
|
this.converterMap = new HashMap<ConverterKey, Converter>(); |
||||||
|
} else { |
||||||
|
this.converterMap = new HashMap<ConverterKey, Converter>(parentAbstractReadHolder.getConverterMap()); |
||||||
|
} |
||||||
|
if (readBasicParameter.getCustomConverterList() != null |
||||||
|
&& !readBasicParameter.getCustomConverterList().isEmpty()) { |
||||||
|
for (Converter converter : readBasicParameter.getCustomConverterList()) { |
||||||
|
converterMap.put(ConverterKey.buildConverterKey(converter), converter); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void register(AnalysisEventListener listener) { |
||||||
|
readListenerList.add(listener); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void notifyEndOneRow(AnalysisFinishEvent event, AnalysisContext analysisContext) { |
||||||
|
List<CellData> cellDataList = (List<CellData>)event.getAnalysisResult(); |
||||||
|
if (analysisContext.currentRowHolder().getRow().getRowNum() > analysisContext.currentSheetHolder() |
||||||
|
.getReadHeadRowNumber()) { |
||||||
|
for (ReadListener readListener : readListenerList) { |
||||||
|
try { |
||||||
|
readListener.invoke(analysisContext.currentRowAnalysisResult(), analysisContext); |
||||||
|
} catch (Exception e) { |
||||||
|
for (ReadListener readListenerException : readListenerList) { |
||||||
|
try { |
||||||
|
readListenerException.onException(e, analysisContext); |
||||||
|
} catch (Exception exception) { |
||||||
|
throw new ExcelAnalysisException("Listen error!", exception); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
// Now is header
|
||||||
|
if (analysisContext.currentRowNum().equals(analysisContext.currentSheetHolder().getReadHeadRowNumber())) { |
||||||
|
buildHead(analysisContext, cellDataList); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void notifyAfterAllAnalysed(AnalysisContext analysisContext) { |
||||||
|
for (ReadListener readListener : readListenerList) { |
||||||
|
readListener.doAfterAllAnalysed(analysisContext); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private void buildHead(AnalysisContext analysisContext, List<CellData> cellDataList) { |
||||||
|
if (!HeadKindEnum.CLASS.equals(analysisContext.currentConfiguration().excelReadHeadProperty().getHeadKind())) { |
||||||
|
return; |
||||||
|
} |
||||||
|
List<String> dataList = (List<String>)buildStringList(cellDataList, analysisContext.currentConfiguration()); |
||||||
|
ExcelReadHeadProperty excelHeadPropertyData = analysisContext.currentConfiguration().excelReadHeadProperty(); |
||||||
|
Map<Integer, Head> headMapData = excelHeadPropertyData.getHeadMap(); |
||||||
|
Map<Integer, ExcelContentProperty> contentPropertyMapData = excelHeadPropertyData.getContentPropertyMap(); |
||||||
|
Map<Integer, Head> tmpHeadMap = new HashMap<Integer, Head>(headMapData.size() * 4 / 3 + 1); |
||||||
|
Map<Integer, ExcelContentProperty> tmpContentPropertyMap = |
||||||
|
new HashMap<Integer, ExcelContentProperty>(contentPropertyMapData.size() * 4 / 3 + 1); |
||||||
|
for (Map.Entry<Integer, Head> entry : headMapData.entrySet()) { |
||||||
|
Head headData = entry.getValue(); |
||||||
|
if (headData.getForceIndex()) { |
||||||
|
tmpHeadMap.put(entry.getKey(), headData); |
||||||
|
tmpContentPropertyMap.put(entry.getKey(), contentPropertyMapData.get(entry.getKey())); |
||||||
|
continue; |
||||||
|
} |
||||||
|
String headName = headData.getHeadNameList().get(0); |
||||||
|
for (int i = 0; i < dataList.size(); i++) { |
||||||
|
String headString = dataList.get(i); |
||||||
|
if (StringUtils.isEmpty(headString)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
if (analysisContext.currentSheetHolder().getAutoTrim()) { |
||||||
|
headString = headString.trim(); |
||||||
|
} |
||||||
|
if (headName.equals(headString)) { |
||||||
|
headData.setColumnIndex(i); |
||||||
|
tmpHeadMap.put(i, headData); |
||||||
|
tmpContentPropertyMap.put(i, contentPropertyMapData.get(entry.getKey())); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
excelHeadPropertyData.setHeadMap(tmpHeadMap); |
||||||
|
excelHeadPropertyData.setContentPropertyMap(tmpContentPropertyMap); |
||||||
|
} |
||||||
|
|
||||||
|
private Object buildStringList(List<CellData> data, |
||||||
|
com.alibaba.excel.read.metadata.read.ReadConfiguration readConfiguration) { |
||||||
|
List<String> list = new ArrayList<String>(); |
||||||
|
for (CellData cellData : data) { |
||||||
|
Converter converter = readConfiguration.readConverterMap() |
||||||
|
.get(ConverterKey.buildConverterKey(String.class, cellData.getType())); |
||||||
|
if (converter == null) { |
||||||
|
throw new ExcelDataConvertException( |
||||||
|
"Converter not found, convert " + cellData.getType() + " to String"); |
||||||
|
} |
||||||
|
try { |
||||||
|
list.add((String)(converter.convertToJavaData(cellData, null))); |
||||||
|
} catch (Exception e) { |
||||||
|
throw new ExcelDataConvertException("Convert data " + cellData + " to String error ", e); |
||||||
|
} |
||||||
|
} |
||||||
|
return list; |
||||||
|
} |
||||||
|
|
||||||
|
public List<ReadListener> getReadListenerList() { |
||||||
|
return readListenerList; |
||||||
|
} |
||||||
|
|
||||||
|
public void setReadListenerList(List<ReadListener> readListenerList) { |
||||||
|
this.readListenerList = readListenerList; |
||||||
|
} |
||||||
|
|
||||||
|
public Map<ConverterKey, Converter> getConverterMap() { |
||||||
|
return converterMap; |
||||||
|
} |
||||||
|
|
||||||
|
public void setConverterMap(Map<ConverterKey, Converter> converterMap) { |
||||||
|
this.converterMap = converterMap; |
||||||
|
} |
||||||
|
|
||||||
|
public ExcelReadHeadProperty getExcelReadHeadProperty() { |
||||||
|
return excelReadHeadProperty; |
||||||
|
} |
||||||
|
|
||||||
|
public void setExcelReadHeadProperty(ExcelReadHeadProperty excelReadHeadProperty) { |
||||||
|
this.excelReadHeadProperty = excelReadHeadProperty; |
||||||
|
} |
||||||
|
|
||||||
|
public Integer getHeadRowNumber() { |
||||||
|
return headRowNumber; |
||||||
|
} |
||||||
|
|
||||||
|
public void setHeadRowNumber(Integer headRowNumber) { |
||||||
|
this.headRowNumber = headRowNumber; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<ReadListener> readListenerList() { |
||||||
|
return getReadListenerList(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Map<ConverterKey, Converter> converterMap() { |
||||||
|
return getConverterMap(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public ExcelReadHeadProperty excelReadHeadProperty() { |
||||||
|
return getExcelReadHeadProperty(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,40 @@ |
|||||||
|
package com.alibaba.excel.read.metadata.holder; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import com.alibaba.excel.converters.Converter; |
||||||
|
import com.alibaba.excel.converters.ConverterKey; |
||||||
|
import com.alibaba.excel.metadata.Holder; |
||||||
|
import com.alibaba.excel.read.listener.ReadListener; |
||||||
|
import com.alibaba.excel.read.metadata.property.ExcelReadHeadProperty; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* Get the corresponding Holder |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
**/ |
||||||
|
public interface ReadHolder extends Holder { |
||||||
|
/** |
||||||
|
* What handler does the currently operated cell need to execute |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
List<ReadListener> readListenerList(); |
||||||
|
|
||||||
|
/** |
||||||
|
* What converter does the currently operated cell need to execute |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
Map<ConverterKey, Converter> converterMap(); |
||||||
|
|
||||||
|
/** |
||||||
|
* What 'ExcelReadHeadProperty' does the currently operated cell need to execute |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
ExcelReadHeadProperty excelReadHeadProperty(); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,79 @@ |
|||||||
|
package com.alibaba.excel.read.metadata.holder; |
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.Row; |
||||||
|
|
||||||
|
import com.alibaba.excel.enums.HolderEnum; |
||||||
|
import com.alibaba.excel.metadata.GlobalConfiguration; |
||||||
|
import com.alibaba.excel.metadata.Holder; |
||||||
|
|
||||||
|
/** |
||||||
|
* sheet holder |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
*/ |
||||||
|
public class ReadRowHolder implements Holder { |
||||||
|
|
||||||
|
/*** |
||||||
|
* poi row |
||||||
|
*/ |
||||||
|
private Row row; |
||||||
|
/** |
||||||
|
* Some global variables |
||||||
|
*/ |
||||||
|
private GlobalConfiguration globalConfiguration; |
||||||
|
/** |
||||||
|
* The result of the previous listener |
||||||
|
*/ |
||||||
|
private Object currentRowAnalysisResult; |
||||||
|
/** |
||||||
|
* Data starting from the first row after the head is removed.Start form 1 |
||||||
|
*/ |
||||||
|
private int relativeRowIndex; |
||||||
|
|
||||||
|
public Row getRow() { |
||||||
|
return row; |
||||||
|
} |
||||||
|
|
||||||
|
public void setRow(Row row) { |
||||||
|
this.row = row; |
||||||
|
} |
||||||
|
|
||||||
|
public GlobalConfiguration getGlobalConfiguration() { |
||||||
|
return globalConfiguration; |
||||||
|
} |
||||||
|
|
||||||
|
public void setGlobalConfiguration(GlobalConfiguration globalConfiguration) { |
||||||
|
this.globalConfiguration = globalConfiguration; |
||||||
|
} |
||||||
|
|
||||||
|
public Object getCurrentRowAnalysisResult() { |
||||||
|
return currentRowAnalysisResult; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCurrentRowAnalysisResult(Object currentRowAnalysisResult) { |
||||||
|
this.currentRowAnalysisResult = currentRowAnalysisResult; |
||||||
|
} |
||||||
|
|
||||||
|
public int getRelativeRowIndex() { |
||||||
|
return relativeRowIndex; |
||||||
|
} |
||||||
|
|
||||||
|
public void setRelativeRowIndex(int relativeRowIndex) { |
||||||
|
this.relativeRowIndex = relativeRowIndex; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public HolderEnum holderType() { |
||||||
|
return HolderEnum.ROW; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isNew() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public GlobalConfiguration globalConfiguration() { |
||||||
|
return getGlobalConfiguration(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,239 @@ |
|||||||
|
package com.alibaba.excel.read.metadata.holder; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.Sheet; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
|
||||||
|
import com.alibaba.excel.converters.Converter; |
||||||
|
import com.alibaba.excel.converters.ConverterKey; |
||||||
|
import com.alibaba.excel.metadata.CellStyle; |
||||||
|
import com.alibaba.excel.metadata.Head; |
||||||
|
import com.alibaba.excel.metadata.TableStyle; |
||||||
|
import com.alibaba.excel.metadata.property.ExcelHeadProperty; |
||||||
|
import com.alibaba.excel.read.listener.ReadListener; |
||||||
|
import com.alibaba.excel.write.handler.WriteHandler; |
||||||
|
import com.alibaba.excel.write.style.RowCellStyleStrategy; |
||||||
|
import com.alibaba.excel.write.style.column.AbstractHeadColumnWidthStyleStrategy; |
||||||
|
|
||||||
|
/** |
||||||
|
* sheet holder |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
*/ |
||||||
|
public class ReadSheetHolder extends AbstractReadHolder { |
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(SheetHolder.class); |
||||||
|
/*** |
||||||
|
* poi sheet |
||||||
|
*/ |
||||||
|
private Sheet sheet; |
||||||
|
/*** |
||||||
|
* sheetNo |
||||||
|
*/ |
||||||
|
private Integer sheetNo; |
||||||
|
/*** |
||||||
|
* sheetName |
||||||
|
*/ |
||||||
|
private String sheetName; |
||||||
|
/** |
||||||
|
* get total row , Data may be inaccurate |
||||||
|
*/ |
||||||
|
@Deprecated |
||||||
|
private Integer total; |
||||||
|
/*** |
||||||
|
* poi sheet |
||||||
|
*/ |
||||||
|
private WorkbookHolder parentWorkBook; |
||||||
|
/*** |
||||||
|
* has been initialized table |
||||||
|
*/ |
||||||
|
private Map<Integer, TableHolder> hasBeenInitializedTable; |
||||||
|
/** |
||||||
|
* current param |
||||||
|
*/ |
||||||
|
private com.alibaba.excel.write.metadata.Sheet sheetParam; |
||||||
|
|
||||||
|
public static SheetHolder buildWriteWorkSheetHolder(com.alibaba.excel.write.metadata.Sheet sheet, |
||||||
|
WorkbookHolder workbookHolder) { |
||||||
|
SheetHolder sheetHolder = buildBaseSheetHolder(sheet, workbookHolder); |
||||||
|
|
||||||
|
sheetHolder.setNewInitialization(Boolean.TRUE); |
||||||
|
if (sheet.getNeedHead() == null) { |
||||||
|
sheetHolder.setNeedHead(workbookHolder.needHead()); |
||||||
|
} else { |
||||||
|
sheetHolder.setNeedHead(sheet.getNeedHead()); |
||||||
|
} |
||||||
|
if (sheet.getWriteRelativeHeadRowIndex() == null) { |
||||||
|
sheetHolder.setWriteRelativeHeadRowIndex(workbookHolder.writeRelativeHeadRowIndex()); |
||||||
|
} else { |
||||||
|
sheetHolder.setWriteRelativeHeadRowIndex(sheet.getWriteRelativeHeadRowIndex()); |
||||||
|
} |
||||||
|
// Compatible with old code
|
||||||
|
compatibleOldCode(sheet); |
||||||
|
List<WriteHandler> handlerList = new ArrayList<WriteHandler>(); |
||||||
|
if (sheet.getCustomWriteHandlerList() != null && !sheet.getCustomWriteHandlerList().isEmpty()) { |
||||||
|
handlerList.addAll(sheet.getCustomWriteHandlerList()); |
||||||
|
} |
||||||
|
// Initialization Annotation
|
||||||
|
sheetHolder.initAnnotationConfig(handlerList); |
||||||
|
|
||||||
|
sheetHolder |
||||||
|
.setWriteHandlerMap(sheetHolder.sortAndClearUpHandler(handlerList, workbookHolder.getWriteHandlerMap())); |
||||||
|
Map<Class, Converter> converterMap = new HashMap<Class, Converter>(workbookHolder.getWriteConverterMap()); |
||||||
|
if (sheet.getCustomConverterList() != null && !sheet.getCustomConverterList().isEmpty()) { |
||||||
|
for (Converter converter : sheet.getCustomConverterList()) { |
||||||
|
converterMap.put(converter.getClass(), converter); |
||||||
|
} |
||||||
|
} |
||||||
|
sheetHolder.setWriteConverterMap(converterMap); |
||||||
|
sheetHolder.setHasBeenInitializedTable(new HashMap<Integer, TableHolder>()); |
||||||
|
if (LOGGER.isDebugEnabled()) { |
||||||
|
LOGGER.debug("Sheet writeHandlerMap:{}", sheetHolder.getWriteHandlerMap()); |
||||||
|
} |
||||||
|
return sheetHolder; |
||||||
|
} |
||||||
|
|
||||||
|
public static SheetHolder buildReadWorkSheetHolder(com.alibaba.excel.write.metadata.Sheet sheet, |
||||||
|
WorkbookHolder workbookHolder) { |
||||||
|
SheetHolder sheetHolder = buildBaseSheetHolder(sheet, workbookHolder); |
||||||
|
if (sheet.getReadHeadRowNumber() == null) { |
||||||
|
if (workbookHolder.getReadHeadRowNumber() == null) { |
||||||
|
sheetHolder.setReadHeadRowNumber(sheetHolder.getExcelHeadProperty().getHeadRowNumber()); |
||||||
|
} else { |
||||||
|
sheetHolder.setReadHeadRowNumber(workbookHolder.getReadHeadRowNumber()); |
||||||
|
} |
||||||
|
} else { |
||||||
|
sheetHolder.setReadHeadRowNumber(sheet.getReadHeadRowNumber()); |
||||||
|
} |
||||||
|
|
||||||
|
Map<ConverterKey, Converter> converterMap = |
||||||
|
new HashMap<ConverterKey, Converter>(workbookHolder.getReadConverterMap()); |
||||||
|
if (sheet.getCustomConverterList() != null && !sheet.getCustomConverterList().isEmpty()) { |
||||||
|
for (Converter converter : sheet.getCustomConverterList()) { |
||||||
|
converterMap.put(ConverterKey.buildConverterKey(converter), converter); |
||||||
|
} |
||||||
|
} |
||||||
|
sheetHolder.setReadConverterMap(converterMap); |
||||||
|
|
||||||
|
List<ReadListener> readListenerList = new ArrayList<ReadListener>(); |
||||||
|
if (sheet.getCustomReadListenerList() != null && !sheet.getCustomReadListenerList().isEmpty()) { |
||||||
|
readListenerList.addAll(sheet.getCustomReadListenerList()); |
||||||
|
} |
||||||
|
sheetHolder.setReadListenerList(readListenerList); |
||||||
|
return sheetHolder; |
||||||
|
} |
||||||
|
|
||||||
|
private static SheetHolder buildBaseSheetHolder(com.alibaba.excel.write.metadata.Sheet sheet, |
||||||
|
WorkbookHolder workbookHolder) { |
||||||
|
SheetHolder sheetHolder = new SheetHolder(); |
||||||
|
sheetHolder.setSheetParam(sheet); |
||||||
|
sheetHolder.setParentWorkBook(workbookHolder); |
||||||
|
|
||||||
|
boolean noHead = (sheet.getHead() == null || sheet.getHead().isEmpty()) && sheet.getClazz() == null; |
||||||
|
if (noHead) { |
||||||
|
// Use parent
|
||||||
|
sheetHolder.setHead(workbookHolder.getHead()); |
||||||
|
sheetHolder.setClazz(workbookHolder.getClazz()); |
||||||
|
} else { |
||||||
|
sheetHolder.setHead(sheet.getHead()); |
||||||
|
sheetHolder.setClazz(sheet.getClazz()); |
||||||
|
} |
||||||
|
|
||||||
|
if (sheet.getAutoTrim() == null) { |
||||||
|
workbookHolder.setAutoTrim(workbookHolder.getAutoTrim()); |
||||||
|
} else { |
||||||
|
workbookHolder.setAutoTrim(sheet.getNeedHead()); |
||||||
|
} |
||||||
|
// Initialization property
|
||||||
|
sheetHolder |
||||||
|
.setExcelHeadProperty(new ExcelHeadProperty(sheetHolder.getClazz(), sheetHolder.getHead(), workbookHolder)); |
||||||
|
return sheetHolder; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Compatible with old code |
||||||
|
*/ |
||||||
|
@Deprecated |
||||||
|
private static void compatibleOldCode(com.alibaba.excel.write.metadata.Sheet sheet) { |
||||||
|
if (sheet.getColumnWidthMap() != null && !sheet.getColumnWidthMap().isEmpty()) { |
||||||
|
final Map<Integer, Integer> columnWidthMap = sheet.getColumnWidthMap(); |
||||||
|
if (sheet.getCustomWriteHandlerList() == null) { |
||||||
|
sheet.setCustomWriteHandlerList(new ArrayList<WriteHandler>()); |
||||||
|
} |
||||||
|
sheet.getCustomWriteHandlerList().add(new AbstractHeadColumnWidthStyleStrategy() { |
||||||
|
@Override |
||||||
|
protected Integer columnWidth(Head head) { |
||||||
|
if (columnWidthMap.containsKey(head.getColumnIndex())) { |
||||||
|
columnWidthMap.get(head.getColumnIndex()); |
||||||
|
} |
||||||
|
return 20; |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
if (sheet.getTableStyle() != null) { |
||||||
|
final TableStyle tableStyle = sheet.getTableStyle(); |
||||||
|
if (sheet.getCustomWriteHandlerList() == null) { |
||||||
|
sheet.setCustomWriteHandlerList(new ArrayList<WriteHandler>()); |
||||||
|
} |
||||||
|
CellStyle headCellStyle = new CellStyle(); |
||||||
|
headCellStyle.setFont(tableStyle.getTableHeadFont()); |
||||||
|
headCellStyle.setIndexedColors(tableStyle.getTableContentBackGroundColor()); |
||||||
|
CellStyle contentCellStyle = new CellStyle(); |
||||||
|
contentCellStyle.setFont(tableStyle.getTableContentFont()); |
||||||
|
contentCellStyle.setIndexedColors(tableStyle.getTableContentBackGroundColor()); |
||||||
|
sheet.getCustomWriteHandlerList().add(new RowCellStyleStrategy(headCellStyle, contentCellStyle)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public Sheet getSheet() { |
||||||
|
return sheet; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSheet(Sheet sheet) { |
||||||
|
this.sheet = sheet; |
||||||
|
} |
||||||
|
|
||||||
|
public Integer getSheetNo() { |
||||||
|
return sheetNo; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSheetNo(Integer sheetNo) { |
||||||
|
this.sheetNo = sheetNo; |
||||||
|
} |
||||||
|
|
||||||
|
public String getSheetName() { |
||||||
|
return sheetName; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSheetName(String sheetName) { |
||||||
|
this.sheetName = sheetName; |
||||||
|
} |
||||||
|
|
||||||
|
public WorkbookHolder getParentWorkBook() { |
||||||
|
return parentWorkBook; |
||||||
|
} |
||||||
|
|
||||||
|
public void setParentWorkBook(WorkbookHolder parentWorkBook) { |
||||||
|
this.parentWorkBook = parentWorkBook; |
||||||
|
} |
||||||
|
|
||||||
|
public Map<Integer, TableHolder> getHasBeenInitializedTable() { |
||||||
|
return hasBeenInitializedTable; |
||||||
|
} |
||||||
|
|
||||||
|
public void setHasBeenInitializedTable(Map<Integer, TableHolder> hasBeenInitializedTable) { |
||||||
|
this.hasBeenInitializedTable = hasBeenInitializedTable; |
||||||
|
} |
||||||
|
|
||||||
|
public com.alibaba.excel.write.metadata.Sheet getSheetParam() { |
||||||
|
return sheetParam; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSheetParam(com.alibaba.excel.write.metadata.Sheet sheetParam) { |
||||||
|
this.sheetParam = sheetParam; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
package com.alibaba.excel.read.metadata.property; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.alibaba.excel.metadata.property.ExcelHeadProperty; |
||||||
|
|
||||||
|
/** |
||||||
|
* Define the header attribute of excel |
||||||
|
* |
||||||
|
* @author jipengfei |
||||||
|
*/ |
||||||
|
public class ExcelReadHeadProperty extends ExcelHeadProperty { |
||||||
|
|
||||||
|
public ExcelReadHeadProperty(Class headClazz, List<List<String>> head, Boolean convertAllFiled) { |
||||||
|
super(headClazz, head, convertAllFiled); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,51 @@ |
|||||||
|
package com.alibaba.excel.write.metadata; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.alibaba.excel.metadata.BasicParameter; |
||||||
|
import com.alibaba.excel.write.handler.WriteHandler; |
||||||
|
|
||||||
|
/** |
||||||
|
* Write basic parameter |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
**/ |
||||||
|
public class WriteBasicParameter extends BasicParameter { |
||||||
|
/** |
||||||
|
* Writes the head relative to the existing contents of the sheet. Indexes are zero-based. |
||||||
|
*/ |
||||||
|
private Integer relativeHeadRowIndex; |
||||||
|
/** |
||||||
|
* Need Head |
||||||
|
*/ |
||||||
|
private Boolean needHead; |
||||||
|
/** |
||||||
|
* Custom type handler override the default |
||||||
|
*/ |
||||||
|
private List<WriteHandler> customWriteHandlerList = new ArrayList<WriteHandler>(); |
||||||
|
|
||||||
|
public Integer getRelativeHeadRowIndex() { |
||||||
|
return relativeHeadRowIndex; |
||||||
|
} |
||||||
|
|
||||||
|
public void setRelativeHeadRowIndex(Integer relativeHeadRowIndex) { |
||||||
|
this.relativeHeadRowIndex = relativeHeadRowIndex; |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean getNeedHead() { |
||||||
|
return needHead; |
||||||
|
} |
||||||
|
|
||||||
|
public void setNeedHead(Boolean needHead) { |
||||||
|
this.needHead = needHead; |
||||||
|
} |
||||||
|
|
||||||
|
public List<WriteHandler> getCustomWriteHandlerList() { |
||||||
|
return customWriteHandlerList; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCustomWriteHandlerList(List<WriteHandler> customWriteHandlerList) { |
||||||
|
this.customWriteHandlerList = customWriteHandlerList; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,69 @@ |
|||||||
|
package com.alibaba.excel.write.metadata; |
||||||
|
|
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import com.alibaba.excel.metadata.TableStyle; |
||||||
|
import com.alibaba.excel.write.style.RowCellStyleStrategy; |
||||||
|
import com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy; |
||||||
|
|
||||||
|
/** |
||||||
|
* Write sheet |
||||||
|
* |
||||||
|
* @author jipengfei |
||||||
|
*/ |
||||||
|
public class WriteSheet extends WriteBasicParameter { |
||||||
|
/** |
||||||
|
* Starting from 0 |
||||||
|
*/ |
||||||
|
private Integer sheetNo; |
||||||
|
/** |
||||||
|
* sheet name |
||||||
|
*/ |
||||||
|
private String sheetName; |
||||||
|
/** |
||||||
|
* column with |
||||||
|
* |
||||||
|
* @deprecated please use {@link SimpleColumnWidthStyleStrategy} |
||||||
|
*/ |
||||||
|
@Deprecated |
||||||
|
private Map<Integer, Integer> columnWidthMap = new HashMap<Integer, Integer>(); |
||||||
|
/** |
||||||
|
* |
||||||
|
* @deprecated please use{@link RowCellStyleStrategy} |
||||||
|
*/ |
||||||
|
@Deprecated |
||||||
|
private TableStyle tableStyle; |
||||||
|
|
||||||
|
public Integer getSheetNo() { |
||||||
|
return sheetNo; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSheetNo(Integer sheetNo) { |
||||||
|
this.sheetNo = sheetNo; |
||||||
|
} |
||||||
|
|
||||||
|
public String getSheetName() { |
||||||
|
return sheetName; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSheetName(String sheetName) { |
||||||
|
this.sheetName = sheetName; |
||||||
|
} |
||||||
|
|
||||||
|
public Map<Integer, Integer> getColumnWidthMap() { |
||||||
|
return columnWidthMap; |
||||||
|
} |
||||||
|
|
||||||
|
public void setColumnWidthMap(Map<Integer, Integer> columnWidthMap) { |
||||||
|
this.columnWidthMap = columnWidthMap; |
||||||
|
} |
||||||
|
|
||||||
|
public TableStyle getTableStyle() { |
||||||
|
return tableStyle; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTableStyle(TableStyle tableStyle) { |
||||||
|
this.tableStyle = tableStyle; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,38 @@ |
|||||||
|
package com.alibaba.excel.write.metadata; |
||||||
|
|
||||||
|
import com.alibaba.excel.metadata.TableStyle; |
||||||
|
import com.alibaba.excel.write.style.RowCellStyleStrategy; |
||||||
|
|
||||||
|
/** |
||||||
|
* table |
||||||
|
* |
||||||
|
* @author jipengfei |
||||||
|
*/ |
||||||
|
public class WriteTable extends WriteBasicParameter { |
||||||
|
/** |
||||||
|
* Starting from 0 |
||||||
|
*/ |
||||||
|
private Integer tableNo; |
||||||
|
/** |
||||||
|
* |
||||||
|
* @deprecated please use{@link RowCellStyleStrategy} |
||||||
|
*/ |
||||||
|
@Deprecated |
||||||
|
private TableStyle tableStyle; |
||||||
|
|
||||||
|
public Integer getTableNo() { |
||||||
|
return tableNo; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTableNo(Integer tableNo) { |
||||||
|
this.tableNo = tableNo; |
||||||
|
} |
||||||
|
|
||||||
|
public TableStyle getTableStyle() { |
||||||
|
return tableStyle; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTableStyle(TableStyle tableStyle) { |
||||||
|
this.tableStyle = tableStyle; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,86 @@ |
|||||||
|
package com.alibaba.excel.write.metadata.holder; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import com.alibaba.excel.context.AnalysisContext; |
||||||
|
import com.alibaba.excel.converters.Converter; |
||||||
|
import com.alibaba.excel.converters.ConverterKey; |
||||||
|
import com.alibaba.excel.enums.HeadKindEnum; |
||||||
|
import com.alibaba.excel.exception.ExcelDataConvertException; |
||||||
|
import com.alibaba.excel.metadata.CellData; |
||||||
|
import com.alibaba.excel.metadata.Head; |
||||||
|
import com.alibaba.excel.read.metadata.read.ReadConfiguration; |
||||||
|
import com.alibaba.excel.metadata.property.ExcelContentProperty; |
||||||
|
import com.alibaba.excel.metadata.property.ExcelHeadProperty; |
||||||
|
import com.alibaba.excel.util.StringUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* TODO |
||||||
|
* |
||||||
|
* @author 罗成 |
||||||
|
**/ |
||||||
|
public class UTils { |
||||||
|
|
||||||
|
|
||||||
|
private void buildHead(AnalysisContext analysisContext, List<CellData> cellDataList) { |
||||||
|
if (!HeadKindEnum.CLASS.equals(analysisContext.currentConfiguration().excelHeadProperty().getHeadKind())) { |
||||||
|
return; |
||||||
|
} |
||||||
|
List<String> dataList = (List<String>)buildStringList(cellDataList, analysisContext.currentConfiguration()); |
||||||
|
ExcelHeadProperty excelHeadPropertyData = analysisContext.currentConfiguration().excelHeadProperty(); |
||||||
|
Map<Integer, Head> headMapData = excelHeadPropertyData.getHeadMap(); |
||||||
|
Map<Integer, ExcelContentProperty> contentPropertyMapData = excelHeadPropertyData.getContentPropertyMap(); |
||||||
|
Map<Integer, Head> tmpHeadMap = new HashMap<Integer, Head>(headMapData.size() * 4 / 3 + 1); |
||||||
|
Map<Integer, ExcelContentProperty> tmpContentPropertyMap = |
||||||
|
new HashMap<Integer, ExcelContentProperty>(contentPropertyMapData.size() * 4 / 3 + 1); |
||||||
|
for (Map.Entry<Integer, Head> entry : headMapData.entrySet()) { |
||||||
|
Head headData = entry.getValue(); |
||||||
|
if (headData.getForceIndex()) { |
||||||
|
tmpHeadMap.put(entry.getKey(), headData); |
||||||
|
tmpContentPropertyMap.put(entry.getKey(), contentPropertyMapData.get(entry.getKey())); |
||||||
|
continue; |
||||||
|
} |
||||||
|
String headName = headData.getHeadNameList().get(0); |
||||||
|
for (int i = 0; i < dataList.size(); i++) { |
||||||
|
String headString = dataList.get(i); |
||||||
|
if (StringUtils.isEmpty(headString)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
if (analysisContext.currentSheetHolder().getAutoTrim()) { |
||||||
|
headString = headString.trim(); |
||||||
|
} |
||||||
|
if (headName.equals(headString)) { |
||||||
|
headData.setColumnIndex(i); |
||||||
|
tmpHeadMap.put(i, headData); |
||||||
|
tmpContentPropertyMap.put(i, contentPropertyMapData.get(entry.getKey())); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
excelHeadPropertyData.setHeadMap(tmpHeadMap); |
||||||
|
excelHeadPropertyData.setContentPropertyMap(tmpContentPropertyMap); |
||||||
|
} |
||||||
|
|
||||||
|
private Object buildStringList(List<CellData> data, ReadConfiguration readConfiguration) { |
||||||
|
List<String> list = new ArrayList<String>(); |
||||||
|
for (CellData cellData : data) { |
||||||
|
Converter converter = readConfiguration.readConverterMap() |
||||||
|
.get(ConverterKey.buildConverterKey(String.class, cellData.getType())); |
||||||
|
if (converter == null) { |
||||||
|
throw new ExcelDataConvertException( |
||||||
|
"Converter not found, convert " + cellData.getType() + " to String"); |
||||||
|
} |
||||||
|
try { |
||||||
|
list.add((String)(converter.convertToJavaData(cellData, null))); |
||||||
|
} catch (Exception e) { |
||||||
|
throw new ExcelDataConvertException("Convert data " + cellData + " to String error ", e); |
||||||
|
} |
||||||
|
} |
||||||
|
return list; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,109 @@ |
|||||||
|
package com.alibaba.excel.write.metadata.holder; |
||||||
|
|
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.Sheet; |
||||||
|
|
||||||
|
import com.alibaba.excel.enums.HolderEnum; |
||||||
|
import com.alibaba.excel.read.metadata.holder.TableHolder; |
||||||
|
import com.alibaba.excel.write.metadata.WriteSheet; |
||||||
|
|
||||||
|
/** |
||||||
|
* sheet holder |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
*/ |
||||||
|
public class WriteSheetHolder extends AbstractWriteHolder { |
||||||
|
/** |
||||||
|
* current param |
||||||
|
*/ |
||||||
|
private WriteSheet writeSheet; |
||||||
|
/*** |
||||||
|
* poi sheet |
||||||
|
*/ |
||||||
|
private Sheet sheet; |
||||||
|
/*** |
||||||
|
* sheetNo |
||||||
|
*/ |
||||||
|
private Integer sheetNo; |
||||||
|
/*** |
||||||
|
* sheetName |
||||||
|
*/ |
||||||
|
private String sheetName; |
||||||
|
/*** |
||||||
|
* poi sheet |
||||||
|
*/ |
||||||
|
private WriteWorkbookHolder parentWorkBook; |
||||||
|
/*** |
||||||
|
* has been initialized table |
||||||
|
*/ |
||||||
|
private Map<Integer, TableHolder> hasBeenInitializedTable; |
||||||
|
|
||||||
|
public WriteSheetHolder(WriteSheet writeSheet, WriteWorkbookHolder writeWorkbookHolder) { |
||||||
|
super(writeSheet, writeWorkbookHolder, writeWorkbookHolder.getWriteWorkbook().getConvertAllFiled()); |
||||||
|
this.writeSheet = writeSheet; |
||||||
|
this.sheetNo = writeSheet.getSheetNo(); |
||||||
|
if (writeSheet.getSheetName() == null) { |
||||||
|
this.sheetName = writeSheet.getSheetNo().toString(); |
||||||
|
} else { |
||||||
|
this.sheetName = writeSheet.getSheetName(); |
||||||
|
} |
||||||
|
this.parentWorkBook = writeWorkbookHolder; |
||||||
|
this.hasBeenInitializedTable = new HashMap<Integer, TableHolder>(); |
||||||
|
} |
||||||
|
|
||||||
|
public WriteSheet getWriteSheet() { |
||||||
|
return writeSheet; |
||||||
|
} |
||||||
|
|
||||||
|
public void setWriteSheet(WriteSheet writeSheet) { |
||||||
|
this.writeSheet = writeSheet; |
||||||
|
} |
||||||
|
|
||||||
|
public Sheet getSheet() { |
||||||
|
return sheet; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSheet(Sheet sheet) { |
||||||
|
this.sheet = sheet; |
||||||
|
} |
||||||
|
|
||||||
|
public Integer getSheetNo() { |
||||||
|
return sheetNo; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSheetNo(Integer sheetNo) { |
||||||
|
this.sheetNo = sheetNo; |
||||||
|
} |
||||||
|
|
||||||
|
public String getSheetName() { |
||||||
|
return sheetName; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSheetName(String sheetName) { |
||||||
|
this.sheetName = sheetName; |
||||||
|
} |
||||||
|
|
||||||
|
public WriteWorkbookHolder getParentWorkBook() { |
||||||
|
return parentWorkBook; |
||||||
|
} |
||||||
|
|
||||||
|
public void setParentWorkBook(WriteWorkbookHolder parentWorkBook) { |
||||||
|
this.parentWorkBook = parentWorkBook; |
||||||
|
} |
||||||
|
|
||||||
|
public Map<Integer, TableHolder> getHasBeenInitializedTable() { |
||||||
|
return hasBeenInitializedTable; |
||||||
|
} |
||||||
|
|
||||||
|
public void setHasBeenInitializedTable( |
||||||
|
Map<Integer, TableHolder> hasBeenInitializedTable) { |
||||||
|
this.hasBeenInitializedTable = hasBeenInitializedTable; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public HolderEnum holderType() { |
||||||
|
return HolderEnum.SHEET; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,61 @@ |
|||||||
|
package com.alibaba.excel.write.metadata.holder; |
||||||
|
|
||||||
|
import com.alibaba.excel.enums.HolderEnum; |
||||||
|
import com.alibaba.excel.write.metadata.WriteTable; |
||||||
|
|
||||||
|
/** |
||||||
|
* sheet holder |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
*/ |
||||||
|
public class WriteTableHolder extends AbstractWriteHolder { |
||||||
|
/*** |
||||||
|
* poi sheet |
||||||
|
*/ |
||||||
|
private WriteSheetHolder parentSheet; |
||||||
|
/*** |
||||||
|
* tableNo |
||||||
|
*/ |
||||||
|
private Integer tableNo; |
||||||
|
/** |
||||||
|
* current table param |
||||||
|
*/ |
||||||
|
private WriteTable writeTable; |
||||||
|
|
||||||
|
public WriteTableHolder(WriteTable writeTable, WriteSheetHolder writeSheetHolder, |
||||||
|
WriteWorkbookHolder writeWorkbookHolder) { |
||||||
|
super(writeTable, writeSheetHolder, writeWorkbookHolder.getWriteWorkbook().getConvertAllFiled()); |
||||||
|
this.parentSheet = writeSheetHolder; |
||||||
|
this.tableNo = writeTable.getTableNo(); |
||||||
|
this.writeTable = writeTable; |
||||||
|
} |
||||||
|
|
||||||
|
public WriteSheetHolder getParentSheet() { |
||||||
|
return parentSheet; |
||||||
|
} |
||||||
|
|
||||||
|
public void setParentSheet(WriteSheetHolder parentSheet) { |
||||||
|
this.parentSheet = parentSheet; |
||||||
|
} |
||||||
|
|
||||||
|
public Integer getTableNo() { |
||||||
|
return tableNo; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTableNo(Integer tableNo) { |
||||||
|
this.tableNo = tableNo; |
||||||
|
} |
||||||
|
|
||||||
|
public WriteTable getWriteTable() { |
||||||
|
return writeTable; |
||||||
|
} |
||||||
|
|
||||||
|
public void setWriteTable(WriteTable writeTable) { |
||||||
|
this.writeTable = writeTable; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public HolderEnum holderType() { |
||||||
|
return HolderEnum.TABLE; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,159 @@ |
|||||||
|
package com.alibaba.excel.write.metadata.holder; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.io.InputStream; |
||||||
|
import java.io.OutputStream; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.Workbook; |
||||||
|
|
||||||
|
import com.alibaba.excel.enums.HolderEnum; |
||||||
|
import com.alibaba.excel.support.ExcelTypeEnum; |
||||||
|
import com.alibaba.excel.write.metadata.WriteWorkbook; |
||||||
|
|
||||||
|
/** |
||||||
|
* Workbook holder |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
*/ |
||||||
|
public class WriteWorkbookHolder extends AbstractWriteHolder { |
||||||
|
/*** |
||||||
|
* poi Workbook |
||||||
|
*/ |
||||||
|
private Workbook workbook; |
||||||
|
|
||||||
|
/** |
||||||
|
* current param |
||||||
|
*/ |
||||||
|
private WriteWorkbook writeWorkbook; |
||||||
|
/** |
||||||
|
* Final output stream |
||||||
|
*/ |
||||||
|
private OutputStream outputStream; |
||||||
|
/** |
||||||
|
* Template input stream |
||||||
|
* <p> |
||||||
|
* If 'inputStream' and 'file' all not empty,file first |
||||||
|
*/ |
||||||
|
private InputStream templateInputStream; |
||||||
|
/** |
||||||
|
* Template file |
||||||
|
* <p> |
||||||
|
* If 'inputStream' and 'file' all not empty,file first |
||||||
|
*/ |
||||||
|
private File templateFile; |
||||||
|
/** |
||||||
|
* Default true |
||||||
|
*/ |
||||||
|
private Boolean autoCloseStream; |
||||||
|
/** |
||||||
|
* Excel type |
||||||
|
*/ |
||||||
|
private ExcelTypeEnum excelType; |
||||||
|
/** |
||||||
|
* Mandatory use 'inputStream' |
||||||
|
*/ |
||||||
|
private Boolean mandatoryUseInputStream; |
||||||
|
/** |
||||||
|
* prevent duplicate creation of sheet objects |
||||||
|
*/ |
||||||
|
private Map<Integer, WriteSheetHolder> hasBeenInitializedSheet; |
||||||
|
|
||||||
|
public WriteWorkbookHolder(WriteWorkbook writeWorkbook) { |
||||||
|
super(writeWorkbook, null, writeWorkbook.getConvertAllFiled()); |
||||||
|
this.writeWorkbook = writeWorkbook; |
||||||
|
this.outputStream = writeWorkbook.getOutputStream(); |
||||||
|
this.templateInputStream = writeWorkbook.getTemplateInputStream(); |
||||||
|
this.templateFile = writeWorkbook.getTemplateFile(); |
||||||
|
if (writeWorkbook.getAutoCloseStream() == null) { |
||||||
|
this.autoCloseStream = Boolean.TRUE; |
||||||
|
} else { |
||||||
|
this.autoCloseStream = writeWorkbook.getAutoCloseStream(); |
||||||
|
} |
||||||
|
this.excelType = writeWorkbook.getExcelType(); |
||||||
|
if (writeWorkbook.getMandatoryUseInputStream() == null) { |
||||||
|
this.mandatoryUseInputStream = Boolean.FALSE; |
||||||
|
} else { |
||||||
|
this.mandatoryUseInputStream = writeWorkbook.getMandatoryUseInputStream(); |
||||||
|
} |
||||||
|
this.hasBeenInitializedSheet = new HashMap<Integer, WriteSheetHolder>(); |
||||||
|
} |
||||||
|
|
||||||
|
public Workbook getWorkbook() { |
||||||
|
return workbook; |
||||||
|
} |
||||||
|
|
||||||
|
public void setWorkbook(Workbook workbook) { |
||||||
|
this.workbook = workbook; |
||||||
|
} |
||||||
|
|
||||||
|
public Map<Integer, WriteSheetHolder> getHasBeenInitializedSheet() { |
||||||
|
return hasBeenInitializedSheet; |
||||||
|
} |
||||||
|
|
||||||
|
public void setHasBeenInitializedSheet(Map<Integer, WriteSheetHolder> hasBeenInitializedSheet) { |
||||||
|
this.hasBeenInitializedSheet = hasBeenInitializedSheet; |
||||||
|
} |
||||||
|
|
||||||
|
public WriteWorkbook getWriteWorkbook() { |
||||||
|
return writeWorkbook; |
||||||
|
} |
||||||
|
|
||||||
|
public void setWriteWorkbook(WriteWorkbook writeWorkbook) { |
||||||
|
this.writeWorkbook = writeWorkbook; |
||||||
|
} |
||||||
|
|
||||||
|
public OutputStream getOutputStream() { |
||||||
|
return outputStream; |
||||||
|
} |
||||||
|
|
||||||
|
public void setOutputStream(OutputStream outputStream) { |
||||||
|
this.outputStream = outputStream; |
||||||
|
} |
||||||
|
|
||||||
|
public InputStream getTemplateInputStream() { |
||||||
|
return templateInputStream; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTemplateInputStream(InputStream templateInputStream) { |
||||||
|
this.templateInputStream = templateInputStream; |
||||||
|
} |
||||||
|
|
||||||
|
public File getTemplateFile() { |
||||||
|
return templateFile; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTemplateFile(File templateFile) { |
||||||
|
this.templateFile = templateFile; |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean getAutoCloseStream() { |
||||||
|
return autoCloseStream; |
||||||
|
} |
||||||
|
|
||||||
|
public void setAutoCloseStream(Boolean autoCloseStream) { |
||||||
|
this.autoCloseStream = autoCloseStream; |
||||||
|
} |
||||||
|
|
||||||
|
public ExcelTypeEnum getExcelType() { |
||||||
|
return excelType; |
||||||
|
} |
||||||
|
|
||||||
|
public void setExcelType(ExcelTypeEnum excelType) { |
||||||
|
this.excelType = excelType; |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean getMandatoryUseInputStream() { |
||||||
|
return mandatoryUseInputStream; |
||||||
|
} |
||||||
|
|
||||||
|
public void setMandatoryUseInputStream(Boolean mandatoryUseInputStream) { |
||||||
|
this.mandatoryUseInputStream = mandatoryUseInputStream; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public HolderEnum holderType() { |
||||||
|
return HolderEnum.WORKBOOK; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,143 @@ |
|||||||
|
package com.alibaba.excel.write.property; |
||||||
|
|
||||||
|
import java.lang.reflect.Field; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import com.alibaba.excel.annotation.write.style.ColumnWidth; |
||||||
|
import com.alibaba.excel.annotation.write.style.ContentRowHeight; |
||||||
|
import com.alibaba.excel.annotation.write.style.ContentStyle; |
||||||
|
import com.alibaba.excel.annotation.write.style.HeadRowHeight; |
||||||
|
import com.alibaba.excel.annotation.write.style.HeadStyle; |
||||||
|
import com.alibaba.excel.enums.HeadKindEnum; |
||||||
|
import com.alibaba.excel.metadata.CellRange; |
||||||
|
import com.alibaba.excel.metadata.Head; |
||||||
|
import com.alibaba.excel.metadata.property.CellStyleProperty; |
||||||
|
import com.alibaba.excel.metadata.property.ColumnWidthProperty; |
||||||
|
import com.alibaba.excel.metadata.property.ExcelContentProperty; |
||||||
|
import com.alibaba.excel.metadata.property.ExcelHeadProperty; |
||||||
|
import com.alibaba.excel.metadata.property.RowHeightProperty; |
||||||
|
|
||||||
|
/** |
||||||
|
* Define the header attribute of excel |
||||||
|
* |
||||||
|
* @author jipengfei |
||||||
|
*/ |
||||||
|
public class ExcelWriteHeadProperty extends ExcelHeadProperty { |
||||||
|
private RowHeightProperty headRowHeightProperty; |
||||||
|
private RowHeightProperty contentRowHeightProperty; |
||||||
|
|
||||||
|
public ExcelWriteHeadProperty(Class headClazz, List<List<String>> head, Boolean convertAllFiled) { |
||||||
|
super(headClazz, head, convertAllFiled); |
||||||
|
if (getHeadKind() != HeadKindEnum.CLASS) { |
||||||
|
return; |
||||||
|
} |
||||||
|
this.headRowHeightProperty = |
||||||
|
RowHeightProperty.build((HeadRowHeight)headClazz.getAnnotation(HeadRowHeight.class)); |
||||||
|
this.contentRowHeightProperty = |
||||||
|
RowHeightProperty.build((ContentRowHeight)headClazz.getAnnotation(ContentRowHeight.class)); |
||||||
|
|
||||||
|
HeadStyle parentHeadStyle = (HeadStyle)headClazz.getAnnotation(HeadStyle.class); |
||||||
|
ContentStyle parentContentStyle = (ContentStyle)headClazz.getAnnotation(ContentStyle.class); |
||||||
|
ColumnWidth parentColumnWidth = (ColumnWidth)headClazz.getAnnotation(ColumnWidth.class); |
||||||
|
for (Map.Entry<Integer, ExcelContentProperty> entry : getContentPropertyMap().entrySet()) { |
||||||
|
Integer index = entry.getKey(); |
||||||
|
ExcelContentProperty excelContentPropertyData = entry.getValue(); |
||||||
|
Field field = excelContentPropertyData.getField(); |
||||||
|
Head headData = getHeadMap().get(index); |
||||||
|
HeadStyle headStyle = field.getAnnotation(HeadStyle.class); |
||||||
|
if (headStyle == null) { |
||||||
|
headStyle = parentHeadStyle; |
||||||
|
} |
||||||
|
headData.setCellStyleProperty(CellStyleProperty.build(headStyle)); |
||||||
|
ColumnWidth columnWidth = field.getAnnotation(ColumnWidth.class); |
||||||
|
if (columnWidth == null) { |
||||||
|
columnWidth = parentColumnWidth; |
||||||
|
} |
||||||
|
headData.setColumnWidthProperty(ColumnWidthProperty.build(columnWidth)); |
||||||
|
ContentStyle contentStyle = field.getAnnotation(ContentStyle.class); |
||||||
|
if (contentStyle == null) { |
||||||
|
contentStyle = parentContentStyle; |
||||||
|
} |
||||||
|
excelContentPropertyData.setCellStyleProperty(CellStyleProperty.build(contentStyle)); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public RowHeightProperty getHeadRowHeightProperty() { |
||||||
|
return headRowHeightProperty; |
||||||
|
} |
||||||
|
|
||||||
|
public void setHeadRowHeightProperty(RowHeightProperty headRowHeightProperty) { |
||||||
|
this.headRowHeightProperty = headRowHeightProperty; |
||||||
|
} |
||||||
|
|
||||||
|
public RowHeightProperty getContentRowHeightProperty() { |
||||||
|
return contentRowHeightProperty; |
||||||
|
} |
||||||
|
|
||||||
|
public void setContentRowHeightProperty(RowHeightProperty contentRowHeightProperty) { |
||||||
|
this.contentRowHeightProperty = contentRowHeightProperty; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Calculate all cells that need to be merged |
||||||
|
* |
||||||
|
* @return cells that need to be merged |
||||||
|
*/ |
||||||
|
public List<CellRange> headCellRangeList() { |
||||||
|
List<CellRange> cellRangeList = new ArrayList<CellRange>(); |
||||||
|
int i = 0; |
||||||
|
for (Map.Entry<Integer, Head> entry : getHeadMap().entrySet()) { |
||||||
|
Head head = entry.getValue(); |
||||||
|
List<String> columnValues = head.getHeadNameList(); |
||||||
|
for (int j = 0; j < columnValues.size(); j++) { |
||||||
|
int lastRow = getLastRangNum(j, columnValues.get(j), columnValues); |
||||||
|
int lastColumn = getLastRangNum(i, columnValues.get(j), head.getHeadNameList()); |
||||||
|
if ((lastRow > j || lastColumn > i) && lastRow >= 0 && lastColumn >= 0) { |
||||||
|
cellRangeList.add(new CellRange(j, lastRow, i, lastColumn)); |
||||||
|
} |
||||||
|
} |
||||||
|
i++; |
||||||
|
} |
||||||
|
return cellRangeList; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the last consecutive string position |
||||||
|
* |
||||||
|
* @param j |
||||||
|
* current value position |
||||||
|
* @param value |
||||||
|
* value content |
||||||
|
* @param values |
||||||
|
* values |
||||||
|
* @return the last consecutive string position |
||||||
|
*/ |
||||||
|
private int getLastRangNum(int j, String value, List<String> values) { |
||||||
|
if (value == null) { |
||||||
|
return -1; |
||||||
|
} |
||||||
|
if (j > 0) { |
||||||
|
String preValue = values.get(j - 1); |
||||||
|
if (value.equals(preValue)) { |
||||||
|
return -1; |
||||||
|
} |
||||||
|
} |
||||||
|
int last = j; |
||||||
|
for (int i = last + 1; i < values.size(); i++) { |
||||||
|
String current = values.get(i); |
||||||
|
if (value.equals(current)) { |
||||||
|
last = i; |
||||||
|
} else { |
||||||
|
// if i>j && !value.equals(current) Indicates that the continuous range is exceeded
|
||||||
|
if (i > j) { |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return last; |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue