Browse Source

新增:LocalDate转换器

pull/2932/head
ywzou 2 years ago
parent
commit
28556134ff
  1. 2
      .gitignore
  2. 12
      easyexcel-core/src/main/java/com/alibaba/excel/converters/DefaultConverterLoader.java
  3. 34
      easyexcel-core/src/main/java/com/alibaba/excel/converters/localdate/LocalDateConverter.java
  4. 50
      easyexcel-core/src/main/java/com/alibaba/excel/converters/localdate/LocalDateNumberConverter.java
  5. 47
      easyexcel-core/src/main/java/com/alibaba/excel/converters/localdate/LocalDateStringConverter.java
  6. 2
      easyexcel-core/src/main/java/com/alibaba/excel/converters/localdatetime/LocalDateTimeNumberConverter.java
  7. 19
      easyexcel-core/src/main/java/com/alibaba/excel/metadata/data/WriteCellData.java
  8. 48
      easyexcel-core/src/main/java/com/alibaba/excel/util/DateUtils.java
  9. 42
      easyexcel-core/src/main/java/com/alibaba/excel/write/executor/AbstractExcelWriteExecutor.java
  10. 114
      easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/localdate/DataEntry.java
  11. 41
      easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/localdate/EntryListener.java
  12. 99
      easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/localdate/LocalDateTest.java
  13. BIN
      easyexcel-test/src/test/resources/localdate/local-date-time-fill.xlsx
  14. BIN
      easyexcel-test/src/test/resources/localdate/local-date-time.xlsx
  15. BIN
      easyexcel-test/src/test/resources/localdate/local-date-time2.xlsx

2
.gitignore vendored

@ -15,3 +15,5 @@ antx.properties
output/
.flattened-pom.xml
dependency-reduced-pom.xml
.settings/
*.factorypath

12
easyexcel-core/src/main/java/com/alibaba/excel/converters/DefaultConverterLoader.java

@ -31,8 +31,11 @@ import com.alibaba.excel.converters.inputstream.InputStreamImageConverter;
import com.alibaba.excel.converters.integer.IntegerBooleanConverter;
import com.alibaba.excel.converters.integer.IntegerNumberConverter;
import com.alibaba.excel.converters.integer.IntegerStringConverter;
import com.alibaba.excel.converters.localdatetime.LocalDateNumberConverter;
import com.alibaba.excel.converters.localdate.LocalDateConverter;
import com.alibaba.excel.converters.localdate.LocalDateNumberConverter;
import com.alibaba.excel.converters.localdate.LocalDateStringConverter;
import com.alibaba.excel.converters.localdatetime.LocalDateTimeDateConverter;
import com.alibaba.excel.converters.localdatetime.LocalDateTimeNumberConverter;
import com.alibaba.excel.converters.localdatetime.LocalDateTimeStringConverter;
import com.alibaba.excel.converters.longconverter.LongBooleanConverter;
import com.alibaba.excel.converters.longconverter.LongNumberConverter;
@ -82,9 +85,12 @@ public class DefaultConverterLoader {
putAllConverter(new DateNumberConverter());
putAllConverter(new DateStringConverter());
putAllConverter(new LocalDateNumberConverter());
putAllConverter(new LocalDateTimeNumberConverter());
putAllConverter(new LocalDateTimeStringConverter());
putAllConverter(new LocalDateNumberConverter());
putAllConverter(new LocalDateStringConverter());
putAllConverter(new DoubleBooleanConverter());
putAllConverter(new DoubleNumberConverter());
putAllConverter(new DoubleStringConverter());
@ -120,6 +126,7 @@ public class DefaultConverterLoader {
putWriteConverter(new BooleanBooleanConverter());
putWriteConverter(new ByteNumberConverter());
putWriteConverter(new DateDateConverter());
putWriteConverter(new LocalDateConverter());
putWriteConverter(new LocalDateTimeDateConverter());
putWriteConverter(new DoubleNumberConverter());
putWriteConverter(new FloatNumberConverter());
@ -139,6 +146,7 @@ public class DefaultConverterLoader {
putWriteStringConverter(new BooleanStringConverter());
putWriteStringConverter(new ByteStringConverter());
putWriteStringConverter(new DateStringConverter());
putWriteStringConverter(new LocalDateStringConverter());
putWriteStringConverter(new LocalDateTimeStringConverter());
putWriteStringConverter(new DoubleStringConverter());
putWriteStringConverter(new FloatStringConverter());

34
easyexcel-core/src/main/java/com/alibaba/excel/converters/localdate/LocalDateConverter.java

@ -0,0 +1,34 @@
package com.alibaba.excel.converters.localdate;
import java.time.LocalDate;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.alibaba.excel.util.DateUtils;
import com.alibaba.excel.util.WorkBookUtil;
/**
* LocalDate converter
*
* @author ywzou
*/
public class LocalDateConverter implements Converter<LocalDate> {
@Override
public Class<LocalDate> supportJavaTypeKey() {
return LocalDate.class;
}
@Override
public WriteCellData<?> convertToExcelData(LocalDate value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
WriteCellData<?> cellData = new WriteCellData<>(value);
String format = null;
if (contentProperty != null && contentProperty.getDateTimeFormatProperty() != null) {
format = contentProperty.getDateTimeFormatProperty().getFormat();
}
WorkBookUtil.fillDataFormat(cellData, format, DateUtils.DATE_FORMAT_10);
return cellData;
}
}

50
easyexcel-core/src/main/java/com/alibaba/excel/converters/localdate/LocalDateNumberConverter.java

@ -0,0 +1,50 @@
package com.alibaba.excel.converters.localdate;
import java.math.BigDecimal;
import java.time.LocalDate;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.alibaba.excel.util.DateUtils;
import org.apache.poi.ss.usermodel.DateUtil;
/**
* LocalDate and number converter
*
* @author ywzou
*/
public class LocalDateNumberConverter implements Converter<LocalDate> {
@Override
public Class<LocalDate> supportJavaTypeKey() {
return LocalDate.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.NUMBER;
}
@Override
public LocalDate convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) {
return DateUtils.getLocalDate(cellData.getNumberValue().doubleValue(), globalConfiguration.getUse1904windowing());
} else {
return DateUtils.getLocalDate(cellData.getNumberValue().doubleValue(), contentProperty.getDateTimeFormatProperty().getUse1904windowing());
}
}
@Override
public WriteCellData<?> convertToExcelData(LocalDate value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) {
return new WriteCellData<>(BigDecimal.valueOf(DateUtil.getExcelDate(value, globalConfiguration.getUse1904windowing())));
} else {
return new WriteCellData<>(BigDecimal.valueOf(DateUtil.getExcelDate(value, contentProperty.getDateTimeFormatProperty().getUse1904windowing())));
}
}
}

47
easyexcel-core/src/main/java/com/alibaba/excel/converters/localdate/LocalDateStringConverter.java

@ -0,0 +1,47 @@
package com.alibaba.excel.converters.localdate;
import java.text.ParseException;
import java.time.LocalDate;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.alibaba.excel.util.DateUtils;
/**
* LocalDate and string converter
*
* @author ywzou
*/
public class LocalDateStringConverter implements Converter<LocalDate> {
@Override
public Class<LocalDate> supportJavaTypeKey() {
return LocalDate.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public LocalDate convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws ParseException {
if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) {
return DateUtils.parseLocalDate(cellData.getStringValue(), null, globalConfiguration.getLocale());
} else {
return DateUtils.parseLocalDate(cellData.getStringValue(), contentProperty.getDateTimeFormatProperty().getFormat(), globalConfiguration.getLocale());
}
}
@Override
public WriteCellData<?> convertToExcelData(LocalDate value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) {
return new WriteCellData<>(DateUtils.format(value, null, globalConfiguration.getLocale()));
} else {
return new WriteCellData<>(DateUtils.format(value, contentProperty.getDateTimeFormatProperty().getFormat(), globalConfiguration.getLocale()));
}
}
}

2
easyexcel-core/src/main/java/com/alibaba/excel/converters/localdatetime/LocalDateNumberConverter.java → easyexcel-core/src/main/java/com/alibaba/excel/converters/localdatetime/LocalDateTimeNumberConverter.java

@ -18,7 +18,7 @@ import org.apache.poi.ss.usermodel.DateUtil;
*
* @author Jiaju Zhuang
*/
public class LocalDateNumberConverter implements Converter<LocalDateTime> {
public class LocalDateTimeNumberConverter implements Converter<LocalDateTime> {
@Override
public Class<?> supportJavaTypeKey() {

19
easyexcel-core/src/main/java/com/alibaba/excel/metadata/data/WriteCellData.java

@ -1,11 +1,13 @@
package com.alibaba.excel.metadata.data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
import org.apache.poi.ss.usermodel.CellStyle;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
@ -14,7 +16,6 @@ import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.apache.poi.ss.usermodel.CellStyle;
/**
* wirte cell data
@ -29,7 +30,7 @@ public class WriteCellData<T> extends CellData<T> {
/**
* Support only when writing.{@link CellDataTypeEnum#DATE}
*/
private LocalDateTime dateValue;
private Object dateValue;
/**
* rich text.{@link CellDataTypeEnum#RICH_TEXT_STRING}
@ -105,9 +106,19 @@ public class WriteCellData<T> extends CellData<T> {
throw new IllegalArgumentException("DateValue can not be null");
}
setType(CellDataTypeEnum.DATE);
this.dateValue = LocalDateTime.ofInstant(dateValue.toInstant(), ZoneId.systemDefault());
// this.dateValue = LocalDateTime.ofInstant(dateValue.toInstant(), ZoneId.systemDefault());
this.dateValue = dateValue;
}
public WriteCellData(LocalDate dateValue) {
super();
if (dateValue == null) {
throw new IllegalArgumentException("DateValue can not be null");
}
setType(CellDataTypeEnum.DATE);
this.dateValue = dateValue;
}
public WriteCellData(LocalDateTime dateValue) {
super();
if (dateValue == null) {

48
easyexcel-core/src/main/java/com/alibaba/excel/util/DateUtils.java

@ -4,6 +4,7 @@ import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
@ -95,6 +96,26 @@ public class DateUtils {
}
}
/**
* convert string to LocalDate
*
* @param dateString
* @param dateFormat
* @param local
* @return
*/
public static LocalDate parseLocalDate(String dateString, String dateFormat, Locale local) {
if (StringUtils.isEmpty(dateFormat)) {
dateFormat = switchDateFormat(dateString);
}
if (local == null) {
return LocalDate.parse(dateString, DateTimeFormatter.ofPattern(dateFormat));
} else {
return LocalDate.parse(dateString, DateTimeFormatter.ofPattern(dateFormat, local));
}
}
/**
* convert string to date
*
@ -199,6 +220,29 @@ public class DateUtils {
return format(date, dateFormat, null);
}
/**
* Format date
*
* @param date
* @param dateFormat
* @return
*/
public static String format(LocalDate date, String dateFormat, Locale local) {
if (date == null) {
return null;
}
if (StringUtils.isEmpty(dateFormat)) {
dateFormat = DATE_FORMAT_10;
}
if (local == null) {
return date.format(DateTimeFormatter.ofPattern(dateFormat));
} else {
return date.format(DateTimeFormatter.ofPattern(dateFormat, local));
}
}
/**
* Format date
*
@ -271,6 +315,10 @@ public class DateUtils {
return DateUtil.getLocalDateTime(date, use1904windowing, true);
}
public static LocalDate getLocalDate(double date, boolean use1904windowing) {
return getLocalDateTime(date, use1904windowing).toLocalDate();
}
/**
* Determine if it is a date format.
*

42
easyexcel-core/src/main/java/com/alibaba/excel/write/executor/AbstractExcelWriteExecutor.java

@ -1,7 +1,22 @@
package com.alibaba.excel.write.executor;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Comment;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Hyperlink;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import com.alibaba.excel.context.WriteContext;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.converters.ConverterKeyBuild;
@ -24,18 +39,6 @@ import com.alibaba.excel.util.WorkBookUtil;
import com.alibaba.excel.util.WriteHandlerUtils;
import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Comment;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Hyperlink;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
/**
* Excel write Executor
*
@ -92,7 +95,20 @@ public abstract class AbstractExcelWriteExecutor implements ExcelWriteExecutor {
cell.setCellValue(cellData.getNumberValue().doubleValue());
return;
case DATE:
cell.setCellValue(cellData.getDateValue());
// cell.setCellValue(cellData.getDateValue());
Object dateValue = cellData.getDateValue();
if (dateValue instanceof Date) {
cell.setCellValue((Date) dateValue);
}
if (dateValue instanceof LocalDate) {
cell.setCellValue((LocalDate) dateValue);
}
if (dateValue instanceof LocalDateTime) {
cell.setCellValue((LocalDateTime) dateValue);
}
return;
case RICH_TEXT_STRING:
cell.setCellValue(StyleUtil

114
easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/localdate/DataEntry.java

@ -0,0 +1,114 @@
package com.alibaba.easyexcel.test.core.localdate;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import com.alibaba.fastjson.annotation.JSONField;
/**
* @author ywzou
*/
public class DataEntry {
private String userName;
private int age;
private boolean hashChild;
private BigDecimal income;
private double height;
private Double weight;
// @DateTimeFormat(value = "yyyy-MM-dd")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime birthdayTime;// yyyy-MM-dd HH:mm:ss
@JSONField(format = "yyyy-MM-dd")
private LocalDate birthday;// yyyy-MM-dd
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date createDate;// yyyy-MM-dd HH:mm:ss
// @DateTimeFormat(value = "yyyy-MM-dd")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date modifyDate;// yyyy-MM-dd HH:mm:ss
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isHashChild() {
return hashChild;
}
public void setHashChild(boolean hashChild) {
this.hashChild = hashChild;
}
public BigDecimal getIncome() {
return income;
}
public void setIncome(BigDecimal income) {
this.income = income;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public Double getWeight() {
return weight;
}
public void setWeight(Double weight) {
this.weight = weight;
}
public LocalDateTime getBirthdayTime() {
return birthdayTime;
}
public void setBirthdayTime(LocalDateTime birthdayTime) {
this.birthdayTime = birthdayTime;
}
public LocalDate getBirthday() {
return birthday;
}
public void setBirthday(LocalDate birthday) {
this.birthday = birthday;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public Date getModifyDate() {
return modifyDate;
}
public void setModifyDate(Date modifyDate) {
this.modifyDate = modifyDate;
}
}

41
easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/localdate/EntryListener.java

@ -0,0 +1,41 @@
package com.alibaba.easyexcel.test.core.localdate;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.fastjson.JSONObject;
/**
* 读的监听器
*
* @author ywzou
*
*/
public class EntryListener implements ReadListener<DataEntry> {
private static final Logger log = LoggerFactory.getLogger(EntryListener.class);
private List<DataEntry> entries = new ArrayList<>();
// 这个每一条数据解析都会来调用
@Override
public void invoke(DataEntry data, AnalysisContext context) {
log.info("解析到一条数据:{}", JSONObject.toJSONString(data));
entries.add(data);
}
// 所有数据解析完成了 都会来调用
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
public List<DataEntry> getEntries() {
return entries;
}
}

99
easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/localdate/LocalDateTest.java

@ -0,0 +1,99 @@
package com.alibaba.easyexcel.test.core.localdate;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.easyexcel.test.util.TestFileUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.fastjson2.JSON;
/**
* @author Jiaju Zhuang
*/
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class LocalDateTest {
private static final Logger log = LoggerFactory.getLogger(LocalDateTest.class);
// 读取
@Test
public void read() throws Exception {
String fileName = TestFileUtil.getPath() + "localdate/local-date-time.xlsx";
EntryListener entryListener = new EntryListener();
EasyExcel.read(fileName, DataEntry.class, entryListener).sheet().doRead();
log.info("读取到的数据==>{}", JSON.toJSONString(entryListener.getEntries()));
}
// 读取
@Test
public void read2() throws Exception {
String fileName = TestFileUtil.getPath() + "localdate/local-date-time2.xlsx";
EntryListener entryListener = new EntryListener();
EasyExcel.read(fileName, DataEntry.class, entryListener).sheet().doRead();
log.info("读取到的数据==>{}", JSON.toJSONString(entryListener.getEntries()));
}
// 写
@Test
public void write() throws Exception {
List<DataEntry> entries = buildData();
String fileName = TestFileUtil.getPath() + "local-date-time-" + System.currentTimeMillis() + ".xlsx";
EasyExcel.write(fileName, DataEntry.class).sheet("demo").doWrite(entries);
}
// 填充
@Test
public void fill() throws Exception {
List<DataEntry> entries = buildData();
String templateFileName = TestFileUtil.getPath() + "localdate/local-date-time-fill.xlsx";
String fileName = TestFileUtil.getPath() + "local-date-time-fill-" + System.currentTimeMillis() + ".xlsx";
EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(entries);
}
private List<DataEntry> buildData() {
List<DataEntry> entries = ListUtils.newArrayList();
BigDecimal hundred = new BigDecimal(1000);
LocalDateTime localDateTime = LocalDateTime.now();
LocalDate localDate = LocalDate.now();
Date date = new Date();
Calendar calendar = Calendar.getInstance();
for (int i = 1; i < 11; i++) {
calendar.setTime(date);
DataEntry item = new DataEntry();
item.setUserName("王麻子" + i);
item.setAge(i * 10);
item.setHashChild(i % 2 > 0);
item.setIncome(hundred.multiply(new BigDecimal(i)));
item.setHeight(i % 2 > 0 ? 1.72 : 1.68);
item.setWeight(i % 2 > 0 ? 50.00 : 40.00);
item.setBirthdayTime(localDateTime.plusDays(i));
item.setBirthday(localDate.plusDays(i));
calendar.add(Calendar.DAY_OF_MONTH, i);
item.setCreateDate(calendar.getTime());
calendar.add(Calendar.HOUR_OF_DAY, i);
item.setModifyDate(calendar.getTime());
entries.add(item);
}
return entries;
}
}

BIN
easyexcel-test/src/test/resources/localdate/local-date-time-fill.xlsx

Binary file not shown.

BIN
easyexcel-test/src/test/resources/localdate/local-date-time.xlsx

Binary file not shown.

BIN
easyexcel-test/src/test/resources/localdate/local-date-time2.xlsx

Binary file not shown.
Loading…
Cancel
Save