This is an automated email from the ASF dual-hosted git repository.
delei pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fesod.git
The following commit(s) were added to refs/heads/main by this push:
new 115deaf2 docs: supplement website migration guide using content from
SKILL.md (#884)
115deaf2 is described below
commit 115deaf2ad0fc6d7135a223b53411993bc20a5c3
Author: Bengbengbalabalabeng
<[email protected]>
AuthorDate: Thu Mar 12 20:13:12 2026 +0800
docs: supplement website migration guide using content from SKILL.md (#884)
* docs: supplement website migration guide using content from SKILL.md
* docs: correct Phase 3 to Step 3 for consistency in migration steps
---
website/docs/migration/from-fastexcel.md | 228 +++++++++++++++---
.../current/migration/from-fastexcel.md | 262 ++++++++++++++++-----
2 files changed, 400 insertions(+), 90 deletions(-)
diff --git a/website/docs/migration/from-fastexcel.md
b/website/docs/migration/from-fastexcel.md
index b0c58657..7e20c95c 100644
--- a/website/docs/migration/from-fastexcel.md
+++ b/website/docs/migration/from-fastexcel.md
@@ -30,7 +30,7 @@ This guide provides a comprehensive roadmap for migrating
applications from cn.i
### Why Migrate?
-- **Apache Foundation Support**: Apache Fesod (Incubating) is now part of the
Apache Software Foundation, ensuring long-term maintenance and community-driven
development
+- **Apache Software Foundation Support**: Apache Fesod (Incubating) is now
part of the Apache Software Foundation, ensuring long-term maintenance and
community-driven development
- **Seamless Transition**: The API remains virtually identical, requiring
minimal code changes
- **Enhanced Branding**: Unified naming conventions under the Apache Fesod
(Incubating) umbrella
- **Continued Innovation**: Access to future enhancements and features under
active Apache governance
@@ -55,25 +55,45 @@ The core API, annotations, and processing logic remain
unchanged, ensuring a low
Replace your existing dependency with Apache Fesod (Incubating):
-| Source | GroupId | ArtifactId | Version |
-|--------|---------|------------|----------|
-| **cn.idev FastExcel** | cn.idev.excel | fastexcel | 1.3.0 |
-| **Apache Fesod (Incubating)** ✅ | org.apache.fesod | fesod-sheet |
2.0.0-incubating+ |
+| Source | GroupId | ArtifactId | Version
|
+|---------------------------------|------------------|-------------|-------------------|
+| **cn.idev FastExcel** | cn.idev.excel | fastexcel | 1.3.0
|
+| **Apache Fesod (Incubating)** ✅ | org.apache.fesod | fesod-sheet |
2.0.1-incubating+ |
**Maven:**
+Before:
+
+```xml
+<dependency>
+ <groupId>cn.idev.excel</groupId>
+ <artifactId>fastexcel</artifactId>
+ <version>1.3.0</version>
+</dependency>
+```
+
+After:
+
```xml
<dependency>
<groupId>org.apache.fesod</groupId>
<artifactId>fesod-sheet</artifactId>
- <version>2.0.0-incubating</version>
+ <version>2.0.1-incubating</version>
</dependency>
```
**Gradle:**
+Before:
+
+```groovy
+implementation 'cn.idev.excel:fastexcel:1.3.0'
+```
+
+After:
+
```gradle
-implementation 'org.apache.fesod:fesod-sheet:2.0.0-incubating'
+implementation 'org.apache.fesod:fesod-sheet:2.0.1-incubating'
```
> **Note**: The `fesod-sheet` module is the core module for Excel/CSV
> processing. It automatically includes the necessary dependencies
> (`fesod-common` and `fesod-shaded`).
@@ -82,36 +102,176 @@ implementation
'org.apache.fesod:fesod-sheet:2.0.0-incubating'
Update all import statements to use the new Apache Fesod (Incubating) package
structure.
-| Old Package (Deprecated) | New Package (Required) |
-|--------------------------|--------------------------|
-| cn.idev.excel.* | org.apache.fesod.sheet.* |
-
-**Common Import Replacements:**
-
-| Before | After
|
-|--------------------------------------------------|-----------------------------------------------------------|
-| import cn.idev.excel.FastExcel; | import
org.apache.fesod.sheet.FesodSheet; |
-| import cn.idev.excel.FastExcelFactory; | import
org.apache.fesod.sheet.FesodSheet; |
-| import cn.idev.excel.ExcelReader; | import
org.apache.fesod.sheet.ExcelReader; |
-| import cn.idev.excel.ExcelWriter; | import
org.apache.fesod.sheet.ExcelWriter; |
-| import cn.idev.excel.annotation.ExcelProperty; | import
org.apache.fesod.sheet.annotation.ExcelProperty; |
-| import cn.idev.excel.context.AnalysisContext; | import
org.apache.fesod.sheet.context.AnalysisContext; |
-| import cn.idev.excel.read.listener.ReadListener; | import
org.apache.fesod.sheet.read.listener.ReadListener; |
-
-### Step 3: Class Name Migration
+**Core Entry Classes Replacements:**
+
+| Before | After
|
+|------------------------------------------|---------------------------------------------------|
+| `import cn.idev.excel.FastExcel;` | `import
org.apache.fesod.sheet.FastExcel;` |
+| `import cn.idev.excel.FastExcelFactory;` | `import
org.apache.fesod.sheet.FastExcelFactory;` |
+| `import cn.idev.excel.ExcelWriter;` | `import
org.apache.fesod.sheet.ExcelWriter;` |
+| `import cn.idev.excel.ExcelReader;` | `import
org.apache.fesod.sheet.ExcelReader;` |
+
+> **Note**: After this phase, `FastExcel.read(...)` and
`FastExcelFactory.writerSheet(...)`
+> still compile — they resolve to the `@Deprecated` bridge classes in Fesod.
+> Step 3 replaces them with the canonical `FesodSheet` class.
+
+**Read API Replacements:**
+
+| Before | After
|
+|--------------------------------------------------------------|-----------------------------------------------------------------------|
+| `import cn.idev.excel.read.listener.ReadListener;` | `import
org.apache.fesod.sheet.read.listener.ReadListener;` |
+| `import cn.idev.excel.read.listener.PageReadListener;` | `import
org.apache.fesod.sheet.read.listener.PageReadListener;` |
+| `import cn.idev.excel.read.metadata.ReadSheet;` | `import
org.apache.fesod.sheet.read.metadata.ReadSheet;` |
+| `import cn.idev.excel.read.metadata.ReadWorkbook;` | `import
org.apache.fesod.sheet.read.metadata.ReadWorkbook;` |
+| `import cn.idev.excel.read.metadata.ReadBasicParameter;` | `import
org.apache.fesod.sheet.read.metadata.ReadBasicParameter;` |
+| `import cn.idev.excel.read.builder.ExcelReaderBuilder;` | `import
org.apache.fesod.sheet.read.builder.ExcelReaderBuilder;` |
+| `import cn.idev.excel.read.builder.ExcelReaderSheetBuilder;` | `import
org.apache.fesod.sheet.read.builder.ExcelReaderSheetBuilder;` |
+| `import cn.idev.excel.context.AnalysisContext;` | `import
org.apache.fesod.sheet.context.AnalysisContext;` |
+| `import cn.idev.excel.event.SyncReadListener;` | `import
org.apache.fesod.sheet.event.SyncReadListener;` |
+
+**Write API Replacements:**
+
+| Before | After
|
+|---------------------------------------------------------------|------------------------------------------------------------------------|
+| `import cn.idev.excel.write.metadata.WriteSheet;` | `import
org.apache.fesod.sheet.write.metadata.WriteSheet;` |
+| `import cn.idev.excel.write.metadata.WriteWorkbook;` | `import
org.apache.fesod.sheet.write.metadata.WriteWorkbook;` |
+| `import cn.idev.excel.write.metadata.WriteTable;` | `import
org.apache.fesod.sheet.write.metadata.WriteTable;` |
+| `import cn.idev.excel.write.metadata.WriteBasicParameter;` | `import
org.apache.fesod.sheet.write.metadata.WriteBasicParameter;` |
+| `import cn.idev.excel.write.builder.ExcelWriterBuilder;` | `import
org.apache.fesod.sheet.write.builder.ExcelWriterBuilder;` |
+| `import cn.idev.excel.write.builder.ExcelWriterSheetBuilder;` | `import
org.apache.fesod.sheet.write.builder.ExcelWriterSheetBuilder;` |
+| `import cn.idev.excel.write.builder.ExcelWriterTableBuilder;` | `import
org.apache.fesod.sheet.write.builder.ExcelWriterTableBuilder;` |
+
+**Write Handlers Replacements:**
+
+| Before |
After |
+|-----------------------------------------------------------------------|--------------------------------------------------------------------------------|
+| `import cn.idev.excel.write.handler.WriteHandler;` |
`import org.apache.fesod.sheet.write.handler.WriteHandler;` |
+| `import cn.idev.excel.write.handler.SheetWriteHandler;` |
`import org.apache.fesod.sheet.write.handler.SheetWriteHandler;` |
+| `import cn.idev.excel.write.handler.CellWriteHandler;` |
`import org.apache.fesod.sheet.write.handler.CellWriteHandler;` |
+| `import cn.idev.excel.write.handler.RowWriteHandler;` |
`import org.apache.fesod.sheet.write.handler.RowWriteHandler;` |
+| `import cn.idev.excel.write.handler.WorkbookWriteHandler;` |
`import org.apache.fesod.sheet.write.handler.WorkbookWriteHandler;` |
+| `import cn.idev.excel.write.handler.context.CellWriteHandlerContext;` |
`import org.apache.fesod.sheet.write.handler.context.CellWriteHandlerContext;` |
+
+**Annotations Replacements:**
+
+| Before | After
|
+|------------------------------------------------------------------|---------------------------------------------------------------------------|
+| `import cn.idev.excel.annotation.ExcelProperty;` | `import
org.apache.fesod.sheet.annotation.ExcelProperty;` |
+| `import cn.idev.excel.annotation.ExcelIgnore;` | `import
org.apache.fesod.sheet.annotation.ExcelIgnore;` |
+| `import cn.idev.excel.annotation.ExcelIgnoreUnannotated;` | `import
org.apache.fesod.sheet.annotation.ExcelIgnoreUnannotated;` |
+| `import cn.idev.excel.annotation.format.DateTimeFormat;` | `import
org.apache.fesod.sheet.annotation.format.DateTimeFormat;` |
+| `import cn.idev.excel.annotation.format.NumberFormat;` | `import
org.apache.fesod.sheet.annotation.format.NumberFormat;` |
+| `import cn.idev.excel.annotation.write.style.ColumnWidth;` | `import
org.apache.fesod.sheet.annotation.write.style.ColumnWidth;` |
+| `import cn.idev.excel.annotation.write.style.HeadStyle;` | `import
org.apache.fesod.sheet.annotation.write.style.HeadStyle;` |
+| `import cn.idev.excel.annotation.write.style.ContentStyle;` | `import
org.apache.fesod.sheet.annotation.write.style.ContentStyle;` |
+| `import cn.idev.excel.annotation.write.style.HeadFontStyle;` | `import
org.apache.fesod.sheet.annotation.write.style.HeadFontStyle;` |
+| `import cn.idev.excel.annotation.write.style.ContentFontStyle;` | `import
org.apache.fesod.sheet.annotation.write.style.ContentFontStyle;` |
+| `import cn.idev.excel.annotation.write.style.HeadRowHeight;` | `import
org.apache.fesod.sheet.annotation.write.style.HeadRowHeight;` |
+| `import cn.idev.excel.annotation.write.style.ContentRowHeight;` | `import
org.apache.fesod.sheet.annotation.write.style.ContentRowHeight;` |
+| `import cn.idev.excel.annotation.write.style.OnceAbsoluteMerge;` | `import
org.apache.fesod.sheet.annotation.write.style.OnceAbsoluteMerge;` |
+| `import cn.idev.excel.annotation.write.style.ContentLoopMerge;` | `import
org.apache.fesod.sheet.annotation.write.style.ContentLoopMerge;` |
+
+**Converters Replacements:**
+
+| Before | After
|
+|----------------------------------------------------------|-------------------------------------------------------------------|
+| `import cn.idev.excel.converters.Converter;` | `import
org.apache.fesod.sheet.converters.Converter;` |
+| `import cn.idev.excel.converters.AutoConverter;` | `import
org.apache.fesod.sheet.converters.AutoConverter;` |
+| `import cn.idev.excel.converters.ReadConverterContext;` | `import
org.apache.fesod.sheet.converters.ReadConverterContext;` |
+| `import cn.idev.excel.converters.WriteConverterContext;` | `import
org.apache.fesod.sheet.converters.WriteConverterContext;` |
+
+**Enums Replacements:**
+
+| Before | After
|
+|-----------------------------------------------------------|--------------------------------------------------------------------|
+| `import cn.idev.excel.enums.CellDataTypeEnum;` | `import
org.apache.fesod.sheet.enums.CellDataTypeEnum;` |
+| `import cn.idev.excel.enums.CellExtraTypeEnum;` | `import
org.apache.fesod.sheet.enums.CellExtraTypeEnum;` |
+| `import cn.idev.excel.enums.WriteDirectionEnum;` | `import
org.apache.fesod.sheet.enums.WriteDirectionEnum;` |
+| `import cn.idev.excel.enums.poi.HorizontalAlignmentEnum;` | `import
org.apache.fesod.sheet.enums.poi.HorizontalAlignmentEnum;` |
+| `import cn.idev.excel.enums.poi.BorderStyleEnum;` | `import
org.apache.fesod.sheet.enums.poi.BorderStyleEnum;` |
+| `import cn.idev.excel.enums.poi.FillPatternTypeEnum;` | `import
org.apache.fesod.sheet.enums.poi.FillPatternTypeEnum;` |
+
+**Exceptions and Metadata Replacements:**
+
+| Before | After
|
+|----------------------------------------------------------------|-------------------------------------------------------------------------|
+| `import cn.idev.excel.exception.ExcelAnalysisException;` | `import
org.apache.fesod.sheet.exception.ExcelAnalysisException;` |
+| `import cn.idev.excel.exception.ExcelAnalysisStopException;` | `import
org.apache.fesod.sheet.exception.ExcelAnalysisStopException;` |
+| `import cn.idev.excel.exception.ExcelCommonException;` | `import
org.apache.fesod.sheet.exception.ExcelCommonException;` |
+| `import cn.idev.excel.exception.ExcelGenerateException;` | `import
org.apache.fesod.sheet.exception.ExcelGenerateException;` |
+| `import cn.idev.excel.metadata.data.WriteCellData;` | `import
org.apache.fesod.sheet.metadata.data.WriteCellData;` |
+| `import cn.idev.excel.metadata.data.ReadCellData;` | `import
org.apache.fesod.sheet.metadata.data.ReadCellData;` |
+| `import cn.idev.excel.metadata.CellExtra;` | `import
org.apache.fesod.sheet.metadata.CellExtra;` |
+| `import cn.idev.excel.metadata.Head;` | `import
org.apache.fesod.sheet.metadata.Head;` |
+| `import cn.idev.excel.metadata.property.ExcelContentProperty;` | `import
org.apache.fesod.sheet.metadata.property.ExcelContentProperty;` |
+
+**Wildcard catch-all**
+
+After all specific replacements above, scan for any remaining wildcard imports:
+
+| Before | After |
+|----------------------------------|----------------------------------|
+| `import cn.idev.excel.` | `import org.apache.fesod.sheet.` |
+| `import org.apache.fesod.excel.` | `import org.apache.fesod.sheet.` |
+
+### Step 3: Entry class rename (STRONGLY RECOMMENDED)
+
+`FastExcel` and `FastExcelFactory` compile in Fesod but are `@Deprecated` and
+**will be removed in a future release**. Replace all call sites with
`FesodSheet`.
+
+**Import Replacements:**
+
+| Before | After
|
+|---------------------------------------------------|---------------------------------------------|
+| `import org.apache.fesod.sheet.FastExcel;` | `import
org.apache.fesod.sheet.FesodSheet;` |
+| `import org.apache.fesod.sheet.FastExcelFactory;` | `import
org.apache.fesod.sheet.FesodSheet;` |
+
+**Call Site Replacements - FastExcel**
+
+| Before | After |
+|---------------------------|----------------------------|
+| `FastExcel.read()` | `FesodSheet.read()` |
+| `FastExcel.write()` | `FesodSheet.write()` |
+| `FastExcel.writerSheet()` | `FesodSheet.writerSheet()` |
+| `FastExcel.readSheet()` | `FesodSheet.readSheet()` |
+| `FastExcel.writerTable()` | `FesodSheet.writerTable()` |
+
+**Call Site Replacements — FastExcelFactory**
+
+FastExcel 1.3 shipped `FastExcelFactory` as a second entry class with an
+identical API surface. All of its static methods map directly to `FesodSheet`:
+
+| Before | After |
+|----------------------------------|----------------------------|
+| `FastExcelFactory.read()` | `FesodSheet.read()` |
+| `FastExcelFactory.write()` | `FesodSheet.write()` |
+| `FastExcelFactory.writerSheet()` | `FesodSheet.writerSheet()` |
+| `FastExcelFactory.readSheet()` | `FesodSheet.readSheet()` |
+| `FastExcelFactory.writerTable()` | `FesodSheet.writerTable()` |
+
+**Type Reference Rename**
+
+If `FastExcel` or `FastExcelFactory` appear as a **type name** (not a call
site),
+rename those too:
+
+- Variable type: `FastExcel x = ...` → `FesodSheet x = ...`
+- Class literal: `FastExcel.class` → `FesodSheet.class`
+
+`ExcelWriter` and `ExcelReader` are **not renamed**, they keep the same class
name.
+
+**CGLIB class name (conditional)**
+
+This phase only applies if the project contains code that **inspects or asserts
+on generated CGLIB class names at runtime**, for example in tests or
serialization logic.
-Replace deprecated entry point classes with FesodSheet.
+Search all `.java` files for the string `ByFastExcelCGLIB`.
+If found, replace with `ByFesodCGLIB`.
-#### Migration from FastExcel/FastExcelFactory
+In Fesod, the naming policy is defined in
+`org.apache.fesod.sheet.util.BeanMapUtils.FesodSheetNamingPolicy` and its
+`getTag()` returns `ByFesodCGLIB`.
-| Operation | Before (FastExcel) | After
(FesodSheet) |
-|-----------------------|--------------------------------------------|---------------------------------------------|
-| **Simple Read** | FastExcel.read(file, Data.class, listener) |
FesodSheet.read(file, Data.class, listener) |
-| **Simple Write** | FastExcel.write(file, Data.class) |
FesodSheet.write(file, Data.class) |
-| **Read Sheet** | FastExcelFactory.readSheet(0) |
FesodSheet.readSheet(0) |
-| **Write Sheet** | FastExcelFactory.writerSheet("Sheet1") |
FesodSheet.writerSheet("Sheet1") |
-| **Read with Stream** | FastExcel.read(inputStream) |
FesodSheet.read(inputStream) |
-| **Write with Stream** | FastExcel.write(outputStream) |
FesodSheet.write(outputStream) |
+If no file references `ByFastExcelCGLIB`, skip this phase entirely.
---
diff --git
a/website/i18n/zh-cn/docusaurus-plugin-content-docs/current/migration/from-fastexcel.md
b/website/i18n/zh-cn/docusaurus-plugin-content-docs/current/migration/from-fastexcel.md
index d5c849c6..8c926de3 100644
---
a/website/i18n/zh-cn/docusaurus-plugin-content-docs/current/migration/from-fastexcel.md
+++
b/website/i18n/zh-cn/docusaurus-plugin-content-docs/current/migration/from-fastexcel.md
@@ -9,15 +9,15 @@ keywords: [fesod, 迁移, fastexcel, apache, excel, 升级]
## 概述
-本指南为从 cn.idev FastExcel 迁移到 Apache Fesod (Incubating) 提供全面的迁移路线。Apache Fesod
(Incubating) 是该项目的演进版本,现已成为 Apache 软件基金会(孵化中)的一部分,提供同样的高性能 Excel
处理能力,并具有更强的社区支持和长期可持续性。
+本指南为从 cn.idev FastExcel 迁移到 Apache Fesod (Incubating) 提供全面的迁移路线。Apache Fesod
(Incubating) 是该项目的演进版本,现已成为 Apache 软件基金会(孵化中)的一部分,提供同样的高性能 Excel
处理能力,并具有更强的社区支持和长期可持续性。
### 为什么要迁移?
-- **Apache 基金会支持**: Apache Fesod (Incubating) 现已成为 Apache
软件基金会的一部分,确保长期维护和社区驱动的开发
-- **无缝过渡**: API 几乎完全相同,只需最少的代码更改
-- **统一品牌**: 在 Apache Fesod (Incubating) 下统一的命名规范
-- **持续创新**: 在 Apache 治理下获得未来的增强和功能
-- **向后兼容**: 暂时保留已废弃的别名(FastExcel)以便逐步迁移
+- **Apache 软件基金会支持**:Apache Fesod (Incubating) 现已成为 Apache
软件基金会的一部分,确保长期维护和社区驱动的开发
+- **无缝过渡**:API 几乎完全相同,只需最少的代码更改
+- **统一品牌**:在 Apache Fesod (Incubating) 下统一的命名规范
+- **持续创新**:在 Apache 治理下获得未来的增强和功能
+- **向后兼容**:暂时保留已废弃的别名(FastExcel)以便逐步迁移
### 迁移范围
@@ -28,103 +28,253 @@ keywords: [fesod, 迁移, fastexcel, apache, excel, 升级]
3. 更新包导入
4. 通过全面测试验证功能
-核心 API、注解和处理逻辑保持不变,确保低风险的迁移路径。
+核心 API、注解和处理逻辑保持不变,确保低风险的迁移路径。
---
## 迁移步骤
-### 步骤 1: 更新依赖
+### 步骤 1:更新依赖
-将现有依赖替换为 Apache Fesod (Incubating):
+将现有依赖替换为 Apache Fesod (Incubating):
-| 来源 | GroupId | ArtifactId | 版本 |
-|-----------------------|------------------|------------|--------|
-| **cn.idev FastExcel** | cn.idev.excel | fastexcel | 1.3.0 |
-| **Apache Fesod (Incubating)** ✅ | org.apache.fesod | fesod-sheet |
2.0.0-incubating+ |
+| 来源 | GroupId | ArtifactId | 版本
|
+|---------------------------------|------------------|-------------|-------------------|
+| **cn.idev FastExcel** | cn.idev.excel | fastexcel | 1.3.0
|
+| **Apache Fesod (Incubating)** ✅ | org.apache.fesod | fesod-sheet |
2.0.1-incubating+ |
-**Maven 配置:**
+**Maven 配置:**
+
+修改前:
```xml
<dependency>
- <groupId>org.apache.fesod</groupId>
- <artifactId>fesod-sheet</artifactId>
- <version>2.0.0-incubating</version>
+ <groupId>cn.idev.excel</groupId>
+ <artifactId>fastexcel</artifactId>
+ <version>1.3.0</version>
</dependency>
```
-**Gradle 配置:**
+修改后:
-```gradle
-implementation 'org.apache.fesod:fesod-sheet:2.0.0-incubating'
+```xml
+<dependency>
+ <groupId>org.apache.fesod</groupId>
+ <artifactId>fesod-sheet</artifactId>
+ <version>2.0.1-incubating</version>
+</dependency>
```
-> **注意**: `fesod-sheet` 模块是 Excel/CSV 处理的核心模块。它会自动引入必要的依赖(`fesod-common` 和
`fesod-shaded`)。
-
-### 步骤 2: 更新包导入
+**Gradle 配置:**
-更新所有 import 语句以使用新的 Apache Fesod (Incubating) 包结构。
+修改前:
-| 旧包名(已废弃) | 新包名(必需) |
-|-----------------|--------------------------|
-| cn.idev.excel.* | org.apache.fesod.sheet.* |
+```groovy
+implementation 'cn.idev.excel:fastexcel:1.3.0'
+```
-**常见导入替换:**
+修改后:
-| 修改前 | 修改后
|
-|--------------------------------------------------|-----------------------------------------------------------|
-| import cn.idev.excel.FastExcel; | import
org.apache.fesod.sheet.FesodSheet; |
-| import cn.idev.excel.FastExcelFactory; | import
org.apache.fesod.sheet.FesodSheet; |
-| import cn.idev.excel.ExcelReader; | import
org.apache.fesod.sheet.ExcelReader; |
-| import cn.idev.excel.ExcelWriter; | import
org.apache.fesod.sheet.ExcelWriter; |
-| import cn.idev.excel.annotation.ExcelProperty; | import
org.apache.fesod.sheet.annotation.ExcelProperty; |
-| import cn.idev.excel.context.AnalysisContext; | import
org.apache.fesod.sheet.context.AnalysisContext; |
-| import cn.idev.excel.read.listener.ReadListener; | import
org.apache.fesod.sheet.read.listener.ReadListener; |
+```gradle
+implementation 'org.apache.fesod:fesod-sheet:2.0.1-incubating'
+```
-### 步骤 3: 类名迁移
+> **注意**: `fesod-sheet` 模块是 Excel/CSV 处理的核心模块。它会自动引入必要的依赖(`fesod-common` 和
`fesod-shaded`)。
-将已废弃的入口类替换为 FesodSheet。
+### 步骤 2:更新包导入
-#### 从 FastExcel/FastExcelFactory 迁移
+更新所有 import 语句以使用新的 Apache Fesod (Incubating) 包结构。
-| 操作 | 修改前 (FastExcel) | 修改后 (FesodSheet)
|
-|--------------|--------------------------------------------|---------------------------------------------|
-| **简单读取** | FastExcel.read(file, Data.class, listener) |
FesodSheet.read(file, Data.class, listener) |
-| **简单写入** | FastExcel.write(file, Data.class) |
FesodSheet.write(file, Data.class) |
-| **读取 Sheet** | FastExcelFactory.readSheet(0) |
FesodSheet.readSheet(0) |
-| **写入 Sheet** | FastExcelFactory.writerSheet("Sheet1") |
FesodSheet.writerSheet("Sheet1") |
-| **流式读取** | FastExcel.read(inputStream) |
FesodSheet.read(inputStream) |
-| **流式写入** | FastExcel.write(outputStream) |
FesodSheet.write(outputStream) |
+**核心入口类替换:**
+
+| 修改前 | 修改后
|
+|------------------------------------------|---------------------------------------------------|
+| `import cn.idev.excel.FastExcel;` | `import
org.apache.fesod.sheet.FastExcel;` |
+| `import cn.idev.excel.FastExcelFactory;` | `import
org.apache.fesod.sheet.FastExcelFactory;` |
+| `import cn.idev.excel.ExcelWriter;` | `import
org.apache.fesod.sheet.ExcelWriter;` |
+| `import cn.idev.excel.ExcelReader;` | `import
org.apache.fesod.sheet.ExcelReader;` |
+
+> **注意**: 在此阶段之后,`FastExcel.read(...)` 和 `FastExcelFactory.writerSheet(...)`
+> 依然可以编译通过,它们会解析到 Fesod 中带有 `@Deprecated` 标记的桥接类。
+> 在 “步骤 3” 中我们会将它们彻底替换为规范的 FesodSheet 类。
+
+**读取 API 替换:**
+
+| 修改前 | 修改后
|
+|--------------------------------------------------------------|-----------------------------------------------------------------------|
+| `import cn.idev.excel.read.listener.ReadListener;` | `import
org.apache.fesod.sheet.read.listener.ReadListener;` |
+| `import cn.idev.excel.read.listener.PageReadListener;` | `import
org.apache.fesod.sheet.read.listener.PageReadListener;` |
+| `import cn.idev.excel.read.metadata.ReadSheet;` | `import
org.apache.fesod.sheet.read.metadata.ReadSheet;` |
+| `import cn.idev.excel.read.metadata.ReadWorkbook;` | `import
org.apache.fesod.sheet.read.metadata.ReadWorkbook;` |
+| `import cn.idev.excel.read.metadata.ReadBasicParameter;` | `import
org.apache.fesod.sheet.read.metadata.ReadBasicParameter;` |
+| `import cn.idev.excel.read.builder.ExcelReaderBuilder;` | `import
org.apache.fesod.sheet.read.builder.ExcelReaderBuilder;` |
+| `import cn.idev.excel.read.builder.ExcelReaderSheetBuilder;` | `import
org.apache.fesod.sheet.read.builder.ExcelReaderSheetBuilder;` |
+| `import cn.idev.excel.context.AnalysisContext;` | `import
org.apache.fesod.sheet.context.AnalysisContext;` |
+| `import cn.idev.excel.event.SyncReadListener;` | `import
org.apache.fesod.sheet.event.SyncReadListener;` |
+
+**写入 API 替换:**
+
+| 修改前 | 修改后
|
+|---------------------------------------------------------------|------------------------------------------------------------------------|
+| `import cn.idev.excel.write.metadata.WriteSheet;` | `import
org.apache.fesod.sheet.write.metadata.WriteSheet;` |
+| `import cn.idev.excel.write.metadata.WriteWorkbook;` | `import
org.apache.fesod.sheet.write.metadata.WriteWorkbook;` |
+| `import cn.idev.excel.write.metadata.WriteTable;` | `import
org.apache.fesod.sheet.write.metadata.WriteTable;` |
+| `import cn.idev.excel.write.metadata.WriteBasicParameter;` | `import
org.apache.fesod.sheet.write.metadata.WriteBasicParameter;` |
+| `import cn.idev.excel.write.builder.ExcelWriterBuilder;` | `import
org.apache.fesod.sheet.write.builder.ExcelWriterBuilder;` |
+| `import cn.idev.excel.write.builder.ExcelWriterSheetBuilder;` | `import
org.apache.fesod.sheet.write.builder.ExcelWriterSheetBuilder;` |
+| `import cn.idev.excel.write.builder.ExcelWriterTableBuilder;` | `import
org.apache.fesod.sheet.write.builder.ExcelWriterTableBuilder;` |
+
+**写入拦截器替换:**
+
+| 修改前 | 修改后
|
+|-----------------------------------------------------------------------|--------------------------------------------------------------------------------|
+| `import cn.idev.excel.write.handler.WriteHandler;` |
`import org.apache.fesod.sheet.write.handler.WriteHandler;` |
+| `import cn.idev.excel.write.handler.SheetWriteHandler;` |
`import org.apache.fesod.sheet.write.handler.SheetWriteHandler;` |
+| `import cn.idev.excel.write.handler.CellWriteHandler;` |
`import org.apache.fesod.sheet.write.handler.CellWriteHandler;` |
+| `import cn.idev.excel.write.handler.RowWriteHandler;` |
`import org.apache.fesod.sheet.write.handler.RowWriteHandler;` |
+| `import cn.idev.excel.write.handler.WorkbookWriteHandler;` |
`import org.apache.fesod.sheet.write.handler.WorkbookWriteHandler;` |
+| `import cn.idev.excel.write.handler.context.CellWriteHandlerContext;` |
`import org.apache.fesod.sheet.write.handler.context.CellWriteHandlerContext;` |
+
+**注解替换:**
+
+| 修改前 | 修改后
|
+|------------------------------------------------------------------|---------------------------------------------------------------------------|
+| `import cn.idev.excel.annotation.ExcelProperty;` | `import
org.apache.fesod.sheet.annotation.ExcelProperty;` |
+| `import cn.idev.excel.annotation.ExcelIgnore;` | `import
org.apache.fesod.sheet.annotation.ExcelIgnore;` |
+| `import cn.idev.excel.annotation.ExcelIgnoreUnannotated;` | `import
org.apache.fesod.sheet.annotation.ExcelIgnoreUnannotated;` |
+| `import cn.idev.excel.annotation.format.DateTimeFormat;` | `import
org.apache.fesod.sheet.annotation.format.DateTimeFormat;` |
+| `import cn.idev.excel.annotation.format.NumberFormat;` | `import
org.apache.fesod.sheet.annotation.format.NumberFormat;` |
+| `import cn.idev.excel.annotation.write.style.ColumnWidth;` | `import
org.apache.fesod.sheet.annotation.write.style.ColumnWidth;` |
+| `import cn.idev.excel.annotation.write.style.HeadStyle;` | `import
org.apache.fesod.sheet.annotation.write.style.HeadStyle;` |
+| `import cn.idev.excel.annotation.write.style.ContentStyle;` | `import
org.apache.fesod.sheet.annotation.write.style.ContentStyle;` |
+| `import cn.idev.excel.annotation.write.style.HeadFontStyle;` | `import
org.apache.fesod.sheet.annotation.write.style.HeadFontStyle;` |
+| `import cn.idev.excel.annotation.write.style.ContentFontStyle;` | `import
org.apache.fesod.sheet.annotation.write.style.ContentFontStyle;` |
+| `import cn.idev.excel.annotation.write.style.HeadRowHeight;` | `import
org.apache.fesod.sheet.annotation.write.style.HeadRowHeight;` |
+| `import cn.idev.excel.annotation.write.style.ContentRowHeight;` | `import
org.apache.fesod.sheet.annotation.write.style.ContentRowHeight;` |
+| `import cn.idev.excel.annotation.write.style.OnceAbsoluteMerge;` | `import
org.apache.fesod.sheet.annotation.write.style.OnceAbsoluteMerge;` |
+| `import cn.idev.excel.annotation.write.style.ContentLoopMerge;` | `import
org.apache.fesod.sheet.annotation.write.style.ContentLoopMerge;` |
+
+**转换器替换:**
+
+| 修改前 | 修改后
|
+|----------------------------------------------------------|-------------------------------------------------------------------|
+| `import cn.idev.excel.converters.Converter;` | `import
org.apache.fesod.sheet.converters.Converter;` |
+| `import cn.idev.excel.converters.AutoConverter;` | `import
org.apache.fesod.sheet.converters.AutoConverter;` |
+| `import cn.idev.excel.converters.ReadConverterContext;` | `import
org.apache.fesod.sheet.converters.ReadConverterContext;` |
+| `import cn.idev.excel.converters.WriteConverterContext;` | `import
org.apache.fesod.sheet.converters.WriteConverterContext;` |
+
+**枚举替换:**
+
+| 修改前 | 修改后
|
+|-----------------------------------------------------------|--------------------------------------------------------------------|
+| `import cn.idev.excel.enums.CellDataTypeEnum;` | `import
org.apache.fesod.sheet.enums.CellDataTypeEnum;` |
+| `import cn.idev.excel.enums.CellExtraTypeEnum;` | `import
org.apache.fesod.sheet.enums.CellExtraTypeEnum;` |
+| `import cn.idev.excel.enums.WriteDirectionEnum;` | `import
org.apache.fesod.sheet.enums.WriteDirectionEnum;` |
+| `import cn.idev.excel.enums.poi.HorizontalAlignmentEnum;` | `import
org.apache.fesod.sheet.enums.poi.HorizontalAlignmentEnum;` |
+| `import cn.idev.excel.enums.poi.BorderStyleEnum;` | `import
org.apache.fesod.sheet.enums.poi.BorderStyleEnum;` |
+| `import cn.idev.excel.enums.poi.FillPatternTypeEnum;` | `import
org.apache.fesod.sheet.enums.poi.FillPatternTypeEnum;` |
+
+**异常与元信息替换:**
+
+| 修改前 | 修改后
|
+|----------------------------------------------------------------|-------------------------------------------------------------------------|
+| `import cn.idev.excel.exception.ExcelAnalysisException;` | `import
org.apache.fesod.sheet.exception.ExcelAnalysisException;` |
+| `import cn.idev.excel.exception.ExcelAnalysisStopException;` | `import
org.apache.fesod.sheet.exception.ExcelAnalysisStopException;` |
+| `import cn.idev.excel.exception.ExcelCommonException;` | `import
org.apache.fesod.sheet.exception.ExcelCommonException;` |
+| `import cn.idev.excel.exception.ExcelGenerateException;` | `import
org.apache.fesod.sheet.exception.ExcelGenerateException;` |
+| `import cn.idev.excel.metadata.data.WriteCellData;` | `import
org.apache.fesod.sheet.metadata.data.WriteCellData;` |
+| `import cn.idev.excel.metadata.data.ReadCellData;` | `import
org.apache.fesod.sheet.metadata.data.ReadCellData;` |
+| `import cn.idev.excel.metadata.CellExtra;` | `import
org.apache.fesod.sheet.metadata.CellExtra;` |
+| `import cn.idev.excel.metadata.Head;` | `import
org.apache.fesod.sheet.metadata.Head;` |
+| `import cn.idev.excel.metadata.property.ExcelContentProperty;` | `import
org.apache.fesod.sheet.metadata.property.ExcelContentProperty;` |
+
+**通配符兜底替换**
+
+在完成上述所有具体替换后,扫描任何剩余的通配符包导入:
+
+| 修改前 | 修改后 |
+|----------------------------------|----------------------------------|
+| `import cn.idev.excel.` | `import org.apache.fesod.sheet.` |
+| `import org.apache.fesod.excel.` | `import org.apache.fesod.sheet.` |
+
+### 步骤 3:重命名入口类(强烈建议)
+
+`FastExcel` 和 `FastExcelFactory` 在 Fesod 中仍然可以编译,但已被标记为 `@Deprecated` 弃用,
+并且**将在未来的版本中被移除**。请将所有调用点替换为 `FesodSheet`。
+
+**导入替换:**
+
+| 修改前 | 修改后
|
+|---------------------------------------------------|---------------------------------------------|
+| `import org.apache.fesod.sheet.FastExcel;` | `import
org.apache.fesod.sheet.FesodSheet;` |
+| `import org.apache.fesod.sheet.FastExcelFactory;` | `import
org.apache.fesod.sheet.FesodSheet;` |
+
+**调用入口类替换 - FastExcel**
+
+| 修改前 | 修改后 |
+|---------------------------|----------------------------|
+| `FastExcel.read()` | `FesodSheet.read()` |
+| `FastExcel.write()` | `FesodSheet.write()` |
+| `FastExcel.writerSheet()` | `FesodSheet.writerSheet()` |
+| `FastExcel.readSheet()` | `FesodSheet.readSheet()` |
+| `FastExcel.writerTable()` | `FesodSheet.writerTable()` |
+
+**调用入口类替换 — FastExcelFactory**
+
+FastExcel 1.3 曾提供了 `FastExcelFactory` 作为第二个入口类,其 API 表面完全相同。它的所有静态方法都可以直接映射到
FesodSheet:
+
+| 修改前 | 修改后 |
+|----------------------------------|----------------------------|
+| `FastExcelFactory.read()` | `FesodSheet.read()` |
+| `FastExcelFactory.write()` | `FesodSheet.write()` |
+| `FastExcelFactory.writerSheet()` | `FesodSheet.writerSheet()` |
+| `FastExcelFactory.readSheet()` | `FesodSheet.readSheet()` |
+| `FastExcelFactory.writerTable()` | `FesodSheet.writerTable()` |
+
+**类型引用重命名**
+
+如果 `FastExcel` 或 `FastExcelFactory` 作为类型名称(而不是调用入口)出现,也请重命名它们:
+
+- 变量类型:`FastExcel x = ...` → `FesodSheet x = ...`
+- 类字面量:`FastExcel.class` → `FesodSheet.class`
+
+`ExcelWriter` 和 `ExcelReader` 无需重命名,保持相同的类名即可。
+
+**CGLIB 类名替换(按需执行)**
+
+此阶段仅适用于项目中包含**在运行时检查或断言生成的 CGLIB 类名**的代码,例如在单元测试或特定的序列化逻辑中。 搜索所有 `.java`
文件中的字符串 `ByFastExcelCGLIB`。
+如果找到,请替换为 `ByFesodCGLIB`。 在 Fesod 中,命名策略定义在
`org.apache.fesod.sheet.util.BeanMapUtils.FesodSheetNamingPolicy` 中,其 `getTag()`
+返回 `ByFesodCGLIB`。 如果没有文件引用 `ByFastExcelCGLIB`,请直接跳过此步骤。
---
## 迁移策略
-### 渐进式迁移(推荐)
+### 渐进式迁移(推荐)
利用已废弃的别名类进行分阶段迁移。
-**阶段 1: 仅更新依赖**
+**阶段 1:仅更新依赖**
- 将 Maven/Gradle 依赖更新为 Apache Fesod (Incubating)
- 继续使用 FastExcel 类(现为已废弃的别名)
- 仅更新包导入
- 运行全面测试以验证兼容性
-**阶段 2: 类名迁移**
+**阶段 2:类名迁移**
- 逐步将已废弃的类替换为 FesodSheet
- 使用 IDE 重构工具进行批量重命名
- 逐个模块或逐个功能进行迁移
- 在整个过程中保持全面的测试覆盖
-**阶段 3: 清理**
+**阶段 3:清理**
- 删除所有对已废弃类的引用
- 解决废弃警告
- 更新文档和代码注释
-**优势:**
+**优势:**
- 通过增量更改降低风险
- 如果出现问题更容易回滚
@@ -135,8 +285,8 @@ implementation
'org.apache.fesod:fesod-sheet:2.0.0-incubating'
## 总结
-由于高度的 API 兼容性和向后兼容的已废弃别名,从 cn.idev FastExcel 迁移到 Apache Fesod (Incubating)
是一个直接的过程。主要工作涉及更新依赖声明和包导入,几乎不需要或不需要逻辑更改。
+由于高度的 API 兼容性和向后兼容的已废弃别名,从 cn.idev FastExcel 迁移到 Apache Fesod (Incubating)
是一个直接的过程。主要工作涉及更新依赖声明和包导入,几乎不需要或不需要逻辑更改。
-渐进式迁移策略得到临时已废弃别名(FastExcel、FastExcelFactory)的支持,允许团队按自己的节奏迁移,同时保持完整功能。
+渐进式迁移策略得到临时已废弃别名(FastExcel、FastExcelFactory)的支持,允许团队按自己的节奏迁移,同时保持完整功能。
-遵循本指南,组织可以无缝过渡到 Apache Fesod (Incubating),并从 Apache 软件基金会生态系统的长期可持续性和社区支持中受益。
+遵循本指南,组织可以无缝过渡到 Apache Fesod (Incubating),并从 Apache 软件基金会生态系统的长期可持续性和社区支持中受益。
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]