Browse Source

update cache

pull/3197/head
gongxuanzhang 2 years ago
parent
commit
67196ba295
  1. 27
      easyexcel-core/src/main/java/com/alibaba/excel/util/ClassUtils.java
  2. 18
      easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java

27
easyexcel-core/src/main/java/com/alibaba/excel/util/ClassUtils.java

@ -64,11 +64,11 @@ public class ClassUtils {
/**
* memory cache
*/
public static final ConcurrentHashMap<Class<?>, FieldCache> FIELD_CACHE = new ConcurrentHashMap<>();
public static final Map<FieldCacheKey, FieldCache> FIELD_CACHE = new ConcurrentHashMap<>();
/**
* thread local cache
*/
private static final ThreadLocal<Map<Class<?>, FieldCache>> FIELD_THREAD_LOCAL = new ThreadLocal<>();
private static final ThreadLocal<Map<FieldCacheKey, FieldCache>> FIELD_THREAD_LOCAL = new ThreadLocal<>();
/**
* The cache configuration information for each of the class
@ -280,16 +280,16 @@ public class ClassUtils {
public static FieldCache declaredFields(Class<?> clazz, ConfigurationHolder configurationHolder) {
switch (configurationHolder.globalConfiguration().getFiledCacheLocation()) {
case THREAD_LOCAL:
Map<Class<?>, FieldCache> fieldCacheMap = FIELD_THREAD_LOCAL.get();
Map<FieldCacheKey, FieldCache> fieldCacheMap = FIELD_THREAD_LOCAL.get();
if (fieldCacheMap == null) {
fieldCacheMap = MapUtils.newHashMap();
FIELD_THREAD_LOCAL.set(fieldCacheMap);
}
return fieldCacheMap.computeIfAbsent(clazz, key -> {
return fieldCacheMap.computeIfAbsent(new FieldCacheKey(clazz, configurationHolder), key -> {
return doDeclaredFields(clazz, configurationHolder);
});
case MEMORY:
return FIELD_CACHE.computeIfAbsent(clazz, key -> {
return FIELD_CACHE.computeIfAbsent(new FieldCacheKey(clazz, configurationHolder), key -> {
return doDeclaredFields(clazz, configurationHolder);
});
case NONE:
@ -554,6 +554,23 @@ public class ClassUtils {
private String fieldName;
}
@Data
public static class FieldCacheKey {
private Class<?> clazz;
private Collection<String> excludeColumnFieldNames;
private Collection<Integer> excludeColumnIndexes;
private Collection<String> includeColumnFieldNames;
private Collection<Integer> includeColumnIndexes;
FieldCacheKey(Class<?> clazz, ConfigurationHolder configurationHolder) {
this.clazz = clazz;
WriteHolder writeHolder = (WriteHolder)configurationHolder;
this.excludeColumnFieldNames = writeHolder.excludeColumnFieldNames();
this.excludeColumnIndexes = writeHolder.excludeColumnIndexes();
this.includeColumnFieldNames = writeHolder.includeColumnFieldNames();
this.includeColumnIndexes = writeHolder.includeColumnIndexes();
}
}
public static void removeThreadLocalCache() {
FIELD_THREAD_LOCAL.remove();

18
easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java

@ -4,11 +4,14 @@ import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.alibaba.easyexcel.test.core.head.ComplexHeadData;
import com.alibaba.easyexcel.test.demo.read.ConverterData;
import com.alibaba.easyexcel.test.util.TestFileUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
@ -409,7 +412,7 @@ public class WriteTest {
/**
* 列宽行高
* <p>
* 1. 创建excel对应的实体对象 参照{@link WidthAndHeightData}
* 1. 创建excel对应的实体对象 参照{@link WidthAndHeightData }
* <p>
* 2. 使用注解{@link ColumnWidth}{@link HeadRowHeight}{@link ContentRowHeight}指定宽度或高度
* <p>
@ -703,6 +706,19 @@ public class WriteTest {
EasyExcel.write(fileName).head(head()).sheet("模板").doWrite(dataList());
}
@Test
public void sheetCol(){
String fileName = TestFileUtil.getPath() + "customCol" + System.currentTimeMillis() + ".xlsx";
try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).includeColumnFieldNames(Arrays.asList("string","date","doubleData")).build()) {
// 把sheet设置为不需要头 不然会输出sheet的头 这样看起来第一个table 就有2个头了
WriteSheet writeSheet = EasyExcel.writerSheet("模板").includeColumnFieldNames(Arrays.asList("string","date")).build();
excelWriter.write(data(), writeSheet);
writeSheet = EasyExcel.writerSheet(1,"模板1").needHead(false).build();
// 第二次写如也会创建头,然后在第一次的后面写入数据
WriteTable string = EasyExcel.writerTable().needHead(true).includeColumnFieldNames(Arrays.asList("string")).build();
excelWriter.write(data(),writeSheet,string);
}
}
private List<LongestMatchColumnWidthData> dataLong() {
List<LongestMatchColumnWidthData> list = ListUtils.newArrayList();
for (int i = 0; i < 10; i++) {

Loading…
Cancel
Save