From 6d670863e80c9ac22c6b62f183326d91759b83dc Mon Sep 17 00:00:00 2001 From: ugurtafrali Date: Tue, 7 Apr 2026 19:58:27 +0300 Subject: [PATCH 1/2] Fix custom converters not being inherited from parent write holders --- .../metadata/holder/AbstractWriteHolder.java | 17 ++++++++- .../sheet/converter/CustomConverterTest.java | 35 +++++++++++++++++++ .../converter/GlobalConverterWriteData.java | 34 ++++++++++++++++++ 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/GlobalConverterWriteData.java diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/metadata/holder/AbstractWriteHolder.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/metadata/holder/AbstractWriteHolder.java index e67aee334..be35c494e 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/metadata/holder/AbstractWriteHolder.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/metadata/holder/AbstractWriteHolder.java @@ -129,6 +129,11 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ */ private Boolean orderByIncludeColumn; + /** + * Custom converters for this holder + */ + private List> customConverterList; + /** * Write handler */ @@ -261,12 +266,22 @@ public AbstractWriteHolder(WriteBasicParameter writeBasicParameter, AbstractWrit // Set converterMap if (parentAbstractWriteHolder == null) { - setConverterMap(DefaultConverterLoader.loadDefaultWriteConverter()); + setConverterMap(new HashMap<>(DefaultConverterLoader.loadDefaultWriteConverter())); } else { setConverterMap(new HashMap<>(parentAbstractWriteHolder.getConverterMap())); + if (CollectionUtils.isNotEmpty(parentAbstractWriteHolder.getCustomConverterList())) { + for (Converter converter : parentAbstractWriteHolder.getCustomConverterList()) { + getConverterMap() + .put( + ConverterKeyBuild.buildKey( + converter.supportJavaTypeKey(), converter.supportExcelTypeKey()), + converter); + } + } } if (writeBasicParameter.getCustomConverterList() != null && !writeBasicParameter.getCustomConverterList().isEmpty()) { + this.customConverterList = writeBasicParameter.getCustomConverterList(); for (Converter converter : writeBasicParameter.getCustomConverterList()) { getConverterMap() .put( diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/CustomConverterTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/CustomConverterTest.java index 52714caad..9107bf6f2 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/CustomConverterTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/CustomConverterTest.java @@ -30,6 +30,7 @@ import org.apache.fesod.sheet.converters.ConverterKeyBuild; import org.apache.fesod.sheet.util.TestFileUtil; import org.apache.fesod.sheet.write.builder.ExcelWriterSheetBuilder; +import org.apache.fesod.sheet.write.metadata.holder.WriteSheetHolder; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.MethodOrderer; @@ -42,12 +43,16 @@ public class CustomConverterTest { private static File converterCsvFile10; private static File converterExcelFile11; private static File converterExcelFile12; + private static File converterExcelFile13; + private static File converterCsvFile14; @BeforeAll static void init() { converterCsvFile10 = TestFileUtil.createNewFile("converter10.csv"); converterExcelFile11 = TestFileUtil.createNewFile("converter11.xls"); converterExcelFile12 = TestFileUtil.createNewFile("converter12.xlsx"); + converterExcelFile13 = TestFileUtil.createNewFile("converter13.xlsx"); + converterCsvFile14 = TestFileUtil.createNewFile("converter14.csv"); } @Test @@ -83,6 +88,28 @@ void t04Write12() throws Exception { writeFile(converterExcelFile12); } + @Test + void t05GlobalConverterInSheetHolder() throws Exception { + TimestampStringConverter timestampStringConverter = new TimestampStringConverter(); + ExcelWriter excelWriter = FesodSheet.write(converterExcelFile13) + .registerConverter(timestampStringConverter) + .build(); + excelWriter.write(data(), new ExcelWriterSheetBuilder().sheetNo(0).build()); + WriteSheetHolder sheetHolder = excelWriter.writeContext().writeSheetHolder(); + Map> sheetConverterMap = sheetHolder.converterMap(); + excelWriter.finish(); + Assertions.assertTrue(sheetConverterMap.containsKey(ConverterKeyBuild.buildKey( + timestampStringConverter.supportJavaTypeKey(), timestampStringConverter.supportExcelTypeKey()))); + } + + @Test + void t06GlobalConverterWriteWithoutAnnotation() throws Exception { + FesodSheet.write(converterCsvFile14) + .registerConverter(new TimestampStringConverter()) + .sheet() + .doWrite(globalData()); + } + private void writeFile(File file) throws Exception { FesodSheet.write(file) .registerConverter(new TimestampNumberConverter()) @@ -91,6 +118,14 @@ private void writeFile(File file) throws Exception { .doWrite(data()); } + private List globalData() throws Exception { + List list = new ArrayList<>(); + GlobalConverterWriteData writeData = new GlobalConverterWriteData(); + writeData.setTimestampData(Timestamp.valueOf("2020-01-01 01:00:00")); + list.add(writeData); + return list; + } + private List data() throws Exception { List list = new ArrayList<>(); CustomConverterWriteData writeData = new CustomConverterWriteData(); diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/GlobalConverterWriteData.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/GlobalConverterWriteData.java new file mode 100644 index 000000000..c13f7fbec --- /dev/null +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/GlobalConverterWriteData.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.fesod.sheet.converter; + +import java.sql.Timestamp; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import org.apache.fesod.sheet.annotation.ExcelProperty; + +@Getter +@Setter +@EqualsAndHashCode +public class GlobalConverterWriteData { + @ExcelProperty("时间戳-字符串") + private Timestamp timestampData; +} From d791ba55b2cac6395eb4c5980e3071a14f937470 Mon Sep 17 00:00:00 2001 From: ugurtafrali Date: Fri, 10 Apr 2026 00:43:10 +0300 Subject: [PATCH 2/2] Address review feedback --- .../org/apache/fesod/sheet/converter/CustomConverterTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/CustomConverterTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/CustomConverterTest.java index 9107bf6f2..2c7801c56 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/CustomConverterTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/CustomConverterTest.java @@ -103,7 +103,7 @@ void t05GlobalConverterInSheetHolder() throws Exception { } @Test - void t06GlobalConverterWriteWithoutAnnotation() throws Exception { + void t06GlobalConverterWriteWithoutFieldLevelConverter() throws Exception { FesodSheet.write(converterCsvFile14) .registerConverter(new TimestampStringConverter()) .sheet()