From aa302be1c8748f55defd7e15157335c198f9a29e Mon Sep 17 00:00:00 2001 From: gongxuanzhang Date: Mon, 22 May 2023 23:27:05 +0800 Subject: [PATCH] add instant converter delegate from localDatetime --- .../converters/DefaultConverterLoader.java | 21 ++++++-- .../instant/InstantDateConverter.java | 38 +++++++++++++ .../instant/InstantNumberConverter.java | 53 +++++++++++++++++++ .../instant/InstantStringConverter.java | 53 +++++++++++++++++++ .../core/converter/ConverterDataListener.java | 1 + .../core/converter/ConverterDataTest.java | 2 + .../core/converter/ConverterReadData.java | 3 ++ .../core/converter/ConverterWriteData.java | 5 ++ .../alibaba/easyexcel/test/util/TestUtil.java | 4 ++ 9 files changed, 175 insertions(+), 5 deletions(-) create mode 100644 easyexcel-core/src/main/java/com/alibaba/excel/converters/instant/InstantDateConverter.java create mode 100644 easyexcel-core/src/main/java/com/alibaba/excel/converters/instant/InstantNumberConverter.java create mode 100644 easyexcel-core/src/main/java/com/alibaba/excel/converters/instant/InstantStringConverter.java diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/converters/DefaultConverterLoader.java b/easyexcel-core/src/main/java/com/alibaba/excel/converters/DefaultConverterLoader.java index 8c371932..881e753f 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/converters/DefaultConverterLoader.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/converters/DefaultConverterLoader.java @@ -28,14 +28,17 @@ import com.alibaba.excel.converters.floatconverter.FloatBooleanConverter; import com.alibaba.excel.converters.floatconverter.FloatNumberConverter; import com.alibaba.excel.converters.floatconverter.FloatStringConverter; import com.alibaba.excel.converters.inputstream.InputStreamImageConverter; +import com.alibaba.excel.converters.instant.InstantDateConverter; +import com.alibaba.excel.converters.instant.InstantNumberConverter; +import com.alibaba.excel.converters.instant.InstantStringConverter; 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.localdate.LocalDateDateConverter; import com.alibaba.excel.converters.localdate.LocalDateNumberConverter; import com.alibaba.excel.converters.localdate.LocalDateStringConverter; -import com.alibaba.excel.converters.localdatetime.LocalDateTimeNumberConverter; 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; @@ -88,8 +91,12 @@ public class DefaultConverterLoader { putAllConverter(new LocalDateNumberConverter()); putAllConverter(new LocalDateStringConverter()); - putAllConverter(new LocalDateTimeNumberConverter()); - putAllConverter(new LocalDateTimeStringConverter()); + LocalDateTimeNumberConverter localDateTimeNumberConverter = new LocalDateTimeNumberConverter(); + putAllConverter(localDateTimeNumberConverter); + putAllConverter(new InstantNumberConverter(localDateTimeNumberConverter)); + LocalDateTimeStringConverter localDateTimeStringConverter = new LocalDateTimeStringConverter(); + putAllConverter(localDateTimeStringConverter); + putAllConverter(new InstantStringConverter(localDateTimeStringConverter)); putAllConverter(new DoubleBooleanConverter()); putAllConverter(new DoubleNumberConverter()); @@ -124,7 +131,9 @@ public class DefaultConverterLoader { putWriteConverter(new BooleanBooleanConverter()); putWriteConverter(new ByteNumberConverter()); putWriteConverter(new DateDateConverter()); - putWriteConverter(new LocalDateTimeDateConverter()); + LocalDateTimeDateConverter localDateTimeDateConverter = new LocalDateTimeDateConverter(); + putWriteConverter(localDateTimeDateConverter); + putWriteConverter(new InstantDateConverter(localDateTimeDateConverter)); putWriteConverter(new LocalDateDateConverter()); putWriteConverter(new DoubleNumberConverter()); putWriteConverter(new FloatNumberConverter()); @@ -145,7 +154,9 @@ public class DefaultConverterLoader { putWriteStringConverter(new ByteStringConverter()); putWriteStringConverter(new DateStringConverter()); putWriteStringConverter(new LocalDateStringConverter()); - putWriteStringConverter(new LocalDateTimeStringConverter()); + LocalDateTimeStringConverter localDateTimeStringConverter = new LocalDateTimeStringConverter(); + putWriteStringConverter(localDateTimeStringConverter); + putWriteStringConverter(new InstantStringConverter(localDateTimeStringConverter)); putWriteStringConverter(new DoubleStringConverter()); putWriteStringConverter(new FloatStringConverter()); putWriteStringConverter(new IntegerStringConverter()); diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/converters/instant/InstantDateConverter.java b/easyexcel-core/src/main/java/com/alibaba/excel/converters/instant/InstantDateConverter.java new file mode 100644 index 00000000..fa6711cb --- /dev/null +++ b/easyexcel-core/src/main/java/com/alibaba/excel/converters/instant/InstantDateConverter.java @@ -0,0 +1,38 @@ +package com.alibaba.excel.converters.instant; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.converters.localdatetime.LocalDateTimeDateConverter; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; + +/** + * Instant and date converter + * delegate LocalDateTimeDateConverter + * + * @author gongxuanzhang + */ +public class InstantDateConverter implements Converter { + + private final LocalDateTimeDateConverter delegate; + + public InstantDateConverter(LocalDateTimeDateConverter delegate) { + this.delegate = delegate; + } + + @Override + public Class supportJavaTypeKey() { + return Instant.class; + } + + @Override + public WriteCellData convertToExcelData(Instant value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) throws Exception { + LocalDateTime delegateTime = LocalDateTime.ofInstant(value, ZoneId.systemDefault()); + return delegate.convertToExcelData(delegateTime, contentProperty, globalConfiguration); + } +} diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/converters/instant/InstantNumberConverter.java b/easyexcel-core/src/main/java/com/alibaba/excel/converters/instant/InstantNumberConverter.java new file mode 100644 index 00000000..6741f6b6 --- /dev/null +++ b/easyexcel-core/src/main/java/com/alibaba/excel/converters/instant/InstantNumberConverter.java @@ -0,0 +1,53 @@ +package com.alibaba.excel.converters.instant; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.converters.localdatetime.LocalDateTimeNumberConverter; +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; + +/** + * instant and number converter + * decorate LocalDateTimeNumber + * + * @author gongxuanzhangmelt@gmail.com + */ +public class InstantNumberConverter implements Converter { + + private final LocalDateTimeNumberConverter delegateConverter; + + public InstantNumberConverter(LocalDateTimeNumberConverter delegateConverter) { + this.delegateConverter = delegateConverter; + } + + @Override + public Class supportJavaTypeKey() { + return Instant.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.NUMBER; + } + + @Override + public Instant convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + LocalDateTime localDateTime = delegateConverter.convertToJavaData(cellData, contentProperty, + globalConfiguration); + return localDateTime.atZone(ZoneId.systemDefault()).toInstant(); + } + + @Override + public WriteCellData convertToExcelData(Instant value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + LocalDateTime delegateTime = LocalDateTime.ofInstant(value, ZoneId.systemDefault()); + return delegateConverter.convertToExcelData(delegateTime, contentProperty, globalConfiguration); + } +} diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/converters/instant/InstantStringConverter.java b/easyexcel-core/src/main/java/com/alibaba/excel/converters/instant/InstantStringConverter.java new file mode 100644 index 00000000..f5e23747 --- /dev/null +++ b/easyexcel-core/src/main/java/com/alibaba/excel/converters/instant/InstantStringConverter.java @@ -0,0 +1,53 @@ +package com.alibaba.excel.converters.instant; + +import java.text.ParseException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.converters.localdatetime.LocalDateTimeStringConverter; +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; + +/** + * Instant and string converter + * delegate LocalDateTimeStringConverter + * + * @author gongxuanzhang + */ +public class InstantStringConverter implements Converter { + + private final LocalDateTimeStringConverter delegate; + + public InstantStringConverter(LocalDateTimeStringConverter localDateTimeStringConverter) { + delegate = localDateTimeStringConverter; + } + + @Override + public Class supportJavaTypeKey() { + return Instant.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public Instant convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) throws ParseException { + LocalDateTime localDateTime = delegate.convertToJavaData(cellData, contentProperty, globalConfiguration); + return localDateTime.atZone(ZoneId.systemDefault()).toInstant(); + } + + @Override + public WriteCellData convertToExcelData(Instant value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + LocalDateTime delegateTime = LocalDateTime.ofInstant(value, ZoneId.systemDefault()); + return delegate.convertToExcelData(delegateTime, contentProperty, globalConfiguration); + } +} diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/converter/ConverterDataListener.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/converter/ConverterDataListener.java index adb4b164..c2177b44 100644 --- a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/converter/ConverterDataListener.java +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/converter/ConverterDataListener.java @@ -33,6 +33,7 @@ public class ConverterDataListener extends AnalysisEventListener