mirror of https://github.com/alibaba/easyexcel
zhuangjiaju
5 years ago
39 changed files with 1432 additions and 442 deletions
@ -1,123 +0,0 @@ |
|||||||
package com.alibaba.excel.cache; |
|
||||||
|
|
||||||
import java.io.File; |
|
||||||
import java.util.HashMap; |
|
||||||
import java.util.HashSet; |
|
||||||
import java.util.Iterator; |
|
||||||
import java.util.Map; |
|
||||||
import java.util.Set; |
|
||||||
import java.util.TreeMap; |
|
||||||
|
|
||||||
import org.ehcache.PersistentCacheManager; |
|
||||||
import org.ehcache.config.builders.CacheConfigurationBuilder; |
|
||||||
import org.ehcache.config.builders.CacheManagerBuilder; |
|
||||||
import org.ehcache.config.builders.ResourcePoolsBuilder; |
|
||||||
import org.ehcache.config.units.MemoryUnit; |
|
||||||
import org.slf4j.Logger; |
|
||||||
import org.slf4j.LoggerFactory; |
|
||||||
|
|
||||||
import com.alibaba.excel.util.POITempFile; |
|
||||||
import com.alibaba.excel.util.StringUtils; |
|
||||||
|
|
||||||
/** |
|
||||||
* Default cache |
|
||||||
* |
|
||||||
* @author zhuangjiaju |
|
||||||
*/ |
|
||||||
public class EhcacheFile implements ReadCache { |
|
||||||
private static final Logger LOGGER = LoggerFactory.getLogger(EhcacheFile.class); |
|
||||||
private static final int BATCH = 500; |
|
||||||
int index = 0; |
|
||||||
int expirekey = 0; |
|
||||||
private org.ehcache.Cache<Integer, String> cache; |
|
||||||
// private Map<Integer, String> cache = new HashMap<Integer, String>();
|
|
||||||
private Map<Integer, Map<Integer, String>> cacheMap = new HashMap<Integer, Map<Integer, String>>(); |
|
||||||
private TreeMap<Integer, Integer> expire = new TreeMap<Integer, Integer>(); |
|
||||||
private StringBuilder sb = new StringBuilder(); |
|
||||||
private Set<Integer> count = new HashSet<Integer>(); |
|
||||||
private int getCount = 1; |
|
||||||
|
|
||||||
public EhcacheFile() { |
|
||||||
File file = POITempFile.createCacheTmpFile(); |
|
||||||
PersistentCacheManager persistentCacheManager = |
|
||||||
CacheManagerBuilder.newCacheManagerBuilder().with(CacheManagerBuilder.persistence(file)) |
|
||||||
.withCache("cache", CacheConfigurationBuilder.newCacheConfigurationBuilder(Integer.class, String.class, |
|
||||||
ResourcePoolsBuilder.newResourcePoolsBuilder().disk(10, MemoryUnit.GB))) |
|
||||||
.build(true); |
|
||||||
this.cache = persistentCacheManager.getCache("cache", Integer.class, String.class); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void put(Integer key, String value) { |
|
||||||
sb.append(index++).append(":").append(value).append(","); |
|
||||||
if (index != 0 && index % BATCH == 0) { |
|
||||||
int key1 = index / BATCH; |
|
||||||
cache.put(key1, sb.toString()); |
|
||||||
// LOGGER.info("put:key:{},{}", key1, sb.toString());
|
|
||||||
sb = new StringBuilder(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String get(Integer key) { |
|
||||||
int route = key / BATCH; |
|
||||||
route++; |
|
||||||
if (!cacheMap.containsKey(route)) { |
|
||||||
// LOGGER.info("key:{},route:{},missing", key, route);
|
|
||||||
Map<Integer, String> map = new HashMap<Integer, String>(10000 / 3 * 4 + 1); |
|
||||||
String s = cache.get(route); |
|
||||||
String[] values = s.split(","); |
|
||||||
for (String value : values) { |
|
||||||
String[] vv = value.split(":"); |
|
||||||
map.put(Integer.valueOf(vv[0]), vv[1]); |
|
||||||
} |
|
||||||
cacheMap.put(route, map); |
|
||||||
expire.put(expirekey++, route); |
|
||||||
} |
|
||||||
count.add(route); |
|
||||||
|
|
||||||
if (getCount++ % 1000 == 0) { |
|
||||||
Iterator<Map.Entry<Integer, Map<Integer, String>>> iterator = cacheMap.entrySet().iterator(); |
|
||||||
// LOGGER.info("size:{}", cacheMap.size());
|
|
||||||
while (iterator.hasNext()) { |
|
||||||
Map.Entry<Integer, Map<Integer, String>> entry = iterator.next(); |
|
||||||
if (!count.contains(entry.getKey())) { |
|
||||||
// LOGGER.info("route:{},remove", entry.getKey());
|
|
||||||
iterator.remove(); |
|
||||||
Iterator<Map.Entry<Integer, Integer>> ex = expire.entrySet().iterator(); |
|
||||||
while (ex.hasNext()) { |
|
||||||
Map.Entry<Integer, Integer> e = ex.next(); |
|
||||||
if (e.getValue().equals(entry.getKey())) { |
|
||||||
ex.remove(); |
|
||||||
break; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
count.clear(); |
|
||||||
} |
|
||||||
|
|
||||||
if (expire.size() > 10) { |
|
||||||
int value1 = expire.firstEntry().getValue(); |
|
||||||
int key1 = expire.firstEntry().getKey(); |
|
||||||
cacheMap.remove(value1); |
|
||||||
expire.remove(key1); |
|
||||||
} |
|
||||||
|
|
||||||
return cacheMap.get(route).get(key); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void finish() { |
|
||||||
if (StringUtils.isEmpty(sb.toString())) { |
|
||||||
return; |
|
||||||
} |
|
||||||
int key1 = index / BATCH; |
|
||||||
if (index % BATCH != 0) { |
|
||||||
key1++; |
|
||||||
} |
|
||||||
|
|
||||||
cache.put(key1, sb.toString()); |
|
||||||
// LOGGER.info("put:key:{},{}", key1 + 1, sb.toString());
|
|
||||||
} |
|
||||||
} |
|
@ -1,123 +0,0 @@ |
|||||||
package com.alibaba.excel.cache; |
|
||||||
|
|
||||||
import java.io.File; |
|
||||||
import java.util.HashMap; |
|
||||||
import java.util.HashSet; |
|
||||||
import java.util.Iterator; |
|
||||||
import java.util.Map; |
|
||||||
import java.util.Set; |
|
||||||
import java.util.TreeMap; |
|
||||||
|
|
||||||
import org.ehcache.PersistentCacheManager; |
|
||||||
import org.ehcache.config.builders.CacheConfigurationBuilder; |
|
||||||
import org.ehcache.config.builders.CacheManagerBuilder; |
|
||||||
import org.ehcache.config.builders.ResourcePoolsBuilder; |
|
||||||
import org.ehcache.config.units.MemoryUnit; |
|
||||||
import org.slf4j.Logger; |
|
||||||
import org.slf4j.LoggerFactory; |
|
||||||
|
|
||||||
import com.alibaba.excel.util.POITempFile; |
|
||||||
import com.alibaba.excel.util.StringUtils; |
|
||||||
|
|
||||||
/** |
|
||||||
* Default cache |
|
||||||
* |
|
||||||
* @author zhuangjiaju |
|
||||||
*/ |
|
||||||
public class EhcacheMix implements ReadCache { |
|
||||||
private static final Logger LOGGER = LoggerFactory.getLogger(EhcacheMix.class); |
|
||||||
private static final int BATCH = 500; |
|
||||||
int index = 0; |
|
||||||
int expirekey = 0; |
|
||||||
private org.ehcache.Cache<Integer, String> cache; |
|
||||||
private Map<Integer, Map<Integer, String>> cacheMap = new HashMap<Integer, Map<Integer, String>>(); |
|
||||||
private TreeMap<Integer, Integer> expire = new TreeMap<Integer, Integer>(); |
|
||||||
private StringBuilder sb = new StringBuilder(); |
|
||||||
private Set<Integer> count = new HashSet<Integer>(); |
|
||||||
private int getCount = 1; |
|
||||||
|
|
||||||
private int countRead = 0; |
|
||||||
|
|
||||||
public EhcacheMix() { |
|
||||||
File file = POITempFile.createCacheTmpFile(); |
|
||||||
PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder() |
|
||||||
.with(CacheManagerBuilder.persistence(file)) |
|
||||||
.withCache("cache", CacheConfigurationBuilder.newCacheConfigurationBuilder(Integer.class, String.class, |
|
||||||
ResourcePoolsBuilder.newResourcePoolsBuilder().heap(20, MemoryUnit.MB).disk(2, MemoryUnit.GB, false))) |
|
||||||
.build(true); |
|
||||||
this.cache = persistentCacheManager.getCache("cache", Integer.class, String.class); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void put(Integer key, String value) { |
|
||||||
sb.append(index++).append(":").append(value).append(","); |
|
||||||
if (index != 0 && index % BATCH == 0) { |
|
||||||
int key1 = index / BATCH; |
|
||||||
cache.put(key1, sb.toString()); |
|
||||||
// LOGGER.info("put:key:{},{}", key1, sb.toString());
|
|
||||||
sb = new StringBuilder(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String get(Integer key) { |
|
||||||
int route = key / BATCH; |
|
||||||
route++; |
|
||||||
if (!cacheMap.containsKey(route)) { |
|
||||||
Map<Integer, String> map = new HashMap<Integer, String>(10000 / 3 * 4 + 1); |
|
||||||
String s = cache.get(route); |
|
||||||
String[] values = s.split(","); |
|
||||||
for (String value : values) { |
|
||||||
String[] vv = value.split(":"); |
|
||||||
map.put(Integer.valueOf(vv[0]), vv[1]); |
|
||||||
} |
|
||||||
cacheMap.put(route, map); |
|
||||||
expire.put(expirekey++, route); |
|
||||||
} |
|
||||||
count.add(route); |
|
||||||
|
|
||||||
if (getCount++ % 1000 == 0) { |
|
||||||
Iterator<Map.Entry<Integer, Map<Integer, String>>> iterator = cacheMap.entrySet().iterator(); |
|
||||||
// LOGGER.info("size:{}", cacheMap.size());
|
|
||||||
while (iterator.hasNext()) { |
|
||||||
Map.Entry<Integer, Map<Integer, String>> entry = iterator.next(); |
|
||||||
if (!count.contains(entry.getKey())) { |
|
||||||
// LOGGER.info("route:{},remove", entry.getKey());
|
|
||||||
iterator.remove(); |
|
||||||
Iterator<Map.Entry<Integer, Integer>> ex = expire.entrySet().iterator(); |
|
||||||
while (ex.hasNext()) { |
|
||||||
Map.Entry<Integer, Integer> e = ex.next(); |
|
||||||
if (e.getValue().equals(entry.getKey())) { |
|
||||||
ex.remove(); |
|
||||||
break; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
count.clear(); |
|
||||||
} |
|
||||||
|
|
||||||
if (expire.size() > 10) { |
|
||||||
int value1 = expire.firstEntry().getValue(); |
|
||||||
int key1 = expire.firstEntry().getKey(); |
|
||||||
cacheMap.remove(value1); |
|
||||||
expire.remove(key1); |
|
||||||
} |
|
||||||
|
|
||||||
return cacheMap.get(route).get(key); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void finish() { |
|
||||||
if (StringUtils.isEmpty(sb.toString())) { |
|
||||||
return; |
|
||||||
} |
|
||||||
int key1 = index / BATCH; |
|
||||||
if (index % BATCH != 0) { |
|
||||||
key1++; |
|
||||||
} |
|
||||||
|
|
||||||
cache.put(key1, sb.toString()); |
|
||||||
// LOGGER.info("put:key:{},{}", key1 + 1, sb.toString());
|
|
||||||
} |
|
||||||
} |
|
@ -1,31 +0,0 @@ |
|||||||
package com.alibaba.excel.cache; |
|
||||||
|
|
||||||
import org.apache.poi.xssf.model.SharedStringsTable; |
|
||||||
|
|
||||||
/** |
|
||||||
* Default cache |
|
||||||
* |
|
||||||
* @author zhuangjiaju |
|
||||||
*/ |
|
||||||
public class SharedStringsTableReadCache implements ReadCache { |
|
||||||
private SharedStringsTable sharedStringsTable; |
|
||||||
|
|
||||||
public SharedStringsTableReadCache(SharedStringsTable sharedStringsTable) { |
|
||||||
this.sharedStringsTable = sharedStringsTable; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void put(Integer key, String value) { |
|
||||||
throw new UnsupportedOperationException("Can not put value"); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String get(Integer key) { |
|
||||||
return sharedStringsTable.getItemAt(key).toString(); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void finish() { |
|
||||||
|
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,494 @@ |
|||||||
|
package com.alibaba.excel.metadata.holder.read; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.HashSet; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Set; |
||||||
|
import java.util.TreeMap; |
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.Cell; |
||||||
|
import org.apache.poi.ss.usermodel.Sheet; |
||||||
|
|
||||||
|
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.event.NotRepeatExecutor; |
||||||
|
import com.alibaba.excel.event.Order; |
||||||
|
import com.alibaba.excel.exception.ExcelAnalysisException; |
||||||
|
import com.alibaba.excel.exception.ExcelDataConvertException; |
||||||
|
import com.alibaba.excel.metadata.CellData; |
||||||
|
import com.alibaba.excel.metadata.CellStyle; |
||||||
|
import com.alibaba.excel.metadata.Head; |
||||||
|
import com.alibaba.excel.metadata.holder.write.WriteConfiguration; |
||||||
|
import com.alibaba.excel.metadata.property.CellStyleProperty; |
||||||
|
import com.alibaba.excel.metadata.property.ExcelContentProperty; |
||||||
|
import com.alibaba.excel.metadata.property.ExcelHeadProperty; |
||||||
|
import com.alibaba.excel.metadata.property.RowHeightProperty; |
||||||
|
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.util.StringUtils; |
||||||
|
import com.alibaba.excel.write.handler.CellWriteHandler; |
||||||
|
import com.alibaba.excel.write.handler.RowWriteHandler; |
||||||
|
import com.alibaba.excel.write.handler.SheetWriteHandler; |
||||||
|
import com.alibaba.excel.write.handler.WorkbookWriteHandler; |
||||||
|
import com.alibaba.excel.write.handler.WriteHandler; |
||||||
|
import com.alibaba.excel.write.style.AbstractColumnCellStyleStrategy; |
||||||
|
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy; |
||||||
|
import com.alibaba.excel.write.style.row.SimpleRowHeightStyleStrategy; |
||||||
|
|
||||||
|
/** |
||||||
|
* sheet holder |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
*/ |
||||||
|
public abstract class AbstractWriteConfiguration |
||||||
|
implements WriteConfiguration, ReadConfiguration, ReadListenerRegistryCenter { |
||||||
|
/** |
||||||
|
* Need Head |
||||||
|
*/ |
||||||
|
private Boolean needHead; |
||||||
|
/** |
||||||
|
* Write handler for workbook |
||||||
|
*/ |
||||||
|
private Map<Class<? extends WriteHandler>, List<WriteHandler>> writeHandlerMap; |
||||||
|
/** |
||||||
|
* Read listener |
||||||
|
*/ |
||||||
|
private List<ReadListener> readListenerList; |
||||||
|
/** |
||||||
|
* Converter for workbook |
||||||
|
*/ |
||||||
|
private Map<ConverterKey, Converter> readConverterMap; |
||||||
|
/** |
||||||
|
* Converter for workbook |
||||||
|
*/ |
||||||
|
private Map<Class, Converter> writeConverterMap; |
||||||
|
/** |
||||||
|
* Excel head property |
||||||
|
*/ |
||||||
|
private ExcelHeadProperty excelHeadProperty; |
||||||
|
/** |
||||||
|
* Writes the head relative to the existing contents of the sheet. Indexes are zero-based. |
||||||
|
*/ |
||||||
|
private Integer writeRelativeHeadRowIndex; |
||||||
|
/** |
||||||
|
* Record whether it's new or from cache |
||||||
|
*/ |
||||||
|
private Boolean newInitialization; |
||||||
|
/** |
||||||
|
* 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 readHeadRowNumber; |
||||||
|
/** |
||||||
|
* You can only choose one of the {@link AbstractWriteConfiguration#head} and |
||||||
|
* {@link AbstractWriteConfiguration#clazz} |
||||||
|
*/ |
||||||
|
private List<List<String>> head; |
||||||
|
/** |
||||||
|
* You can only choose one of the {@link AbstractWriteConfiguration#head} and |
||||||
|
* {@link AbstractWriteConfiguration#clazz} |
||||||
|
*/ |
||||||
|
private Class clazz; |
||||||
|
/** |
||||||
|
* Automatic trim includes sheet name and content |
||||||
|
*/ |
||||||
|
private Boolean autoTrim; |
||||||
|
|
||||||
|
public Boolean getNeedHead() { |
||||||
|
return needHead; |
||||||
|
} |
||||||
|
|
||||||
|
public void setNeedHead(Boolean needHead) { |
||||||
|
this.needHead = needHead; |
||||||
|
} |
||||||
|
|
||||||
|
public Map<Class<? extends WriteHandler>, List<WriteHandler>> getWriteHandlerMap() { |
||||||
|
return writeHandlerMap; |
||||||
|
} |
||||||
|
|
||||||
|
public void setWriteHandlerMap(Map<Class<? extends WriteHandler>, List<WriteHandler>> writeHandlerMap) { |
||||||
|
this.writeHandlerMap = writeHandlerMap; |
||||||
|
} |
||||||
|
|
||||||
|
public ExcelHeadProperty getExcelHeadProperty() { |
||||||
|
return excelHeadProperty; |
||||||
|
} |
||||||
|
|
||||||
|
public void setExcelHeadProperty(ExcelHeadProperty excelHeadProperty) { |
||||||
|
this.excelHeadProperty = excelHeadProperty; |
||||||
|
} |
||||||
|
|
||||||
|
public Integer getWriteRelativeHeadRowIndex() { |
||||||
|
return writeRelativeHeadRowIndex; |
||||||
|
} |
||||||
|
|
||||||
|
public void setWriteRelativeHeadRowIndex(Integer writeRelativeHeadRowIndex) { |
||||||
|
this.writeRelativeHeadRowIndex = writeRelativeHeadRowIndex; |
||||||
|
} |
||||||
|
|
||||||
|
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 Boolean getAutoTrim() { |
||||||
|
return autoTrim; |
||||||
|
} |
||||||
|
|
||||||
|
public void setAutoTrim(Boolean autoTrim) { |
||||||
|
this.autoTrim = autoTrim; |
||||||
|
} |
||||||
|
|
||||||
|
public List<ReadListener> getReadListenerList() { |
||||||
|
return readListenerList; |
||||||
|
} |
||||||
|
|
||||||
|
public void setReadListenerList(List<ReadListener> readListenerList) { |
||||||
|
this.readListenerList = readListenerList; |
||||||
|
} |
||||||
|
|
||||||
|
public Map<ConverterKey, Converter> getReadConverterMap() { |
||||||
|
return readConverterMap; |
||||||
|
} |
||||||
|
|
||||||
|
public void setReadConverterMap(Map<ConverterKey, Converter> readConverterMap) { |
||||||
|
this.readConverterMap = readConverterMap; |
||||||
|
} |
||||||
|
|
||||||
|
public Map<Class, Converter> getWriteConverterMap() { |
||||||
|
return writeConverterMap; |
||||||
|
} |
||||||
|
|
||||||
|
public void setWriteConverterMap(Map<Class, Converter> writeConverterMap) { |
||||||
|
this.writeConverterMap = writeConverterMap; |
||||||
|
} |
||||||
|
|
||||||
|
public Integer getReadHeadRowNumber() { |
||||||
|
return readHeadRowNumber; |
||||||
|
} |
||||||
|
|
||||||
|
public void setReadHeadRowNumber(Integer readHeadRowNumber) { |
||||||
|
this.readHeadRowNumber = readHeadRowNumber; |
||||||
|
} |
||||||
|
|
||||||
|
@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.currentRowNum() > 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().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; |
||||||
|
} |
||||||
|
|
||||||
|
protected Map<Class<? extends WriteHandler>, List<WriteHandler>> sortAndClearUpHandler( |
||||||
|
List<WriteHandler> handlerList, Map<Class<? extends WriteHandler>, List<WriteHandler>> parentHandlerMap) { |
||||||
|
// add
|
||||||
|
if (parentHandlerMap != null) { |
||||||
|
for (List<WriteHandler> parentHandlerList : parentHandlerMap.values()) { |
||||||
|
handlerList.addAll(parentHandlerList); |
||||||
|
} |
||||||
|
} |
||||||
|
// sort
|
||||||
|
Map<Integer, List<WriteHandler>> orderExcelWriteHandlerMap = new TreeMap<Integer, List<WriteHandler>>(); |
||||||
|
for (WriteHandler handler : handlerList) { |
||||||
|
int order = Integer.MIN_VALUE; |
||||||
|
if (handler instanceof Order) { |
||||||
|
order = ((Order)handler).order(); |
||||||
|
} |
||||||
|
if (orderExcelWriteHandlerMap.containsKey(order)) { |
||||||
|
orderExcelWriteHandlerMap.get(order).add(handler); |
||||||
|
} else { |
||||||
|
List<WriteHandler> tempHandlerList = new ArrayList<WriteHandler>(); |
||||||
|
tempHandlerList.add(handler); |
||||||
|
orderExcelWriteHandlerMap.put(order, tempHandlerList); |
||||||
|
} |
||||||
|
} |
||||||
|
// clean up
|
||||||
|
Set<String> alreadyExistedHandlerSet = new HashSet<String>(); |
||||||
|
List<WriteHandler> cleanUpHandlerList = new ArrayList<WriteHandler>(); |
||||||
|
for (Map.Entry<Integer, List<WriteHandler>> entry : orderExcelWriteHandlerMap.entrySet()) { |
||||||
|
for (WriteHandler handler : entry.getValue()) { |
||||||
|
if (handler instanceof NotRepeatExecutor) { |
||||||
|
String uniqueValue = ((NotRepeatExecutor)handler).uniqueValue(); |
||||||
|
if (alreadyExistedHandlerSet.contains(uniqueValue)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
alreadyExistedHandlerSet.add(uniqueValue); |
||||||
|
} |
||||||
|
cleanUpHandlerList.add(handler); |
||||||
|
} |
||||||
|
} |
||||||
|
// classify
|
||||||
|
Map<Class<? extends WriteHandler>, List<WriteHandler>> result = |
||||||
|
new HashMap<Class<? extends WriteHandler>, List<WriteHandler>>(); |
||||||
|
result.put(WriteHandler.class, new ArrayList<WriteHandler>()); |
||||||
|
result.put(WorkbookWriteHandler.class, new ArrayList<WriteHandler>()); |
||||||
|
result.put(SheetWriteHandler.class, new ArrayList<WriteHandler>()); |
||||||
|
result.put(RowWriteHandler.class, new ArrayList<WriteHandler>()); |
||||||
|
result.put(CellWriteHandler.class, new ArrayList<WriteHandler>()); |
||||||
|
for (WriteHandler writeHandler : cleanUpHandlerList) { |
||||||
|
if (writeHandler instanceof CellWriteHandler) { |
||||||
|
result.get(CellWriteHandler.class).add(writeHandler); |
||||||
|
} |
||||||
|
if (writeHandler instanceof RowWriteHandler) { |
||||||
|
result.get(RowWriteHandler.class).add(writeHandler); |
||||||
|
} |
||||||
|
if (writeHandler instanceof SheetWriteHandler) { |
||||||
|
result.get(SheetWriteHandler.class).add(writeHandler); |
||||||
|
} |
||||||
|
if (writeHandler instanceof SheetWriteHandler) { |
||||||
|
result.get(SheetWriteHandler.class).add(writeHandler); |
||||||
|
} |
||||||
|
if (writeHandler instanceof WorkbookWriteHandler) { |
||||||
|
result.get(WorkbookWriteHandler.class).add(writeHandler); |
||||||
|
} |
||||||
|
result.get(WriteHandler.class).add(writeHandler); |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
protected void initAnnotationConfig(List<WriteHandler> handlerList) { |
||||||
|
if (!HeadKindEnum.CLASS.equals(getExcelHeadProperty().getHeadKind())) { |
||||||
|
return; |
||||||
|
} |
||||||
|
Map<Integer, Head> headMap = getExcelHeadProperty().getHeadMap(); |
||||||
|
Map<Integer, ExcelContentProperty> contentPropertyMap = getExcelHeadProperty().getContentPropertyMap(); |
||||||
|
|
||||||
|
boolean hasCellStyle = false; |
||||||
|
boolean hasColumnWidth = false; |
||||||
|
for (Map.Entry<Integer, Head> entry : headMap.entrySet()) { |
||||||
|
if (entry.getValue().getCellStyleProperty() != null) { |
||||||
|
hasCellStyle = true; |
||||||
|
} |
||||||
|
if (entry.getValue().getColumnWidthProperty() != null) { |
||||||
|
hasColumnWidth = true; |
||||||
|
} |
||||||
|
ExcelContentProperty excelContentProperty = contentPropertyMap.get(entry.getKey()); |
||||||
|
if (excelContentProperty.getCellStyleProperty() != null) { |
||||||
|
hasCellStyle = true; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (hasCellStyle) { |
||||||
|
dealCellStyle(handlerList, contentPropertyMap); |
||||||
|
} |
||||||
|
if (hasColumnWidth) { |
||||||
|
dealColumnWidth(handlerList); |
||||||
|
} |
||||||
|
dealRowHigh(handlerList, contentPropertyMap); |
||||||
|
} |
||||||
|
|
||||||
|
private void dealRowHigh(List<WriteHandler> handlerList, Map<Integer, ExcelContentProperty> contentPropertyMap) { |
||||||
|
RowHeightProperty headRowHeightProperty = excelHeadProperty.getHeadRowHeightProperty(); |
||||||
|
RowHeightProperty contentRowHeightProperty = excelHeadProperty.getContentRowHeightProperty(); |
||||||
|
if (headRowHeightProperty == null && contentRowHeightProperty == null) { |
||||||
|
return; |
||||||
|
} |
||||||
|
Short headRowHeight = null; |
||||||
|
if (headRowHeightProperty != null) { |
||||||
|
headRowHeight = headRowHeightProperty.getHeight(); |
||||||
|
} |
||||||
|
Short contentRowHeight = null; |
||||||
|
if (contentRowHeightProperty != null) { |
||||||
|
contentRowHeight = contentRowHeightProperty.getHeight(); |
||||||
|
} |
||||||
|
handlerList.add(new SimpleRowHeightStyleStrategy(headRowHeight, contentRowHeight)); |
||||||
|
} |
||||||
|
|
||||||
|
private void dealColumnWidth(List<WriteHandler> handlerList) { |
||||||
|
WriteHandler columnWidthStyleStrategy = new AbstractColumnWidthStyleStrategy() { |
||||||
|
@Override |
||||||
|
protected void setColumnWidth(Sheet sheet, Cell cell, Head head) { |
||||||
|
if (head == null) { |
||||||
|
return; |
||||||
|
} |
||||||
|
if (head.getColumnWidthProperty() != null) { |
||||||
|
sheet.setColumnWidth(head.getColumnIndex(), head.getColumnWidthProperty().getWidth()); |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
handlerList.add(columnWidthStyleStrategy); |
||||||
|
} |
||||||
|
|
||||||
|
private void dealCellStyle(List<WriteHandler> handlerList, |
||||||
|
final Map<Integer, ExcelContentProperty> contentPropertyMap) { |
||||||
|
WriteHandler columnCellStyleStrategy = new AbstractColumnCellStyleStrategy() { |
||||||
|
@Override |
||||||
|
protected CellStyle headCellStyle(Head head) { |
||||||
|
if (head == null || head.getCellStyleProperty() == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
CellStyleProperty cellStyleProperty = head.getCellStyleProperty(); |
||||||
|
return new CellStyle(cellStyleProperty.getFontName(), cellStyleProperty.getFontHeightInPoints(), |
||||||
|
cellStyleProperty.getBold(), cellStyleProperty.getIndexedColors()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected CellStyle contentCellStyle(Head head) { |
||||||
|
if (head == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
ExcelContentProperty excelContentProperty = contentPropertyMap.get(head.getColumnIndex()); |
||||||
|
if (excelContentProperty == null || excelContentProperty.getCellStyleProperty() == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
CellStyleProperty cellStyleProperty = excelContentProperty.getCellStyleProperty(); |
||||||
|
return new CellStyle(cellStyleProperty.getFontName(), cellStyleProperty.getFontHeightInPoints(), |
||||||
|
cellStyleProperty.getBold(), cellStyleProperty.getIndexedColors()); |
||||||
|
} |
||||||
|
}; |
||||||
|
handlerList.add(columnCellStyleStrategy); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Map<Class<? extends WriteHandler>, List<WriteHandler>> writeHandlerMap() { |
||||||
|
return getWriteHandlerMap(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean needHead() { |
||||||
|
return getNeedHead(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int writeRelativeHeadRowIndex() { |
||||||
|
return getWriteRelativeHeadRowIndex(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public ExcelHeadProperty excelHeadProperty() { |
||||||
|
return getExcelHeadProperty(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isNew() { |
||||||
|
return getNewInitialization(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<ReadListener> readListenerList() { |
||||||
|
return getReadListenerList(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Map<ConverterKey, Converter> readConverterMap() { |
||||||
|
return getReadConverterMap(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Map<Class, Converter> writeConverterMap() { |
||||||
|
return getWriteConverterMap(); |
||||||
|
} |
||||||
|
} |
@ -1,4 +1,4 @@ |
|||||||
package com.alibaba.excel.metadata.holder; |
package com.alibaba.excel.metadata.holder.read; |
||||||
|
|
||||||
import java.util.List; |
import java.util.List; |
||||||
import java.util.Map; |
import java.util.Map; |
@ -0,0 +1,235 @@ |
|||||||
|
package com.alibaba.excel.metadata.holder.read; |
||||||
|
|
||||||
|
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.holder.write.AbstractWriteConfiguration; |
||||||
|
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 SheetHolder extends AbstractWriteConfiguration { |
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(SheetHolder.class); |
||||||
|
/*** |
||||||
|
* poi sheet |
||||||
|
*/ |
||||||
|
private Sheet sheet; |
||||||
|
/*** |
||||||
|
* sheetNo |
||||||
|
*/ |
||||||
|
private Integer sheetNo; |
||||||
|
/*** |
||||||
|
* sheetName |
||||||
|
*/ |
||||||
|
private String sheetName; |
||||||
|
/*** |
||||||
|
* poi sheet |
||||||
|
*/ |
||||||
|
private WorkbookHolder parentWorkBook; |
||||||
|
/*** |
||||||
|
* has been initialized table |
||||||
|
*/ |
||||||
|
private Map<Integer, TableHolder> hasBeenInitializedTable; |
||||||
|
/** |
||||||
|
* current param |
||||||
|
*/ |
||||||
|
private com.alibaba.excel.metadata.Sheet sheetParam; |
||||||
|
|
||||||
|
public static SheetHolder buildWriteWorkSheetHolder(com.alibaba.excel.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.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.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.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.metadata.Sheet getSheetParam() { |
||||||
|
return sheetParam; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSheetParam(com.alibaba.excel.metadata.Sheet sheetParam) { |
||||||
|
this.sheetParam = sheetParam; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,138 @@ |
|||||||
|
package com.alibaba.excel.metadata.holder.read; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
|
||||||
|
import com.alibaba.excel.converters.Converter; |
||||||
|
import com.alibaba.excel.metadata.CellStyle; |
||||||
|
import com.alibaba.excel.metadata.Table; |
||||||
|
import com.alibaba.excel.metadata.TableStyle; |
||||||
|
import com.alibaba.excel.metadata.holder.write.AbstractWriteConfiguration; |
||||||
|
import com.alibaba.excel.metadata.property.ExcelHeadProperty; |
||||||
|
import com.alibaba.excel.write.handler.WriteHandler; |
||||||
|
import com.alibaba.excel.write.style.RowCellStyleStrategy; |
||||||
|
|
||||||
|
/** |
||||||
|
* sheet holder |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
*/ |
||||||
|
public class TableHolder extends AbstractWriteConfiguration { |
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(TableHolder.class); |
||||||
|
|
||||||
|
/*** |
||||||
|
* poi sheet |
||||||
|
*/ |
||||||
|
private SheetHolder parentSheet; |
||||||
|
/*** |
||||||
|
* tableNo |
||||||
|
*/ |
||||||
|
private Integer tableNo; |
||||||
|
/** |
||||||
|
* current table param |
||||||
|
*/ |
||||||
|
private Table tableParam; |
||||||
|
|
||||||
|
public static TableHolder buildWriteWorkTableHolder(Table table, SheetHolder sheetHolder, |
||||||
|
WorkbookHolder workbookHolder) { |
||||||
|
TableHolder tableHolder = new TableHolder(); |
||||||
|
tableHolder.setTableParam(table); |
||||||
|
tableHolder.setParentSheet(sheetHolder); |
||||||
|
tableHolder.setTableNo(table.getTableNo()); |
||||||
|
boolean noHead = (table.getHead() == null || table.getHead().isEmpty()) && table.getClazz() == null; |
||||||
|
if (noHead) { |
||||||
|
// Use parent
|
||||||
|
tableHolder.setHead(sheetHolder.getHead()); |
||||||
|
tableHolder.setClazz(sheetHolder.getClazz()); |
||||||
|
} else { |
||||||
|
tableHolder.setHead(table.getHead()); |
||||||
|
tableHolder.setClazz(table.getClazz()); |
||||||
|
} |
||||||
|
tableHolder.setNewInitialization(Boolean.TRUE); |
||||||
|
// Initialization property
|
||||||
|
tableHolder.setExcelHeadProperty( |
||||||
|
new ExcelHeadProperty(tableHolder.getClazz(), tableHolder.getHead(), workbookHolder.getConvertAllFiled())); |
||||||
|
|
||||||
|
if (table.getNeedHead() == null) { |
||||||
|
tableHolder.setNeedHead(sheetHolder.needHead()); |
||||||
|
} else { |
||||||
|
tableHolder.setNeedHead(table.getNeedHead()); |
||||||
|
} |
||||||
|
if (table.getWriteRelativeHeadRowIndex() == null) { |
||||||
|
tableHolder.setWriteRelativeHeadRowIndex(sheetHolder.writeRelativeHeadRowIndex()); |
||||||
|
} else { |
||||||
|
tableHolder.setWriteRelativeHeadRowIndex(table.getWriteRelativeHeadRowIndex()); |
||||||
|
} |
||||||
|
// Compatible with old code
|
||||||
|
compatibleOldCode(table); |
||||||
|
List<WriteHandler> handlerList = new ArrayList<WriteHandler>(); |
||||||
|
if (table.getCustomWriteHandlerList() != null && !table.getCustomWriteHandlerList().isEmpty()) { |
||||||
|
handlerList.addAll(table.getCustomWriteHandlerList()); |
||||||
|
} |
||||||
|
// Initialization Annotation
|
||||||
|
tableHolder.initAnnotationConfig(handlerList); |
||||||
|
|
||||||
|
tableHolder |
||||||
|
.setWriteHandlerMap(tableHolder.sortAndClearUpHandler(handlerList, sheetHolder.getWriteHandlerMap())); |
||||||
|
Map<Class, Converter> converterMap = new HashMap<Class, Converter>(sheetHolder.getWriteConverterMap()); |
||||||
|
if (table.getCustomConverterList() != null && !table.getCustomConverterList().isEmpty()) { |
||||||
|
for (Converter converter : table.getCustomConverterList()) { |
||||||
|
converterMap.put(converter.getClass(), converter); |
||||||
|
} |
||||||
|
} |
||||||
|
tableHolder.setWriteConverterMap(converterMap); |
||||||
|
if (LOGGER.isDebugEnabled()) { |
||||||
|
LOGGER.debug("Table writeHandlerMap:{}", tableHolder.getWriteHandlerMap()); |
||||||
|
} |
||||||
|
return tableHolder; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Compatible with old code |
||||||
|
*/ |
||||||
|
@Deprecated |
||||||
|
private static void compatibleOldCode(Table table) { |
||||||
|
if (table.getTableStyle() != null) { |
||||||
|
final TableStyle tableStyle = table.getTableStyle(); |
||||||
|
if (table.getCustomWriteHandlerList() == null) { |
||||||
|
table.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()); |
||||||
|
table.getCustomWriteHandlerList().add(new RowCellStyleStrategy(headCellStyle, contentCellStyle)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public SheetHolder getParentSheet() { |
||||||
|
return parentSheet; |
||||||
|
} |
||||||
|
|
||||||
|
public void setParentSheet(SheetHolder parentSheet) { |
||||||
|
this.parentSheet = parentSheet; |
||||||
|
} |
||||||
|
|
||||||
|
public Integer getTableNo() { |
||||||
|
return tableNo; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTableNo(Integer tableNo) { |
||||||
|
this.tableNo = tableNo; |
||||||
|
} |
||||||
|
|
||||||
|
public Table getTableParam() { |
||||||
|
return tableParam; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTableParam(Table tableParam) { |
||||||
|
this.tableParam = tableParam; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,325 @@ |
|||||||
|
package com.alibaba.excel.metadata.holder.read; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.io.InputStream; |
||||||
|
import java.io.OutputStream; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.Workbook; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
|
||||||
|
import com.alibaba.excel.cache.ReadCache; |
||||||
|
import com.alibaba.excel.context.AnalysisContext; |
||||||
|
import com.alibaba.excel.converters.Converter; |
||||||
|
import com.alibaba.excel.converters.ConverterKey; |
||||||
|
import com.alibaba.excel.converters.DefaultConverterLoader; |
||||||
|
import com.alibaba.excel.event.AnalysisEventListener; |
||||||
|
import com.alibaba.excel.exception.ExcelAnalysisException; |
||||||
|
import com.alibaba.excel.metadata.holder.write.AbstractWriteConfiguration; |
||||||
|
import com.alibaba.excel.read.listener.ModelBuildEventListener; |
||||||
|
import com.alibaba.excel.read.listener.ReadListener; |
||||||
|
import com.alibaba.excel.support.ExcelTypeEnum; |
||||||
|
import com.alibaba.excel.write.handler.DefaultWriteHandlerLoader; |
||||||
|
import com.alibaba.excel.write.handler.WriteHandler; |
||||||
|
|
||||||
|
/** |
||||||
|
* Workbook holder |
||||||
|
* |
||||||
|
* @author zhuangjiaju |
||||||
|
*/ |
||||||
|
public class WorkbookHolder extends AbstractWriteConfiguration { |
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(WorkbookHolder.class); |
||||||
|
|
||||||
|
/*** |
||||||
|
* poi Workbook |
||||||
|
*/ |
||||||
|
private Workbook workbook; |
||||||
|
/** |
||||||
|
* prevent duplicate creation of sheet objects |
||||||
|
*/ |
||||||
|
private Map<Integer, SheetHolder> hasBeenInitializedSheet; |
||||||
|
/** |
||||||
|
* current param |
||||||
|
*/ |
||||||
|
private com.alibaba.excel.metadata.Workbook workbookParam; |
||||||
|
/** |
||||||
|
* Final output stream |
||||||
|
*/ |
||||||
|
private OutputStream outputStream; |
||||||
|
/** |
||||||
|
* <li>write: Template input stream |
||||||
|
* <li>read: Read InputStream |
||||||
|
* <p> |
||||||
|
* If 'inputStream' and 'file' all not empty,file first |
||||||
|
*/ |
||||||
|
private InputStream inputStream; |
||||||
|
/** |
||||||
|
* <li>write: Template file |
||||||
|
* <li>read: Read file |
||||||
|
* <p> |
||||||
|
* If 'inputStream' and 'file' all not empty,file first |
||||||
|
*/ |
||||||
|
private File file; |
||||||
|
/** |
||||||
|
* Default true |
||||||
|
*/ |
||||||
|
private Boolean autoCloseStream; |
||||||
|
/** |
||||||
|
* Excel type |
||||||
|
*/ |
||||||
|
private ExcelTypeEnum excelType; |
||||||
|
/** |
||||||
|
* This object can be read in the Listener {@link AnalysisEventListener#invoke(Object, AnalysisContext)} |
||||||
|
* {@link AnalysisContext#getCustom()} |
||||||
|
* |
||||||
|
*/ |
||||||
|
private Object readCustomObject; |
||||||
|
/** |
||||||
|
* A cache that stores temp data to save memory.Default use {@link com.alibaba.excel.cache.Ehcache} |
||||||
|
*/ |
||||||
|
private ReadCache readCache; |
||||||
|
/** |
||||||
|
* true if date uses 1904 windowing, or false if using 1900 date windowing. |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
private Boolean use1904windowing; |
||||||
|
|
||||||
|
/** |
||||||
|
* Mmandatory use 'inputStream' |
||||||
|
*/ |
||||||
|
private Boolean mandatoryUseInputStream; |
||||||
|
|
||||||
|
/** |
||||||
|
* Temporary files when reading excel |
||||||
|
*/ |
||||||
|
private File readTempFile; |
||||||
|
|
||||||
|
/** |
||||||
|
* The default is all excel objects.if true , you can use {@link com.alibaba.excel.annotation.ExcelIgnore} ignore a |
||||||
|
* field. 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; |
||||||
|
|
||||||
|
/** |
||||||
|
* Write handler |
||||||
|
* |
||||||
|
* @deprecated please use {@link WriteHandler} |
||||||
|
*/ |
||||||
|
@Deprecated |
||||||
|
private com.alibaba.excel.event.WriteHandler writeHandler; |
||||||
|
|
||||||
|
public static WorkbookHolder buildWriteWorkbookHolder(com.alibaba.excel.metadata.Workbook workbook) { |
||||||
|
WorkbookHolder workbookHolder = buildBaseWorkbookHolder(workbook); |
||||||
|
workbookHolder.setNewInitialization(Boolean.TRUE); |
||||||
|
if (workbook.getNeedHead() == null) { |
||||||
|
workbookHolder.setNeedHead(Boolean.TRUE); |
||||||
|
} else { |
||||||
|
workbookHolder.setNeedHead(workbook.getNeedHead()); |
||||||
|
} |
||||||
|
if (workbook.getWriteRelativeHeadRowIndex() == null) { |
||||||
|
workbookHolder.setWriteRelativeHeadRowIndex(0); |
||||||
|
} else { |
||||||
|
workbookHolder.setWriteRelativeHeadRowIndex(workbook.getWriteRelativeHeadRowIndex()); |
||||||
|
} |
||||||
|
List<WriteHandler> handlerList = new ArrayList<WriteHandler>(); |
||||||
|
if (workbook.getCustomWriteHandlerList() != null && !workbook.getCustomWriteHandlerList().isEmpty()) { |
||||||
|
handlerList.addAll(workbook.getCustomWriteHandlerList()); |
||||||
|
} |
||||||
|
handlerList.addAll(DefaultWriteHandlerLoader.loadDefaultHandler()); |
||||||
|
workbookHolder.setWriteHandlerMap(workbookHolder.sortAndClearUpHandler(handlerList, null)); |
||||||
|
|
||||||
|
Map<Class, Converter> converterMap = DefaultConverterLoader.loadDefaultWriteConverter(); |
||||||
|
if (workbook.getCustomConverterList() != null && !workbook.getCustomConverterList().isEmpty()) { |
||||||
|
for (Converter converter : workbook.getCustomConverterList()) { |
||||||
|
converterMap.put(converter.getClass(), converter); |
||||||
|
} |
||||||
|
} |
||||||
|
workbookHolder.setWriteConverterMap(converterMap); |
||||||
|
workbookHolder.setHasBeenInitializedSheet(new HashMap<Integer, SheetHolder>()); |
||||||
|
if (LOGGER.isDebugEnabled()) { |
||||||
|
LOGGER.debug("Wookbook writeHandlerMap:{}", workbookHolder.getWriteHandlerMap()); |
||||||
|
} |
||||||
|
return workbookHolder; |
||||||
|
} |
||||||
|
|
||||||
|
public static WorkbookHolder buildReadWorkbookHolder(com.alibaba.excel.metadata.Workbook workbook) { |
||||||
|
WorkbookHolder workbookHolder = buildBaseWorkbookHolder(workbook); |
||||||
|
if (workbook.getFile() == null && workbookHolder.getInputStream() == null) { |
||||||
|
throw new ExcelAnalysisException("Read excel 'file' and 'inputStream' cannot be empty at the same time!"); |
||||||
|
} |
||||||
|
workbookHolder.setReadCustomObject(workbook.getReadCustomObject()); |
||||||
|
workbookHolder.setReadHeadRowNumber(workbook.getReadHeadRowNumber()); |
||||||
|
workbookHolder.setReadCache(workbook.getReadCache()); |
||||||
|
|
||||||
|
Map<ConverterKey, Converter> converterMap = DefaultConverterLoader.loadDefaultReadConverter(); |
||||||
|
if (workbook.getCustomConverterList() != null && !workbook.getCustomConverterList().isEmpty()) { |
||||||
|
for (Converter converter : workbook.getCustomConverterList()) { |
||||||
|
converterMap.put(ConverterKey.buildConverterKey(converter), converter); |
||||||
|
} |
||||||
|
} |
||||||
|
workbookHolder.setReadConverterMap(converterMap); |
||||||
|
|
||||||
|
List<ReadListener> readListenerList = new ArrayList<ReadListener>(); |
||||||
|
readListenerList.add(new ModelBuildEventListener()); |
||||||
|
if (workbook.getCustomReadListenerList() != null && !workbook.getCustomReadListenerList().isEmpty()) { |
||||||
|
readListenerList.addAll(workbook.getCustomReadListenerList()); |
||||||
|
} |
||||||
|
workbookHolder.setReadListenerList(readListenerList); |
||||||
|
return workbookHolder; |
||||||
|
} |
||||||
|
|
||||||
|
private static WorkbookHolder buildBaseWorkbookHolder(com.alibaba.excel.metadata.Workbook workbook) { |
||||||
|
WorkbookHolder workbookHolder = new WorkbookHolder(); |
||||||
|
workbookHolder.setUse1904windowing(workbook.getUse1904windowing()); |
||||||
|
workbookHolder.setWorkbookParam(workbook); |
||||||
|
workbookHolder.setInputStream(workbook.getInputStream()); |
||||||
|
workbookHolder.setFile(workbook.getFile()); |
||||||
|
workbookHolder.setExcelType(workbook.getExcelType()); |
||||||
|
workbookHolder.setHead(workbook.getHead()); |
||||||
|
workbookHolder.setClazz(workbook.getClazz()); |
||||||
|
if (workbook.getConvertAllFiled() == null) { |
||||||
|
workbookHolder.setConvertAllFiled(Boolean.TRUE); |
||||||
|
} else { |
||||||
|
workbookHolder.setConvertAllFiled(workbook.getConvertAllFiled()); |
||||||
|
} |
||||||
|
if (workbook.getAutoCloseStream() == null) { |
||||||
|
workbookHolder.setAutoCloseStream(Boolean.TRUE); |
||||||
|
} else { |
||||||
|
workbookHolder.setAutoCloseStream(workbook.getAutoCloseStream()); |
||||||
|
} |
||||||
|
if (workbook.getAutoTrim() == null) { |
||||||
|
workbookHolder.setAutoTrim(Boolean.TRUE); |
||||||
|
} else { |
||||||
|
workbookHolder.setAutoTrim(workbook.getNeedHead()); |
||||||
|
} |
||||||
|
return workbookHolder; |
||||||
|
} |
||||||
|
|
||||||
|
public Workbook getWorkbook() { |
||||||
|
return workbook; |
||||||
|
} |
||||||
|
|
||||||
|
public void setWorkbook(Workbook workbook) { |
||||||
|
this.workbook = workbook; |
||||||
|
} |
||||||
|
|
||||||
|
public Map<Integer, SheetHolder> getHasBeenInitializedSheet() { |
||||||
|
return hasBeenInitializedSheet; |
||||||
|
} |
||||||
|
|
||||||
|
public void setHasBeenInitializedSheet(Map<Integer, SheetHolder> hasBeenInitializedSheet) { |
||||||
|
this.hasBeenInitializedSheet = hasBeenInitializedSheet; |
||||||
|
} |
||||||
|
|
||||||
|
public com.alibaba.excel.metadata.Workbook getWorkbookParam() { |
||||||
|
return workbookParam; |
||||||
|
} |
||||||
|
|
||||||
|
public void setWorkbookParam(com.alibaba.excel.metadata.Workbook workbookParam) { |
||||||
|
this.workbookParam = workbookParam; |
||||||
|
} |
||||||
|
|
||||||
|
public OutputStream getOutputStream() { |
||||||
|
return outputStream; |
||||||
|
} |
||||||
|
|
||||||
|
public void setOutputStream(OutputStream outputStream) { |
||||||
|
this.outputStream = outputStream; |
||||||
|
} |
||||||
|
|
||||||
|
public InputStream getInputStream() { |
||||||
|
return inputStream; |
||||||
|
} |
||||||
|
|
||||||
|
public void setInputStream(InputStream inputStream) { |
||||||
|
this.inputStream = inputStream; |
||||||
|
} |
||||||
|
|
||||||
|
public com.alibaba.excel.event.WriteHandler getWriteHandler() { |
||||||
|
return writeHandler; |
||||||
|
} |
||||||
|
|
||||||
|
public void setWriteHandler(com.alibaba.excel.event.WriteHandler writeHandler) { |
||||||
|
this.writeHandler = writeHandler; |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean getAutoCloseStream() { |
||||||
|
return autoCloseStream; |
||||||
|
} |
||||||
|
|
||||||
|
public void setAutoCloseStream(Boolean autoCloseStream) { |
||||||
|
this.autoCloseStream = autoCloseStream; |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean getConvertAllFiled() { |
||||||
|
return convertAllFiled; |
||||||
|
} |
||||||
|
|
||||||
|
public void setConvertAllFiled(Boolean convertAllFiled) { |
||||||
|
this.convertAllFiled = convertAllFiled; |
||||||
|
} |
||||||
|
|
||||||
|
public File getFile() { |
||||||
|
return file; |
||||||
|
} |
||||||
|
|
||||||
|
public void setFile(File file) { |
||||||
|
this.file = file; |
||||||
|
} |
||||||
|
|
||||||
|
public ExcelTypeEnum getExcelType() { |
||||||
|
return excelType; |
||||||
|
} |
||||||
|
|
||||||
|
public void setExcelType(ExcelTypeEnum excelType) { |
||||||
|
this.excelType = excelType; |
||||||
|
} |
||||||
|
|
||||||
|
public Object getReadCustomObject() { |
||||||
|
return readCustomObject; |
||||||
|
} |
||||||
|
|
||||||
|
public void setReadCustomObject(Object readCustomObject) { |
||||||
|
this.readCustomObject = readCustomObject; |
||||||
|
} |
||||||
|
|
||||||
|
public ReadCache getReadCache() { |
||||||
|
return readCache; |
||||||
|
} |
||||||
|
|
||||||
|
public void setReadCache(ReadCache readCache) { |
||||||
|
this.readCache = readCache; |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean getUse1904windowing() { |
||||||
|
return use1904windowing; |
||||||
|
} |
||||||
|
|
||||||
|
public void setUse1904windowing(Boolean use1904windowing) { |
||||||
|
this.use1904windowing = use1904windowing; |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean getMandatoryUseInputStream() { |
||||||
|
return mandatoryUseInputStream; |
||||||
|
} |
||||||
|
|
||||||
|
public void setMandatoryUseInputStream(Boolean mandatoryUseInputStream) { |
||||||
|
this.mandatoryUseInputStream = mandatoryUseInputStream; |
||||||
|
} |
||||||
|
|
||||||
|
public File getReadTempFile() { |
||||||
|
return readTempFile; |
||||||
|
} |
||||||
|
|
||||||
|
public void setReadTempFile(File readTempFile) { |
||||||
|
this.readTempFile = readTempFile; |
||||||
|
} |
||||||
|
} |
@ -1,4 +1,4 @@ |
|||||||
package com.alibaba.excel.metadata.holder; |
package com.alibaba.excel.metadata.holder.write; |
||||||
|
|
||||||
import java.util.ArrayList; |
import java.util.ArrayList; |
||||||
import java.util.HashMap; |
import java.util.HashMap; |
@ -1,4 +1,4 @@ |
|||||||
package com.alibaba.excel.metadata.holder; |
package com.alibaba.excel.metadata.holder.write; |
||||||
|
|
||||||
import java.util.ArrayList; |
import java.util.ArrayList; |
||||||
import java.util.HashMap; |
import java.util.HashMap; |
@ -1,4 +1,4 @@ |
|||||||
package com.alibaba.excel.metadata.holder; |
package com.alibaba.excel.metadata.holder.write; |
||||||
|
|
||||||
import java.io.File; |
import java.io.File; |
||||||
import java.io.InputStream; |
import java.io.InputStream; |
@ -1,4 +1,4 @@ |
|||||||
package com.alibaba.excel.metadata.holder; |
package com.alibaba.excel.metadata.holder.write; |
||||||
|
|
||||||
import java.util.List; |
import java.util.List; |
||||||
import java.util.Map; |
import java.util.Map; |
@ -1,4 +1,4 @@ |
|||||||
package com.alibaba.excel.event; |
package com.alibaba.excel.read.listener.event; |
||||||
|
|
||||||
public interface AnalysisFinishEvent { |
public interface AnalysisFinishEvent { |
||||||
Object getAnalysisResult(); |
Object getAnalysisResult(); |
@ -1,4 +1,4 @@ |
|||||||
package com.alibaba.excel.event; |
package com.alibaba.excel.read.listener.event; |
||||||
|
|
||||||
import java.util.ArrayList; |
import java.util.ArrayList; |
||||||
import java.util.List; |
import java.util.List; |
Loading…
Reference in new issue