在导入的模板文件中设置了日期格式 yyyy-mm-dd
java 接受实体类对应字段为LocalDate
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springblade.common.converters.LocalDateConverter;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
@Data
@ApiModel(value = "还款计划VO", description = "还款计划VO")
public class LoanPlanExcelVO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "期数")
@ExcelProperty(value = "期数", index = 0)
private Integer period;
@ApiModelProperty(value = "应还日期")
@JsonFormat(pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@ExcelProperty(value = "期数", index = 1, converter = LocalDateConverter.class)
private LocalDate repayDate;
@ApiModelProperty(value = "应还金额")
@ExcelProperty(value = "应还金额", index = 2)
private BigDecimal amount;
}
easyExcel在解析时 该字段类型为Number. 值是从1900年1月1日到这一天的日期,所以添加解析器
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class LocalDateConverter implements Converter<LocalDate> {
@Override
public Class supportJavaTypeKey() {
return LocalDate.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public LocalDate convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
if(cellData.getType().equals(CellDataTypeEnum.NUMBER)){
LocalDate localDate = LocalDate.of(1900, 1, 1);
//execl有些奇怪的bug, 导致日期数差2
localDate = localDate.plusDays(cellData.getNumberValue().longValue()-2);
return localDate;
}else if(cellData.getType().equals(CellDataTypeEnum.STRING)) {
return LocalDate.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
}else{
return null;
}
}
@Override
public CellData convertToExcelData(LocalDate value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
return new CellData<>(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
}
}