diff --git a/fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/AutoMessageSource.java b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/AutoMessageSource.java new file mode 100644 index 000000000..e00612ecd --- /dev/null +++ b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/AutoMessageSource.java @@ -0,0 +1,55 @@ +/* + * 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.excel.demo.read; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import org.apache.fesod.excel.i18n.ExcelMessageSource; + +/** + * AutoMessageSource + * + * @author GGBOUD + * @date 2025/10/20 + */ +public class AutoMessageSource implements ExcelMessageSource { + private static final Map> MESSAGE_MAP = new HashMap<>(); + + @Override + public String resolveCode(String code, Locale locale) { + Map localeMap = MESSAGE_MAP.get(code); + if (localeMap == null) { + return code; + } else { + String message = localeMap.get(locale); + return message == null ? code : message; + } + } + + @Override + public void addMessage(String code, Locale locale, String msg) { + MESSAGE_MAP.computeIfAbsent(code, (key) -> new HashMap<>(4)).put(locale, msg); + } + + public void addMessages(Map messages, Locale locale) { + messages.forEach((code, msg) -> addMessage(code, locale, msg)); + } +} diff --git a/fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/Il8nHeadDemoDataListener.java b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/Il8nHeadDemoDataListener.java new file mode 100644 index 000000000..aae5079cd --- /dev/null +++ b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/Il8nHeadDemoDataListener.java @@ -0,0 +1,52 @@ +/* + * 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.excel.demo.read; + +import com.alibaba.fastjson2.JSON; +import lombok.extern.slf4j.Slf4j; +import org.apache.fesod.excel.context.AnalysisContext; +import org.apache.fesod.excel.read.listener.ReadListener; + +/** + * Il8nHeadDemoDataListener + * + * @author GGBOUD + * @date 2025/10/20 + */ +@Slf4j +public class Il8nHeadDemoDataListener implements ReadListener { + + public Il8nHeadDemoDataListener() {} + + @Override + public void invoke(Il8nZhHeadDemoData data, AnalysisContext context) { + log.info("Parsed one row of data: {}", JSON.toJSONString(data)); + } + + /** + * doAfterAllAnalysed + * + * @param context + */ + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + log.info("All data has been parsed!"); + } +} diff --git a/fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/Il8nZhHeadDemoData.java b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/Il8nZhHeadDemoData.java new file mode 100644 index 000000000..414def059 --- /dev/null +++ b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/Il8nZhHeadDemoData.java @@ -0,0 +1,48 @@ +/* + * 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.excel.demo.read; + +import java.util.Date; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import org.apache.fesod.excel.annotation.ExcelProperty; + +/** + * 基础数据类.这里的排序和excel里面的排序一致 + * + * + **/ +@Getter +@Setter +@EqualsAndHashCode +public class Il8nZhHeadDemoData { + @ExcelProperty(value = {"head.str"}) + private String string; + + @ExcelProperty(value = {"head.date"}) + private Date date; + + @ExcelProperty(value = {"head.doubleData"}) + private Double doubleData; + + @ExcelProperty(value = {"head.str1"}) + private String string1; +} diff --git a/fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/ReadTest.java b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/ReadTest.java index 01395b29e..12fda6402 100644 --- a/fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/ReadTest.java +++ b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/ReadTest.java @@ -22,6 +22,7 @@ import com.alibaba.fastjson2.JSON; import java.io.File; import java.util.List; +import java.util.Locale; import java.util.Map; import lombok.extern.slf4j.Slf4j; import org.apache.fesod.excel.ExcelReader; @@ -44,8 +45,6 @@ /** * Common approaches for reading Excel files - * - * */ @Slf4j public class ReadTest { @@ -404,6 +403,47 @@ public void noModelRead() { FastExcel.read(fileName, new NoModelDataListener()).sheet().doRead(); } + /** + * Reading without creating objects + */ + @Test + public void il8nZhHeadRead() { + String fileName = TestFileUtil.getPath() + "demo" + File.separator + "il8n-head-demo-zh.xlsx"; + AutoMessageSource autoMessageSource = new AutoMessageSource(); + autoMessageSource.addMessage("head.str", Locale.CHINA, "这是个中文表头"); + autoMessageSource.addMessage("head.date", Locale.CHINA, "Date"); + autoMessageSource.addMessage("head.doubleData", Locale.CHINA, "Number"); + autoMessageSource.addMessage("head.str", Locale.US, "This is a English head"); + autoMessageSource.addMessage("head.date", Locale.US, "Date"); + autoMessageSource.addMessage("head.doubleData", Locale.US, "Number"); + FastExcel.read(fileName, Il8nZhHeadDemoData.class, new Il8nHeadDemoDataListener()) + .locale(Locale.CHINA) + .messageResource(autoMessageSource) + .sheet() + .doRead(); + } + + /** + * Reading without creating objects + */ + @Test + public void il8nUsHeadRead() { + String fileName = TestFileUtil.getPath() + "demo" + File.separator + "il8n-head-demo-us.xlsx"; + AutoMessageSource autoMessageSource = new AutoMessageSource(); + autoMessageSource.addMessage("head.str", Locale.CHINA, "这是个中文表头"); + autoMessageSource.addMessage("head.date", Locale.CHINA, "Date"); + autoMessageSource.addMessage("head.doubleData", Locale.CHINA, "Number"); + autoMessageSource.addMessage("head.str", Locale.US, "This is a English head"); + autoMessageSource.addMessage("head.date", Locale.US, "Date"); + autoMessageSource.addMessage("head.doubleData", Locale.US, "Number"); + autoMessageSource.addMessage("head.str1", Locale.US, "这是个中文表头1"); + FastExcel.read(fileName, Il8nZhHeadDemoData.class, new Il8nHeadDemoDataListener()) + .locale(Locale.US) + .messageResource(autoMessageSource) + .sheet() + .doRead(); + } + /** * Custom modification of CSV configuration */ diff --git a/fesod-examples/src/test/java/org/apache/fesod/excel/demo/write/WriteTest.java b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/write/WriteTest.java index 6ec7b6ea1..718e8b98f 100644 --- a/fesod-examples/src/test/java/org/apache/fesod/excel/demo/write/WriteTest.java +++ b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/write/WriteTest.java @@ -24,9 +24,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.Date; -import java.util.HashSet; import java.util.List; -import java.util.Set; import org.apache.fesod.excel.ExcelWriter; import org.apache.fesod.excel.FastExcel; import org.apache.fesod.excel.annotation.ExcelProperty; @@ -35,13 +33,10 @@ import org.apache.fesod.excel.annotation.write.style.ColumnWidth; import org.apache.fesod.excel.annotation.write.style.ContentRowHeight; import org.apache.fesod.excel.annotation.write.style.HeadRowHeight; +import org.apache.fesod.excel.demo.read.AutoMessageSource; +import org.apache.fesod.excel.demo.read.Il8nZhHeadDemoData; import org.apache.fesod.excel.enums.CellDataTypeEnum; -import org.apache.fesod.excel.metadata.data.CommentData; -import org.apache.fesod.excel.metadata.data.FormulaData; -import org.apache.fesod.excel.metadata.data.HyperlinkData; -import org.apache.fesod.excel.metadata.data.ImageData; -import org.apache.fesod.excel.metadata.data.RichTextStringData; -import org.apache.fesod.excel.metadata.data.WriteCellData; +import org.apache.fesod.excel.metadata.data.*; import org.apache.fesod.excel.util.BooleanUtils; import org.apache.fesod.excel.util.FileUtils; import org.apache.fesod.excel.util.ListUtils; @@ -58,12 +53,7 @@ import org.apache.fesod.excel.write.metadata.style.WriteFont; import org.apache.fesod.excel.write.style.HorizontalCellStyleStrategy; import org.apache.fesod.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.FillPatternType; -import org.apache.poi.ss.usermodel.IndexedColors; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.streaming.SXSSFSheet; import org.junit.jupiter.api.Test; @@ -780,6 +770,32 @@ public void afterSheetDispose(SheetWriteHandlerContext context) { System.out.println(fileName); } + @Test + public void sheetIl8nHeadWriteTest() { + List locales = new ArrayList<>(); + locales.add(Locale.CHINA); + locales.add(Locale.US); + AutoMessageSource autoMessageSource = new AutoMessageSource(); + autoMessageSource.addMessage("head.str", Locale.CHINA, "这是个中文表头"); + autoMessageSource.addMessage("head.str1", Locale.CHINA, "这是个中文表头2"); + autoMessageSource.addMessage("head.date", Locale.CHINA, "Date"); + autoMessageSource.addMessage("head.doubleData", Locale.CHINA, "Number"); + autoMessageSource.addMessage("head.str", Locale.US, "This is a English head"); + autoMessageSource.addMessage("head.date", Locale.US, "Date"); + autoMessageSource.addMessage("head.doubleData", Locale.US, "Number"); + autoMessageSource.addMessage("head.str1", Locale.US, "这是个中文表头1"); + for (Locale locale : locales) { + String fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + locale.getLanguage() + + ".xlsx"; + FastExcel.write(fileName, Il8nZhHeadDemoData.class) + .locale(locale) + .messageResource(autoMessageSource) + .sheet("模板") + .doWrite(this::Il8nHeadDemoDataList); + System.out.println(fileName); + } + } + private List dataLong() { List list = ListUtils.newArrayList(); for (int i = 0; i < 10; i++) { @@ -855,4 +871,17 @@ private List dataHex() { } return list; } + + private List Il8nHeadDemoDataList() { + List list = ListUtils.newArrayList(); + for (int i = 0; i < 10; i++) { + Il8nZhHeadDemoData data = new Il8nZhHeadDemoData(); + data.setString("STRING" + i); + data.setDate(new Date()); + data.setDoubleData(0.56); + data.setString1("测试000" + i); + list.add(data); + } + return list; + } } diff --git a/fesod-examples/src/test/resources/demo/il8n-head-demo-us.xlsx b/fesod-examples/src/test/resources/demo/il8n-head-demo-us.xlsx new file mode 100644 index 000000000..2703f92a5 Binary files /dev/null and b/fesod-examples/src/test/resources/demo/il8n-head-demo-us.xlsx differ diff --git a/fesod-examples/src/test/resources/demo/il8n-head-demo-zh.xlsx b/fesod-examples/src/test/resources/demo/il8n-head-demo-zh.xlsx new file mode 100644 index 000000000..7da6313fb Binary files /dev/null and b/fesod-examples/src/test/resources/demo/il8n-head-demo-zh.xlsx differ diff --git a/fesod/src/main/java/org/apache/fesod/excel/i18n/ExcelMessageSource.java b/fesod/src/main/java/org/apache/fesod/excel/i18n/ExcelMessageSource.java new file mode 100644 index 000000000..3ccd3c7a3 --- /dev/null +++ b/fesod/src/main/java/org/apache/fesod/excel/i18n/ExcelMessageSource.java @@ -0,0 +1,49 @@ +/* + * 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.excel.i18n; + +import java.util.Locale; + +/** + * ExcelMessageSource + * + * @author GGBOUD + * @date 2025/10/20 + */ +public interface ExcelMessageSource { + + /** + * resolveCode 转换code + * + * @param code + * @param locale + * @return + */ + String resolveCode(String code, Locale locale); + + /** + * addMessage 增加词条 + * + * @param code + * @param locale + * @param + */ + void addMessage(String code, Locale locale, String msg); +} diff --git a/fesod/src/main/java/org/apache/fesod/excel/metadata/AbstractHolder.java b/fesod/src/main/java/org/apache/fesod/excel/metadata/AbstractHolder.java index d8b56bc65..067e61f15 100644 --- a/fesod/src/main/java/org/apache/fesod/excel/metadata/AbstractHolder.java +++ b/fesod/src/main/java/org/apache/fesod/excel/metadata/AbstractHolder.java @@ -119,6 +119,7 @@ public AbstractHolder(BasicParameter basicParameter, AbstractHolder prentAbstrac } else { globalConfiguration.setFiledCacheLocation(basicParameter.getFiledCacheLocation()); } + globalConfiguration.setMessageSource(basicParameter.getMessageSource()); } @Override diff --git a/fesod/src/main/java/org/apache/fesod/excel/metadata/AbstractParameterBuilder.java b/fesod/src/main/java/org/apache/fesod/excel/metadata/AbstractParameterBuilder.java index 54eb7092f..43ced6e96 100644 --- a/fesod/src/main/java/org/apache/fesod/excel/metadata/AbstractParameterBuilder.java +++ b/fesod/src/main/java/org/apache/fesod/excel/metadata/AbstractParameterBuilder.java @@ -24,6 +24,7 @@ import java.util.Objects; import org.apache.fesod.excel.converters.Converter; import org.apache.fesod.excel.enums.CacheLocationEnum; +import org.apache.fesod.excel.i18n.ExcelMessageSource; import org.apache.fesod.excel.util.ListUtils; /** @@ -100,6 +101,16 @@ public T locale(Locale locale) { return self(); } + /** + * message resource + * + * @param excelMessageSource + * @return + */ + public T messageResource(ExcelMessageSource excelMessageSource) { + parameter().setMessageSource(excelMessageSource); + return self(); + } /** * The cache used when parsing fields such as head. *

diff --git a/fesod/src/main/java/org/apache/fesod/excel/metadata/BasicParameter.java b/fesod/src/main/java/org/apache/fesod/excel/metadata/BasicParameter.java index 747961453..de4c148de 100644 --- a/fesod/src/main/java/org/apache/fesod/excel/metadata/BasicParameter.java +++ b/fesod/src/main/java/org/apache/fesod/excel/metadata/BasicParameter.java @@ -26,6 +26,7 @@ import lombok.Setter; import org.apache.fesod.excel.converters.Converter; import org.apache.fesod.excel.enums.CacheLocationEnum; +import org.apache.fesod.excel.i18n.ExcelMessageSource; /** * Basic parameter @@ -81,6 +82,13 @@ public class BasicParameter { private CacheLocationEnum filedCacheLocation; /** * Automatic strip includes sheet name and content + * */ private Boolean autoStrip; + + /** + * Message source + * + */ + private ExcelMessageSource messageSource; } diff --git a/fesod/src/main/java/org/apache/fesod/excel/metadata/GlobalConfiguration.java b/fesod/src/main/java/org/apache/fesod/excel/metadata/GlobalConfiguration.java index 819437223..65dc3b664 100644 --- a/fesod/src/main/java/org/apache/fesod/excel/metadata/GlobalConfiguration.java +++ b/fesod/src/main/java/org/apache/fesod/excel/metadata/GlobalConfiguration.java @@ -24,6 +24,7 @@ import lombok.Getter; import lombok.Setter; import org.apache.fesod.excel.enums.CacheLocationEnum; +import org.apache.fesod.excel.i18n.ExcelMessageSource; /** * Global configuration @@ -70,6 +71,11 @@ public class GlobalConfiguration { * default is false */ private Boolean autoStrip; + /** + * Message source + * + */ + private ExcelMessageSource messageSource; public GlobalConfiguration() { this.autoTrim = Boolean.TRUE; @@ -78,5 +84,6 @@ public GlobalConfiguration() { this.locale = Locale.getDefault(); this.useScientificFormat = Boolean.FALSE; this.filedCacheLocation = CacheLocationEnum.THREAD_LOCAL; + this.messageSource = null; } } diff --git a/fesod/src/main/java/org/apache/fesod/excel/read/metadata/ReadWorkbook.java b/fesod/src/main/java/org/apache/fesod/excel/read/metadata/ReadWorkbook.java index b41c60a26..56a47e869 100644 --- a/fesod/src/main/java/org/apache/fesod/excel/read/metadata/ReadWorkbook.java +++ b/fesod/src/main/java/org/apache/fesod/excel/read/metadata/ReadWorkbook.java @@ -35,6 +35,7 @@ import org.apache.fesod.excel.enums.CellExtraTypeEnum; import org.apache.fesod.excel.enums.ReadDefaultReturnEnum; import org.apache.fesod.excel.event.AnalysisEventListener; +import org.apache.fesod.excel.i18n.ExcelMessageSource; import org.apache.fesod.excel.read.listener.ModelBuildEventListener; import org.apache.fesod.excel.support.ExcelTypeEnum; @@ -148,4 +149,9 @@ public class ReadWorkbook extends ReadBasicParameter { * Only work on the CSV file. */ private CSVFormat csvFormat; + + /** + * Excel message source + */ + private ExcelMessageSource messageSource; } diff --git a/fesod/src/main/java/org/apache/fesod/excel/read/metadata/holder/ReadWorkbookHolder.java b/fesod/src/main/java/org/apache/fesod/excel/read/metadata/holder/ReadWorkbookHolder.java index c6cf6ffed..28b17bcc8 100644 --- a/fesod/src/main/java/org/apache/fesod/excel/read/metadata/holder/ReadWorkbookHolder.java +++ b/fesod/src/main/java/org/apache/fesod/excel/read/metadata/holder/ReadWorkbookHolder.java @@ -39,6 +39,7 @@ import org.apache.fesod.excel.enums.ReadDefaultReturnEnum; import org.apache.fesod.excel.event.AnalysisEventListener; import org.apache.fesod.excel.exception.ExcelAnalysisException; +import org.apache.fesod.excel.i18n.ExcelMessageSource; import org.apache.fesod.excel.read.metadata.ReadSheet; import org.apache.fesod.excel.read.metadata.ReadWorkbook; import org.apache.fesod.excel.support.ExcelTypeEnum; @@ -153,6 +154,11 @@ public class ReadWorkbookHolder extends AbstractReadHolder { */ private Boolean ignoreHiddenSheet; + /** + * Excel message source + */ + private ExcelMessageSource messageSource; + public ReadWorkbookHolder(ReadWorkbook readWorkbook) { super(readWorkbook, null); this.readWorkbook = readWorkbook; @@ -214,6 +220,7 @@ public ReadWorkbookHolder(ReadWorkbook readWorkbook) { } this.hasReadSheet = new HashSet(); this.password = readWorkbook.getPassword(); + this.messageSource = readWorkbook.getMessageSource(); } @Override diff --git a/fesod/src/main/java/org/apache/fesod/excel/util/ClassUtils.java b/fesod/src/main/java/org/apache/fesod/excel/util/ClassUtils.java index 547b873db..eee854f19 100644 --- a/fesod/src/main/java/org/apache/fesod/excel/util/ClassUtils.java +++ b/fesod/src/main/java/org/apache/fesod/excel/util/ClassUtils.java @@ -22,23 +22,9 @@ import cn.idev.excel.support.cglib.beans.BeanMap; import java.lang.reflect.Field; import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.TreeMap; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.Setter; +import lombok.*; import org.apache.commons.collections4.CollectionUtils; import org.apache.fesod.excel.annotation.ExcelIgnore; import org.apache.fesod.excel.annotation.ExcelIgnoreUnannotated; @@ -50,14 +36,12 @@ import org.apache.fesod.excel.converters.AutoConverter; import org.apache.fesod.excel.converters.Converter; import org.apache.fesod.excel.exception.ExcelCommonException; +import org.apache.fesod.excel.i18n.ExcelMessageSource; import org.apache.fesod.excel.metadata.ConfigurationHolder; import org.apache.fesod.excel.metadata.FieldCache; import org.apache.fesod.excel.metadata.FieldWrapper; -import org.apache.fesod.excel.metadata.property.DateTimeFormatProperty; -import org.apache.fesod.excel.metadata.property.ExcelContentProperty; -import org.apache.fesod.excel.metadata.property.FontProperty; -import org.apache.fesod.excel.metadata.property.NumberFormatProperty; -import org.apache.fesod.excel.metadata.property.StyleProperty; +import org.apache.fesod.excel.metadata.GlobalConfiguration; +import org.apache.fesod.excel.metadata.property.*; import org.apache.fesod.excel.write.metadata.holder.WriteHolder; public class ClassUtils { @@ -327,7 +311,8 @@ private static FieldCache doDeclaredFields(Class clazz, ConfigurationHolder c if (ignoreSet.contains(fieldName)) { continue; } - declaredOneField(field, orderFieldMap, indexFieldMap, ignoreSet, excelIgnoreUnannotated); + declaredOneField( + field, orderFieldMap, indexFieldMap, ignoreSet, excelIgnoreUnannotated, configurationHolder); } Map sortedFieldMap = buildSortedAllFieldMap(orderFieldMap, indexFieldMap); FieldCache fieldCache = new FieldCache(sortedFieldMap, indexFieldMap); @@ -466,7 +451,8 @@ private static void declaredOneField( Map> orderFieldMap, Map indexFieldMap, Set ignoreSet, - ExcelIgnoreUnannotated excelIgnoreUnannotated) { + ExcelIgnoreUnannotated excelIgnoreUnannotated, + ConfigurationHolder configurationHolder) { String fieldName = FieldUtils.resolveCglibFieldName(field); // skip if the field is in ignoreSet if (ignoreSet.contains(fieldName)) { @@ -487,7 +473,7 @@ private static void declaredOneField( } // set heads if (excelProperty != null) { - fieldWrapper.setHeads(excelProperty.value()); + fieldWrapper.setHeads(getIl8nHeads(excelProperty.value(), configurationHolder.globalConfiguration())); } if (excelProperty != null && excelProperty.index() >= 0) { if (indexFieldMap.containsKey(excelProperty.index())) { @@ -585,4 +571,16 @@ public static void removeThreadLocalCache() { CLASS_CONTENT_THREAD_LOCAL.remove(); CONTENT_THREAD_LOCAL.remove(); } + + private static String[] getIl8nHeads(String[] heads, GlobalConfiguration globalConfiguration) { + ExcelMessageSource excelMessageSource = globalConfiguration.getMessageSource(); + if (Objects.isNull(heads) || heads.length == 0 || Objects.isNull(excelMessageSource)) { + return heads; + } + String[] il8nHeads = new String[heads.length]; + for (int i = 0; i < heads.length; i++) { + il8nHeads[i] = excelMessageSource.resolveCode(heads[i], globalConfiguration.getLocale()); + } + return il8nHeads; + } }