Browse Source

尝试修复 issue #3905

pull/3926/head
wangtong_b 6 months ago
parent
commit
f8d1528552
  1. 15
      easyexcel-core/src/main/java/com/alibaba/excel/read/listener/ModelBuildEventListener.java
  2. 1
      easyexcel-support/pom.xml
  3. 90
      easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/read/TestAccessor.java
  4. BIN
      easyexcel-test/src/test/resources/demo/testAccessors.xlsx
  5. 4
      pom.xml

15
easyexcel-core/src/main/java/com/alibaba/excel/read/listener/ModelBuildEventListener.java

@ -1,5 +1,6 @@
package com.alibaba.excel.read.listener;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Map;
@ -15,11 +16,8 @@ import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.read.metadata.holder.ReadSheetHolder;
import com.alibaba.excel.read.metadata.property.ExcelReadHeadProperty;
import com.alibaba.excel.support.cglib.beans.BeanMap;
import com.alibaba.excel.util.BeanMapUtils;
import com.alibaba.excel.util.ClassUtils;
import com.alibaba.excel.util.ConverterUtils;
import com.alibaba.excel.util.DateUtils;
import com.alibaba.excel.util.MapUtils;
import com.alibaba.excel.support.util.ReflectionUtils;
import com.alibaba.excel.util.*;
/**
@ -147,7 +145,12 @@ public class ModelBuildEventListener implements IgnoreExceptionReadListener<Map<
fieldName, readSheetHolder), readSheetHolder.converterMap(), context,
context.readRowHolder().getRowIndex(), index);
if (value != null) {
dataMap.put(fieldName, value);
// dataMap.put(fieldName, value);
// 使用 Spring 的工具类进行属性值的填充
// fix: https://github.com/alibaba/easyexcel/issues/3905
Field field = ReflectionUtils.findField(excelReadHeadProperty.getHeadClazz(), fieldName);
field.setAccessible(true);
ReflectionUtils.setField(field, resultModel, value);
}
}
return resultModel;

1
easyexcel-support/pom.xml

@ -60,6 +60,7 @@
<includes>
<include>org/springframework/asm/**</include>
<include>org/springframework/cglib/**</include>
<include>org/springframework/util/*</include>
</includes>
</filter>
</filters>

90
easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/read/TestAccessor.java

@ -0,0 +1,90 @@
package com.alibaba.easyexcel.test.demo.read;
import com.alibaba.easyexcel.test.util.TestFileUtil;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.CellExtra;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import java.io.File;
/**
* 测试使用 lombok @Accessors(chain = true) 注解无法映射到对象对应属性的问题
*/
public class TestAccessor {
private static final ObjectMapper objectMapper = new ObjectMapper();
@Test
public void importToRegulation () {
String fileName = TestFileUtil.getPath() + "demo" + File.separator + "testAccessors.xlsx";
EasyExcelFactory
.read(fileName, User.class, new UserListener())
.sheet().doRead();
}
@Data
@Accessors(chain = true)
public static class User {
@ExcelProperty(index = 0)
private String name;
@ExcelProperty(index = 1)
private Integer age;
}
@Slf4j
public static class UserListener extends AnalysisEventListener<User> {
@Override
public void onException(Exception exception, AnalysisContext context) throws Exception {
super.onException(exception, context);
}
/**
* 这个每一条数据解析都会来调用
*/
@Override
public void invoke(User data, AnalysisContext context) {
try {
log.info("解析到一条数据:{}", objectMapper.writeValueAsString(data));
} catch (JsonProcessingException e) {
log.error("序列化成 json 失败: {}", e.getMessage());
}
}
@Override
public void extra(CellExtra extra, AnalysisContext context) {
super.extra(extra, context);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
@Override
public boolean hasNext(AnalysisContext context) {
return super.hasNext(context);
}
}
}

BIN
easyexcel-test/src/test/resources/demo/testAccessors.xlsx

Binary file not shown.

4
pom.xml

@ -90,7 +90,9 @@
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel-support</artifactId>
<version>3.3.4</version>
<!-- 使用统一管理版本-->
<!-- <version>3.3.4</version>-->
<version>${revision}</version>
</dependency>
<dependency>

Loading…
Cancel
Save