From 6e57362e8df5c98c7a6cc7ccd9b0ce75ceb10811 Mon Sep 17 00:00:00 2001 From: cixing <296665628@qq.com> Date: Mon, 20 Oct 2025 12:15:04 +0800 Subject: [PATCH 01/19] feat: head international --- .../demo/read/Il8nHeadDemoDataListener.java | 56 +++++++++++++++ .../excel/demo/read/Il8nZhHeadDemoData.java | 46 ++++++++++++ .../fesod/excel/demo/read/ReadTest.java | 51 ++++++++++++-- .../fesod/excel/demo/write/WriteTest.java | 66 ++++++++++++------ .../resources/demo/il8n-head-demo-us.xlsx | Bin 0 -> 10617 bytes .../resources/demo/il8n-head-demo-zh.xlsx | Bin 0 -> 10443 bytes .../fesod/excel/il8n/AutoMessageSource.java | 40 +++++++++++ .../fesod/excel/il8n/ExcelMessageSource.java | 31 ++++++++ .../fesod/excel/metadata/AbstractHolder.java | 1 + .../metadata/AbstractParameterBuilder.java | 11 +++ .../fesod/excel/metadata/BasicParameter.java | 7 ++ .../excel/metadata/GlobalConfiguration.java | 7 +- .../excel/read/metadata/ReadWorkbook.java | 6 ++ .../metadata/holder/ReadWorkbookHolder.java | 8 +++ .../apache/fesod/excel/util/ClassUtils.java | 52 +++++++------- pom.xml | 5 ++ 16 files changed, 332 insertions(+), 55 deletions(-) create mode 100644 fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/Il8nHeadDemoDataListener.java create mode 100644 fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/Il8nZhHeadDemoData.java create mode 100644 fesod-examples/src/test/resources/demo/il8n-head-demo-us.xlsx create mode 100644 fesod-examples/src/test/resources/demo/il8n-head-demo-zh.xlsx create mode 100644 fesod/src/main/java/org/apache/fesod/excel/il8n/AutoMessageSource.java create mode 100644 fesod/src/main/java/org/apache/fesod/excel/il8n/ExcelMessageSource.java 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..7c5aba048 --- /dev/null +++ b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/Il8nHeadDemoDataListener.java @@ -0,0 +1,56 @@ +/* + * 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..2ba3b7b32 --- /dev/null +++ b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/Il8nZhHeadDemoData.java @@ -0,0 +1,46 @@ +/* + * 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 lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import org.apache.fesod.excel.annotation.ExcelProperty; + +import java.util.Date; + +/** + * 基础数据类.这里的排序和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..0ea44bd8b 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 @@ -20,9 +20,6 @@ package org.apache.fesod.excel.demo.read; import com.alibaba.fastjson2.JSON; -import java.io.File; -import java.util.List; -import java.util.Map; import lombok.extern.slf4j.Slf4j; import org.apache.fesod.excel.ExcelReader; import org.apache.fesod.excel.FastExcel; @@ -32,6 +29,7 @@ import org.apache.fesod.excel.context.AnalysisContext; import org.apache.fesod.excel.converters.DefaultConverterLoader; import org.apache.fesod.excel.enums.CellExtraTypeEnum; +import org.apache.fesod.excel.il8n.AutoMessageSource; import org.apache.fesod.excel.read.listener.PageReadListener; import org.apache.fesod.excel.read.listener.ReadListener; import org.apache.fesod.excel.read.metadata.ReadSheet; @@ -42,10 +40,13 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import java.io.File; +import java.util.List; +import java.util.Locale; +import java.util.Map; + /** * Common approaches for reading Excel files - * - * */ @Slf4j public class ReadTest { @@ -127,7 +128,7 @@ private void saveData() { fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx"; // One reader per file try (ExcelReader excelReader = - FastExcel.read(fileName, DemoData.class, new DemoDataListener()).build()) { + FastExcel.read(fileName, DemoData.class, new DemoDataListener()).build()) { // Build a sheet. You can specify the name or index. ReadSheet readSheet = FastExcel.readSheet(0).build(); readSheet.setNumRows(2); @@ -404,6 +405,41 @@ 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 */ @@ -446,7 +482,8 @@ public void invoke(DemoChainAccessorsData data, AnalysisContext context) { } @Override - public void doAfterAllAnalysed(AnalysisContext context) {} + public void doAfterAllAnalysed(AnalysisContext context) { + } }) .build()) { excelReader.readAll(); 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..d58f4435d 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 @@ -19,14 +19,6 @@ package org.apache.fesod.excel.demo.write; -import java.io.File; -import java.io.InputStream; -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 +27,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.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.il8n.AutoMessageSource; +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,16 +47,16 @@ 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; +import java.io.File; +import java.io.InputStream; +import java.net.URL; +import java.util.*; + /** * 写的常见写法 * @@ -779,7 +768,31 @@ public void afterSheetDispose(SheetWriteHandlerContext context) { .doWrite(this::data); 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 +868,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 0000000000000000000000000000000000000000..2703f92a5f7c53e5a453e89fdad82b98a15e3054 GIT binary patch literal 10617 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 literal 0 HcmV?d00001 diff --git a/fesod/src/main/java/org/apache/fesod/excel/il8n/AutoMessageSource.java b/fesod/src/main/java/org/apache/fesod/excel/il8n/AutoMessageSource.java new file mode 100644 index 000000000..f928e8703 --- /dev/null +++ b/fesod/src/main/java/org/apache/fesod/excel/il8n/AutoMessageSource.java @@ -0,0 +1,40 @@ +package org.apache.fesod.excel.il8n; + +import org.springframework.util.Assert; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +/** + * ExcelMessageSource + * + * @author GGBOUD + * @date 2025/10/20 + */ +public class AutoMessageSource implements ExcelMessageSource { + private final static 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) { + Assert.notNull(code, "Code must not be null"); + Assert.notNull(locale, "Locale must not be null"); + Assert.notNull(msg, "Message must not be null"); + MESSAGE_MAP.computeIfAbsent(code, (key) -> new HashMap<>(4)).put(locale, msg); + } + + public void addMessages(Map messages, Locale locale) { + Assert.notNull(messages, "Messages Map must not be null"); + messages.forEach((code, msg) -> addMessage(code, locale, msg)); + } +} diff --git a/fesod/src/main/java/org/apache/fesod/excel/il8n/ExcelMessageSource.java b/fesod/src/main/java/org/apache/fesod/excel/il8n/ExcelMessageSource.java new file mode 100644 index 000000000..b7c39337a --- /dev/null +++ b/fesod/src/main/java/org/apache/fesod/excel/il8n/ExcelMessageSource.java @@ -0,0 +1,31 @@ +package org.apache.fesod.excel.il8n; + +import java.util.Locale; + +/** + * IExcelMessageSource + * + * @author GGBOUD + * @date 2025/10/20 + */ +public interface ExcelMessageSource { + + /** + * resolveCode 转换code + * + * @param code String + * @param locale Locale + * @return String + */ + String resolveCode(String code, Locale locale); + + + /** + * addMessage 增加词条 + * + * @param code String + * @param locale Locale + * @param msg String + */ + 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..b592b1f67 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.il8n.ExcelMessageSource; import org.apache.fesod.excel.util.ListUtils; /** @@ -100,6 +101,16 @@ public T locale(Locale locale) { return self(); } + /** + * message resource + * + * @param excelMessageSource ExcelMessageSource + * @return T + */ + 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..adcfd7a50 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.il8n.ExcelMessageSource; /** * Basic parameter @@ -83,4 +84,10 @@ public class BasicParameter { * 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..4cf549e02 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.il8n.ExcelMessageSource; /** * Global configuration @@ -70,7 +71,10 @@ public class GlobalConfiguration { * default is false */ private Boolean autoStrip; - + /** + * Message source + */ + private ExcelMessageSource messageSource; public GlobalConfiguration() { this.autoTrim = Boolean.TRUE; this.autoStrip = Boolean.FALSE; @@ -78,5 +82,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..827a2d1a6 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.il8n.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..a570cf9d9 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.il8n.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,12 @@ 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 +221,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..e199b041d 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 @@ -20,25 +20,7 @@ package org.apache.fesod.excel.util; 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.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,16 +32,19 @@ 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.il8n.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; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + public class ClassUtils { /** @@ -327,7 +312,7 @@ 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; + } } diff --git a/pom.xml b/pom.xml index d7bbb49c2..cb20e9715 100644 --- a/pom.xml +++ b/pom.xml @@ -215,6 +215,11 @@ spring-boot-starter-web ${spring-boot-starter-web.version} + + org.springframework.boot + spring-boot-starter-validation + ${spring-boot-starter-web.version} + org.mock-server mockserver-netty From d28583968c2ff667c7856023be3be356530b5ae5 Mon Sep 17 00:00:00 2001 From: cixing <296665628@qq.com> Date: Mon, 20 Oct 2025 12:18:35 +0800 Subject: [PATCH 02/19] feat: head international --- pom.xml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pom.xml b/pom.xml index cb20e9715..d7bbb49c2 100644 --- a/pom.xml +++ b/pom.xml @@ -215,11 +215,6 @@ spring-boot-starter-web ${spring-boot-starter-web.version} - - org.springframework.boot - spring-boot-starter-validation - ${spring-boot-starter-web.version} - org.mock-server mockserver-netty From ca5e74d30cd4fd766e6a4154d018aaeba5d5a2a5 Mon Sep 17 00:00:00 2001 From: cixing <296665628@qq.com> Date: Tue, 21 Oct 2025 09:35:29 +0800 Subject: [PATCH 03/19] feat: head international --- .../apache/fesod/excel/demo/read}/AutoMessageSource.java | 9 +++------ .../java/org/apache/fesod/excel/demo/read/ReadTest.java | 1 - .../org/apache/fesod/excel/demo/write/WriteTest.java | 2 +- 3 files changed, 4 insertions(+), 8 deletions(-) rename {fesod/src/main/java/org/apache/fesod/excel/il8n => fesod-examples/src/test/java/org/apache/fesod/excel/demo/read}/AutoMessageSource.java (75%) diff --git a/fesod/src/main/java/org/apache/fesod/excel/il8n/AutoMessageSource.java b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/AutoMessageSource.java similarity index 75% rename from fesod/src/main/java/org/apache/fesod/excel/il8n/AutoMessageSource.java rename to fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/AutoMessageSource.java index f928e8703..d67e74591 100644 --- a/fesod/src/main/java/org/apache/fesod/excel/il8n/AutoMessageSource.java +++ b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/AutoMessageSource.java @@ -1,6 +1,6 @@ -package org.apache.fesod.excel.il8n; +package org.apache.fesod.excel.demo.read; -import org.springframework.util.Assert; +import org.apache.fesod.excel.il8n.ExcelMessageSource; import java.util.HashMap; import java.util.Locale; @@ -25,16 +25,13 @@ public String resolveCode(String code, Locale locale) { return message == null ? code : message; } } + @Override public void addMessage(String code, Locale locale, String msg) { - Assert.notNull(code, "Code must not be null"); - Assert.notNull(locale, "Locale must not be null"); - Assert.notNull(msg, "Message must not be null"); MESSAGE_MAP.computeIfAbsent(code, (key) -> new HashMap<>(4)).put(locale, msg); } public void addMessages(Map messages, Locale locale) { - Assert.notNull(messages, "Messages Map must not be null"); messages.forEach((code, msg) -> addMessage(code, locale, msg)); } } 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 0ea44bd8b..bd58681ed 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 @@ -29,7 +29,6 @@ import org.apache.fesod.excel.context.AnalysisContext; import org.apache.fesod.excel.converters.DefaultConverterLoader; import org.apache.fesod.excel.enums.CellExtraTypeEnum; -import org.apache.fesod.excel.il8n.AutoMessageSource; import org.apache.fesod.excel.read.listener.PageReadListener; import org.apache.fesod.excel.read.listener.ReadListener; import org.apache.fesod.excel.read.metadata.ReadSheet; 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 d58f4435d..1588eb5c0 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 @@ -29,7 +29,7 @@ import org.apache.fesod.excel.annotation.write.style.HeadRowHeight; import org.apache.fesod.excel.demo.read.Il8nZhHeadDemoData; import org.apache.fesod.excel.enums.CellDataTypeEnum; -import org.apache.fesod.excel.il8n.AutoMessageSource; +import org.apache.fesod.excel.demo.read.AutoMessageSource; import org.apache.fesod.excel.metadata.data.*; import org.apache.fesod.excel.util.BooleanUtils; import org.apache.fesod.excel.util.FileUtils; From 87a57792a6e89351a02cabb81e62413938ee6c2d Mon Sep 17 00:00:00 2001 From: cixing <296665628@qq.com> Date: Tue, 21 Oct 2025 09:55:24 +0800 Subject: [PATCH 04/19] feat: head international --- .../java/org/apache/fesod/excel/il8n/ExcelMessageSource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fesod/src/main/java/org/apache/fesod/excel/il8n/ExcelMessageSource.java b/fesod/src/main/java/org/apache/fesod/excel/il8n/ExcelMessageSource.java index b7c39337a..11de44d8f 100644 --- a/fesod/src/main/java/org/apache/fesod/excel/il8n/ExcelMessageSource.java +++ b/fesod/src/main/java/org/apache/fesod/excel/il8n/ExcelMessageSource.java @@ -3,7 +3,7 @@ import java.util.Locale; /** - * IExcelMessageSource + * ExcelMessageSource * * @author GGBOUD * @date 2025/10/20 From cf030d304f3c21f0e174294039e4aa53e5a66428 Mon Sep 17 00:00:00 2001 From: cixing <296665628@qq.com> Date: Tue, 21 Oct 2025 10:06:48 +0800 Subject: [PATCH 05/19] feat: head international --- .../org/apache/fesod/excel/demo/read/AutoMessageSource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index d67e74591..1245722d7 100644 --- 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 @@ -7,7 +7,7 @@ import java.util.Map; /** - * ExcelMessageSource + * AutoMessageSource * * @author GGBOUD * @date 2025/10/20 From c55b63f71470edd59b660101986163fdc6a65572 Mon Sep 17 00:00:00 2001 From: cixing <296665628@qq.com> Date: Tue, 21 Oct 2025 10:44:42 +0800 Subject: [PATCH 06/19] =?UTF-8?q?feat:=20head=20international=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0license=20header?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../excel/demo/read/AutoMessageSource.java | 18 ++++++++++++++++++ .../fesod/excel/il8n/ExcelMessageSource.java | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) 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 index 1245722d7..c7c9d11eb 100644 --- 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 @@ -1,3 +1,21 @@ +/* + * 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 org.apache.fesod.excel.il8n.ExcelMessageSource; diff --git a/fesod/src/main/java/org/apache/fesod/excel/il8n/ExcelMessageSource.java b/fesod/src/main/java/org/apache/fesod/excel/il8n/ExcelMessageSource.java index 11de44d8f..8697cfa59 100644 --- a/fesod/src/main/java/org/apache/fesod/excel/il8n/ExcelMessageSource.java +++ b/fesod/src/main/java/org/apache/fesod/excel/il8n/ExcelMessageSource.java @@ -1,3 +1,21 @@ +/* + * 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.il8n; import java.util.Locale; From 26315794c63ef490cd4f084a297fb2dc6ef12220 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=90=E5=B0=8F=E5=AD=90?= <41484097+GGBOUNDBOY@users.noreply.github.com> Date: Tue, 21 Oct 2025 14:19:05 +0800 Subject: [PATCH 07/19] Update fesod/src/main/java/org/apache/fesod/excel/util/ClassUtils.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- fesod/src/main/java/org/apache/fesod/excel/util/ClassUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e199b041d..af7bb91f5 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 @@ -20,7 +20,7 @@ package org.apache.fesod.excel.util; import cn.idev.excel.support.cglib.beans.BeanMap; -import lombok.*; +// Lombok imports replaced with explicit imports below. import org.apache.commons.collections4.CollectionUtils; import org.apache.fesod.excel.annotation.ExcelIgnore; import org.apache.fesod.excel.annotation.ExcelIgnoreUnannotated; From dd04b9bb86cc668b35a5e67d1bcb4363f954f893 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=90=E5=B0=8F=E5=AD=90?= <41484097+GGBOUNDBOY@users.noreply.github.com> Date: Tue, 21 Oct 2025 14:19:27 +0800 Subject: [PATCH 08/19] Update fesod/src/main/java/org/apache/fesod/excel/util/ClassUtils.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../src/main/java/org/apache/fesod/excel/util/ClassUtils.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 af7bb91f5..9cb01cc80 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 @@ -37,8 +37,7 @@ import org.apache.fesod.excel.metadata.FieldCache; import org.apache.fesod.excel.metadata.FieldWrapper; import org.apache.fesod.excel.metadata.GlobalConfiguration; -import org.apache.fesod.excel.metadata.property.*; -import org.apache.fesod.excel.write.metadata.holder.WriteHolder; +import org.apache.fesod.excel.metadata.property.ExcelContentProperty; import java.lang.reflect.Field; import java.lang.reflect.Modifier; From e28ca452ae2ecdfe20a24aa62cadbfa71470494d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=90=E5=B0=8F=E5=AD=90?= <41484097+GGBOUNDBOY@users.noreply.github.com> Date: Tue, 21 Oct 2025 14:19:55 +0800 Subject: [PATCH 09/19] Update fesod/src/main/java/org/apache/fesod/excel/util/ClassUtils.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/org/apache/fesod/excel/util/ClassUtils.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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 9cb01cc80..5d5f617ed 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 @@ -41,7 +41,14 @@ import java.lang.reflect.Field; import java.lang.reflect.Modifier; -import java.util.*; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; public class ClassUtils { From 7101178223724ca0e0d6ef8405315a19282c76d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=90=E5=B0=8F=E5=AD=90?= <41484097+GGBOUNDBOY@users.noreply.github.com> Date: Tue, 21 Oct 2025 14:21:20 +0800 Subject: [PATCH 10/19] Update fesod/src/main/java/org/apache/fesod/excel/il8n/ExcelMessageSource.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/org/apache/fesod/excel/il8n/ExcelMessageSource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fesod/src/main/java/org/apache/fesod/excel/il8n/ExcelMessageSource.java b/fesod/src/main/java/org/apache/fesod/excel/il8n/ExcelMessageSource.java index 8697cfa59..8469894ac 100644 --- a/fesod/src/main/java/org/apache/fesod/excel/il8n/ExcelMessageSource.java +++ b/fesod/src/main/java/org/apache/fesod/excel/il8n/ExcelMessageSource.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.fesod.excel.il8n; +package org.apache.fesod.excel.i18n; import java.util.Locale; From 25b1ec15a3fad5760d7554985239f1c20ec46eca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=90=E5=B0=8F=E5=AD=90?= <41484097+GGBOUNDBOY@users.noreply.github.com> Date: Tue, 21 Oct 2025 14:21:31 +0800 Subject: [PATCH 11/19] Update fesod-examples/src/test/java/org/apache/fesod/excel/demo/write/WriteTest.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/org/apache/fesod/excel/demo/write/WriteTest.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 1588eb5c0..76acc9f00 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 @@ -55,7 +55,11 @@ import java.io.File; import java.io.InputStream; import java.net.URL; -import java.util.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 写的常见写法 From 17b15198dede269394d05299f39b686e60bf1610 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=90=E5=B0=8F=E5=AD=90?= <41484097+GGBOUNDBOY@users.noreply.github.com> Date: Tue, 21 Oct 2025 14:21:45 +0800 Subject: [PATCH 12/19] Update fesod/src/main/java/org/apache/fesod/excel/read/metadata/holder/ReadWorkbookHolder.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../fesod/excel/read/metadata/holder/ReadWorkbookHolder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 a570cf9d9..4a948555e 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 @@ -221,7 +221,7 @@ public ReadWorkbookHolder(ReadWorkbook readWorkbook) { } this.hasReadSheet = new HashSet(); this.password = readWorkbook.getPassword(); - this.messageSource=readWorkbook.getMessageSource(); + this.messageSource = readWorkbook.getMessageSource(); } @Override From 442a727a570030ce1c095bb0f564093485066c75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=90=E5=B0=8F=E5=AD=90?= <41484097+GGBOUNDBOY@users.noreply.github.com> Date: Tue, 21 Oct 2025 14:22:00 +0800 Subject: [PATCH 13/19] Update fesod-examples/src/test/java/org/apache/fesod/excel/demo/write/WriteTest.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../test/java/org/apache/fesod/excel/demo/write/WriteTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 76acc9f00..b03a373a8 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 @@ -774,7 +774,7 @@ public void afterSheetDispose(SheetWriteHandlerContext context) { } @Test public void sheetIl8nHeadWriteTest() { - List locales=new ArrayList<>(); + List locales = new ArrayList<>(); locales.add(Locale.CHINA); locales.add(Locale.US); AutoMessageSource autoMessageSource = new AutoMessageSource(); From 494dd771198b761768c220a2b62234b646bdc1f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=90=E5=B0=8F=E5=AD=90?= <41484097+GGBOUNDBOY@users.noreply.github.com> Date: Tue, 21 Oct 2025 14:22:16 +0800 Subject: [PATCH 14/19] Update fesod-examples/src/test/java/org/apache/fesod/excel/demo/read/AutoMessageSource.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../org/apache/fesod/excel/demo/read/AutoMessageSource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index c7c9d11eb..9c5cdd5b0 100644 --- 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 @@ -18,7 +18,7 @@ */ package org.apache.fesod.excel.demo.read; -import org.apache.fesod.excel.il8n.ExcelMessageSource; +import org.apache.fesod.excel.i18n.ExcelMessageSource; import java.util.HashMap; import java.util.Locale; From 09db5946a44e060e80419ba44770e0218a2937d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=90=E5=B0=8F=E5=AD=90?= <41484097+GGBOUNDBOY@users.noreply.github.com> Date: Tue, 21 Oct 2025 14:22:35 +0800 Subject: [PATCH 15/19] Update fesod/src/main/java/org/apache/fesod/excel/metadata/GlobalConfiguration.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../org/apache/fesod/excel/metadata/GlobalConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4cf549e02..d3d8d5643 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 @@ -82,6 +82,6 @@ public GlobalConfiguration() { this.locale = Locale.getDefault(); this.useScientificFormat = Boolean.FALSE; this.filedCacheLocation = CacheLocationEnum.THREAD_LOCAL; - this.messageSource=null; + this.messageSource = null; } } From fa9b6aa31fc1172fe8a0a30209f2e47352a41486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=90=E5=B0=8F=E5=AD=90?= <41484097+GGBOUNDBOY@users.noreply.github.com> Date: Tue, 21 Oct 2025 14:24:06 +0800 Subject: [PATCH 16/19] Update fesod/src/main/java/org/apache/fesod/excel/util/ClassUtils.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- fesod/src/main/java/org/apache/fesod/excel/util/ClassUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 5d5f617ed..1ad47a44d 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 @@ -32,7 +32,7 @@ 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.il8n.ExcelMessageSource; +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; From 2f143c747fde2eea2b140f1017b84100320f045a Mon Sep 17 00:00:00 2001 From: cixing <296665628@qq.com> Date: Tue, 21 Oct 2025 15:54:03 +0800 Subject: [PATCH 17/19] =?UTF-8?q?feat:=20ai=20=E4=BF=AE=E6=AD=A3=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=90=8E=E3=80=82=E5=86=8D=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../excel/{il8n => i18n}/ExcelMessageSource.java | 0 .../excel/metadata/AbstractParameterBuilder.java | 2 +- .../fesod/excel/metadata/BasicParameter.java | 2 +- .../fesod/excel/metadata/GlobalConfiguration.java | 2 +- .../fesod/excel/read/metadata/ReadWorkbook.java | 2 +- .../read/metadata/holder/ReadWorkbookHolder.java | 2 +- .../org/apache/fesod/excel/util/ClassUtils.java | 14 ++++---------- 7 files changed, 9 insertions(+), 15 deletions(-) rename fesod/src/main/java/org/apache/fesod/excel/{il8n => i18n}/ExcelMessageSource.java (100%) diff --git a/fesod/src/main/java/org/apache/fesod/excel/il8n/ExcelMessageSource.java b/fesod/src/main/java/org/apache/fesod/excel/i18n/ExcelMessageSource.java similarity index 100% rename from fesod/src/main/java/org/apache/fesod/excel/il8n/ExcelMessageSource.java rename to fesod/src/main/java/org/apache/fesod/excel/i18n/ExcelMessageSource.java 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 b592b1f67..ea1db61b7 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,7 +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.il8n.ExcelMessageSource; +import org.apache.fesod.excel.i18n.ExcelMessageSource; import org.apache.fesod.excel.util.ListUtils; /** 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 adcfd7a50..798b7414a 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,7 +26,7 @@ import lombok.Setter; import org.apache.fesod.excel.converters.Converter; import org.apache.fesod.excel.enums.CacheLocationEnum; -import org.apache.fesod.excel.il8n.ExcelMessageSource; +import org.apache.fesod.excel.i18n.ExcelMessageSource; /** * Basic parameter 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 d3d8d5643..fe6a33db3 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,7 +24,7 @@ import lombok.Getter; import lombok.Setter; import org.apache.fesod.excel.enums.CacheLocationEnum; -import org.apache.fesod.excel.il8n.ExcelMessageSource; +import org.apache.fesod.excel.i18n.ExcelMessageSource; /** * Global configuration 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 827a2d1a6..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,7 +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.il8n.ExcelMessageSource; +import org.apache.fesod.excel.i18n.ExcelMessageSource; import org.apache.fesod.excel.read.listener.ModelBuildEventListener; import org.apache.fesod.excel.support.ExcelTypeEnum; 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 4a948555e..634db3124 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,7 +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.il8n.ExcelMessageSource; +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; 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 1ad47a44d..4b15b595f 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 @@ -20,7 +20,7 @@ package org.apache.fesod.excel.util; import cn.idev.excel.support.cglib.beans.BeanMap; -// Lombok imports replaced with explicit imports below. +import lombok.*; import org.apache.commons.collections4.CollectionUtils; import org.apache.fesod.excel.annotation.ExcelIgnore; import org.apache.fesod.excel.annotation.ExcelIgnoreUnannotated; @@ -37,18 +37,12 @@ import org.apache.fesod.excel.metadata.FieldCache; import org.apache.fesod.excel.metadata.FieldWrapper; import org.apache.fesod.excel.metadata.GlobalConfiguration; -import org.apache.fesod.excel.metadata.property.ExcelContentProperty; +import org.apache.fesod.excel.metadata.property.*; +import org.apache.fesod.excel.write.metadata.holder.WriteHolder; import java.lang.reflect.Field; import java.lang.reflect.Modifier; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.Objects; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; public class ClassUtils { From d862ed059eb90de1ba99dd349f88d3a619ac96e7 Mon Sep 17 00:00:00 2001 From: cixing <296665628@qq.com> Date: Tue, 21 Oct 2025 18:24:34 +0800 Subject: [PATCH 18/19] feat: add file head --- .../java/org/apache/fesod/excel/demo/read/AutoMessageSource.java | 1 + .../java/org/apache/fesod/excel/i18n/ExcelMessageSource.java | 1 + 2 files changed, 2 insertions(+) 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 index 9c5cdd5b0..f92a77d05 100644 --- 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 @@ -16,6 +16,7 @@ * specific language governing permissions and limitations * under the License. */ + package org.apache.fesod.excel.demo.read; import org.apache.fesod.excel.i18n.ExcelMessageSource; 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 index 8469894ac..efcb360f3 100644 --- a/fesod/src/main/java/org/apache/fesod/excel/i18n/ExcelMessageSource.java +++ b/fesod/src/main/java/org/apache/fesod/excel/i18n/ExcelMessageSource.java @@ -16,6 +16,7 @@ * specific language governing permissions and limitations * under the License. */ + package org.apache.fesod.excel.i18n; import java.util.Locale; From 41fe57a8d30467006d3fc816b22504a54d67027d Mon Sep 17 00:00:00 2001 From: cixing <296665628@qq.com> Date: Wed, 22 Oct 2025 09:22:31 +0800 Subject: [PATCH 19/19] feat: code style --- .../excel/demo/read/AutoMessageSource.java | 5 +-- .../demo/read/Il8nHeadDemoDataListener.java | 6 +-- .../excel/demo/read/Il8nZhHeadDemoData.java | 6 ++- .../fesod/excel/demo/read/ReadTest.java | 24 +++++----- .../fesod/excel/demo/write/WriteTest.java | 45 +++++++++---------- .../fesod/excel/i18n/ExcelMessageSource.java | 13 +++--- .../metadata/AbstractParameterBuilder.java | 6 +-- .../fesod/excel/metadata/BasicParameter.java | 3 +- .../excel/metadata/GlobalConfiguration.java | 2 + .../metadata/holder/ReadWorkbookHolder.java | 1 - .../apache/fesod/excel/util/ClassUtils.java | 12 ++--- 11 files changed, 62 insertions(+), 61 deletions(-) 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 index f92a77d05..e00612ecd 100644 --- 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 @@ -19,11 +19,10 @@ package org.apache.fesod.excel.demo.read; -import org.apache.fesod.excel.i18n.ExcelMessageSource; - import java.util.HashMap; import java.util.Locale; import java.util.Map; +import org.apache.fesod.excel.i18n.ExcelMessageSource; /** * AutoMessageSource @@ -32,7 +31,7 @@ * @date 2025/10/20 */ public class AutoMessageSource implements ExcelMessageSource { - private final static Map> MESSAGE_MAP = new HashMap<>(); + private static final Map> MESSAGE_MAP = new HashMap<>(); @Override public String resolveCode(String code, Locale locale) { 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 index 7c5aba048..aae5079cd 100644 --- 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 @@ -33,9 +33,7 @@ @Slf4j public class Il8nHeadDemoDataListener implements ReadListener { - public Il8nHeadDemoDataListener() { - - } + public Il8nHeadDemoDataListener() {} @Override public void invoke(Il8nZhHeadDemoData data, AnalysisContext context) { @@ -51,6 +49,4 @@ public void invoke(Il8nZhHeadDemoData data, AnalysisContext context) { 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 index 2ba3b7b32..414def059 100644 --- 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 @@ -19,13 +19,12 @@ 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; -import java.util.Date; - /** * 基础数据类.这里的排序和excel里面的排序一致 * @@ -37,10 +36,13 @@ 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 bd58681ed..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 @@ -20,6 +20,10 @@ package org.apache.fesod.excel.demo.read; 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; import org.apache.fesod.excel.FastExcel; @@ -39,11 +43,6 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import java.io.File; -import java.util.List; -import java.util.Locale; -import java.util.Map; - /** * Common approaches for reading Excel files */ @@ -127,7 +126,7 @@ private void saveData() { fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx"; // One reader per file try (ExcelReader excelReader = - FastExcel.read(fileName, DemoData.class, new DemoDataListener()).build()) { + FastExcel.read(fileName, DemoData.class, new DemoDataListener()).build()) { // Build a sheet. You can specify the name or index. ReadSheet readSheet = FastExcel.readSheet(0).build(); readSheet.setNumRows(2); @@ -418,7 +417,10 @@ public void il8nZhHeadRead() { 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(); + .locale(Locale.CHINA) + .messageResource(autoMessageSource) + .sheet() + .doRead(); } /** @@ -436,7 +438,10 @@ public void il8nUsHeadRead() { 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(); + .locale(Locale.US) + .messageResource(autoMessageSource) + .sheet() + .doRead(); } /** @@ -481,8 +486,7 @@ public void invoke(DemoChainAccessorsData data, AnalysisContext context) { } @Override - public void doAfterAllAnalysed(AnalysisContext context) { - } + public void doAfterAllAnalysed(AnalysisContext context) {} }) .build()) { excelReader.readAll(); 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 b03a373a8..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 @@ -19,6 +19,12 @@ package org.apache.fesod.excel.demo.write; +import java.io.File; +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; import org.apache.fesod.excel.ExcelWriter; import org.apache.fesod.excel.FastExcel; import org.apache.fesod.excel.annotation.ExcelProperty; @@ -27,9 +33,9 @@ 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.demo.read.AutoMessageSource; import org.apache.fesod.excel.metadata.data.*; import org.apache.fesod.excel.util.BooleanUtils; import org.apache.fesod.excel.util.FileUtils; @@ -52,15 +58,6 @@ import org.apache.poi.xssf.streaming.SXSSFSheet; import org.junit.jupiter.api.Test; -import java.io.File; -import java.io.InputStream; -import java.net.URL; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - /** * 写的常见写法 * @@ -772,31 +769,33 @@ public void afterSheetDispose(SheetWriteHandlerContext context) { .doWrite(this::data); 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"; + 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) + .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++) { @@ -880,7 +879,7 @@ private List Il8nHeadDemoDataList() { data.setString("STRING" + i); data.setDate(new Date()); data.setDoubleData(0.56); - data.setString1("测试000"+i); + data.setString1("测试000" + i); list.add(data); } return list; 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 index efcb360f3..3ccd3c7a3 100644 --- a/fesod/src/main/java/org/apache/fesod/excel/i18n/ExcelMessageSource.java +++ b/fesod/src/main/java/org/apache/fesod/excel/i18n/ExcelMessageSource.java @@ -32,19 +32,18 @@ public interface ExcelMessageSource { /** * resolveCode 转换code * - * @param code String - * @param locale Locale - * @return String + * @param code + * @param locale + * @return */ String resolveCode(String code, Locale locale); - /** * addMessage 增加词条 * - * @param code String - * @param locale Locale - * @param msg String + * @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/AbstractParameterBuilder.java b/fesod/src/main/java/org/apache/fesod/excel/metadata/AbstractParameterBuilder.java index ea1db61b7..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 @@ -104,10 +104,10 @@ public T locale(Locale locale) { /** * message resource * - * @param excelMessageSource ExcelMessageSource - * @return T + * @param excelMessageSource + * @return */ - public T messageResource(ExcelMessageSource excelMessageSource) { + public T messageResource(ExcelMessageSource excelMessageSource) { parameter().setMessageSource(excelMessageSource); return self(); } 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 798b7414a..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 @@ -82,12 +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 fe6a33db3..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 @@ -73,8 +73,10 @@ public class GlobalConfiguration { private Boolean autoStrip; /** * Message source + * */ private ExcelMessageSource messageSource; + public GlobalConfiguration() { this.autoTrim = Boolean.TRUE; this.autoStrip = Boolean.FALSE; 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 634db3124..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 @@ -154,7 +154,6 @@ public class ReadWorkbookHolder extends AbstractReadHolder { */ private Boolean ignoreHiddenSheet; - /** * Excel message source */ 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 4b15b595f..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 @@ -20,6 +20,10 @@ package org.apache.fesod.excel.util; import cn.idev.excel.support.cglib.beans.BeanMap; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import lombok.*; import org.apache.commons.collections4.CollectionUtils; import org.apache.fesod.excel.annotation.ExcelIgnore; @@ -40,11 +44,6 @@ import org.apache.fesod.excel.metadata.property.*; import org.apache.fesod.excel.write.metadata.holder.WriteHolder; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - public class ClassUtils { /** @@ -312,7 +311,8 @@ private static FieldCache doDeclaredFields(Class clazz, ConfigurationHolder c if (ignoreSet.contains(fieldName)) { continue; } - declaredOneField(field, orderFieldMap, indexFieldMap, ignoreSet, excelIgnoreUnannotated, configurationHolder); + declaredOneField( + field, orderFieldMap, indexFieldMap, ignoreSet, excelIgnoreUnannotated, configurationHolder); } Map sortedFieldMap = buildSortedAllFieldMap(orderFieldMap, indexFieldMap); FieldCache fieldCache = new FieldCache(sortedFieldMap, indexFieldMap);