From 050579e3e49b251eaab0e36a661f052771ae9ec6 Mon Sep 17 00:00:00 2001 From: agrancaric Date: Wed, 29 Nov 2023 12:08:41 +0100 Subject: [PATCH] Add support for java.sql.Date and java.sql.Timestamp when writing to excel --- .../croz/nrich/excel/util/TypeDataFormatUtil.java | 8 ++++++-- .../converter/DefaultCellValueConverterTest.java | 2 ++ .../nrich/excel/util/TypeDataFormatUtilTest.java | 14 ++++++++------ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/nrich-excel/src/main/java/net/croz/nrich/excel/util/TypeDataFormatUtil.java b/nrich-excel/src/main/java/net/croz/nrich/excel/util/TypeDataFormatUtil.java index 189fb3da8..add33bd72 100644 --- a/nrich-excel/src/main/java/net/croz/nrich/excel/util/TypeDataFormatUtil.java +++ b/nrich-excel/src/main/java/net/croz/nrich/excel/util/TypeDataFormatUtil.java @@ -21,6 +21,7 @@ import java.math.BigDecimal; import java.math.BigInteger; +import java.sql.Timestamp; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; @@ -39,8 +40,9 @@ public final class TypeDataFormatUtil { private TypeDataFormatUtil() { } - public static List resolveTypeDataFormatList(String dateFormat, String dateTimeFormat, String integerNumberFormat, String decimalNumberFormat, boolean writeDateWithTime, - List additionalTypeDataFormatList) { + public static List resolveTypeDataFormatList( + String dateFormat, String dateTimeFormat, String integerNumberFormat, String decimalNumberFormat, boolean writeDateWithTime, List additionalTypeDataFormatList + ) { String resolvedDateTimeFormat = writeDateWithTime ? dateTimeFormat : dateFormat; List nonNullAdditionalDataFormatList = Optional.ofNullable(additionalTypeDataFormatList).orElse(Collections.emptyList()); @@ -49,9 +51,11 @@ public static List resolveTypeDataFormatList(String dateFormat, new TypeDataFormat(Date.class, dateFormat), new TypeDataFormat(Instant.class, dateFormat), new TypeDataFormat(LocalDate.class, dateFormat), + new TypeDataFormat(java.sql.Date.class, dateFormat), new TypeDataFormat(LocalDateTime.class, resolvedDateTimeFormat), new TypeDataFormat(ZonedDateTime.class, resolvedDateTimeFormat), new TypeDataFormat(OffsetDateTime.class, resolvedDateTimeFormat), + new TypeDataFormat(Timestamp.class, resolvedDateTimeFormat), new TypeDataFormat(Short.class, integerNumberFormat), new TypeDataFormat(Integer.class, integerNumberFormat), new TypeDataFormat(Long.class, integerNumberFormat), diff --git a/nrich-excel/src/test/java/net/croz/nrich/excel/converter/DefaultCellValueConverterTest.java b/nrich-excel/src/test/java/net/croz/nrich/excel/converter/DefaultCellValueConverterTest.java index db7058b12..276919143 100644 --- a/nrich-excel/src/test/java/net/croz/nrich/excel/converter/DefaultCellValueConverterTest.java +++ b/nrich-excel/src/test/java/net/croz/nrich/excel/converter/DefaultCellValueConverterTest.java @@ -25,6 +25,7 @@ import org.springframework.context.support.ResourceBundleMessageSource; import java.math.BigDecimal; +import java.sql.Timestamp; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; @@ -70,6 +71,7 @@ private static Stream shouldReturnTrueIfConversionIsSupportedMethodSo arguments(LocalDateTime.now(), true), arguments(OffsetDateTime.now(), true), arguments(ZonedDateTime.now(), true), + arguments(new Timestamp(System.currentTimeMillis()), true), arguments((short) 1, true), arguments(1, true), arguments(1L, true), diff --git a/nrich-excel/src/test/java/net/croz/nrich/excel/util/TypeDataFormatUtilTest.java b/nrich-excel/src/test/java/net/croz/nrich/excel/util/TypeDataFormatUtilTest.java index 9ee6530e2..8a2cb66ae 100644 --- a/nrich-excel/src/test/java/net/croz/nrich/excel/util/TypeDataFormatUtilTest.java +++ b/nrich-excel/src/test/java/net/croz/nrich/excel/util/TypeDataFormatUtilTest.java @@ -22,6 +22,7 @@ import java.math.BigDecimal; import java.math.BigInteger; +import java.sql.Timestamp; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; @@ -48,11 +49,11 @@ void shouldReturnTypeDataFormatList() { // then assertThat(formatList).extracting("type").containsExactly( - Date.class, Instant.class, LocalDate.class, LocalDateTime.class, ZonedDateTime.class, OffsetDateTime.class, + Date.class, Instant.class, LocalDate.class, java.sql.Date.class, LocalDateTime.class, ZonedDateTime.class, OffsetDateTime.class, Timestamp.class, Short.class, Integer.class, Long.class, BigInteger.class, Float.class, Double.class, BigDecimal.class ); assertThat(formatList).extracting("dataFormat").containsExactly( - dateFormat, dateFormat, dateFormat, dateTimeFormat, dateTimeFormat, dateTimeFormat, + dateFormat, dateFormat, dateFormat, dateFormat, dateTimeFormat, dateTimeFormat, dateTimeFormat, dateTimeFormat, integerFormat, integerFormat, integerFormat, integerFormat, decimalFormat, decimalFormat, decimalFormat ); } @@ -78,15 +79,16 @@ void shouldReturnDateFormatWithTimeWhenEnabled() { @Test void shouldAllowForAdditionalFormatsToBeSpecified() { // given - String dateFormat = "dd/MM/yyyy"; - List overriddenFormatList = Collections.singletonList(new TypeDataFormat(java.sql.Date.class, dateFormat)); + Class additionalClass = Object.class; + String dataFormat = "dd/MM/yyyy"; + List overriddenFormatList = Collections.singletonList(new TypeDataFormat(additionalClass, dataFormat)); // when List formatList = TypeDataFormatUtil.resolveTypeDataFormatList("dd.MM.yyyy.", "dd.MM.yyyy. HH:mm", "#,##0", "#,##0.00", true, overriddenFormatList); - TypeDataFormat dateTypeDataFormat = formatList.stream().filter(typeDataFormat -> java.sql.Date.class.equals(typeDataFormat.getType())).findFirst().orElse(null); + TypeDataFormat dateTypeDataFormat = formatList.stream().filter(typeDataFormat -> additionalClass.equals(typeDataFormat.getType())).findFirst().orElse(null); // then assertThat(dateTypeDataFormat).isNotNull(); - assertThat(dateTypeDataFormat.getDataFormat()).isEqualTo(dateFormat); + assertThat(dateTypeDataFormat.getDataFormat()).isEqualTo(dataFormat); } }