diff --git a/website/blog/2026-05-07-migration-from-fastexcel-with-openrewrite.md b/website/blog/2026-05-07-migration-from-fastexcel-with-openrewrite.md new file mode 100644 index 000000000..f6979d06c --- /dev/null +++ b/website/blog/2026-05-07-migration-from-fastexcel-with-openrewrite.md @@ -0,0 +1,214 @@ +--- +title: "Automated Migration from FastExcel 1.3.0 to Apache Fesod (Incubating) with OpenRewrite" +description: Migrate FastExcel 1.3 to Apache Fesod 2.0.1-incubating +authors: [bengbengbalabalabeng] +tags: [migration, fastexcel, fesod] +--- + +> This article demonstrates how to write a declarative OpenRewrite recipe that migrates your project from `cn.idev.excel:fastexcel:1.3.0` to `org.apache.fesod:fesod-sheet:2.0.1-incubating`, covering both Maven and Gradle builds. + + + +## Background + +FastExcel (`cn.idev.excel`) has been donated to the Apache Software Foundation and is now incubating as **Apache Fesod (Incubating)**. The core change is a **Java package path replacement** — the API, annotations, and processing logic remain identical, making this a low-risk, mechanical refactoring. + +For the official migration strategy, see: [https://fesod.apache.org/docs/migration/from-fastexcel/](https://fesod.apache.org/docs/migration/from-fastexcel/) + +Manually replacing imports file by file is tedious and error-prone. OpenRewrite provides AST-level code transformation capabilities to perform this kind of bulk migration precisely and safely. + +## Migration Scope + +1. Update Maven/Gradle dependencies +2. Replace deprecated class names with `FesodSheet` +3. Update package imports + +## Writing the OpenRewrite Recipe + +Create a `rewrite.yml` file in your project root: + +```yaml +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.apache.fesod.MigrateFastExcelToFesod +displayName: Migrate FastExcel 1.3 to Apache Fesod 2.0.1-incubating +recipeList: + + # Step 1: Update Dependencies (Maven & Gradle) + - org.openrewrite.maven.ChangeDependencyGroupIdAndArtifactId: + oldGroupId: cn.idev.excel + oldArtifactId: fastexcel + newGroupId: org.apache.fesod + newArtifactId: fesod-sheet + newVersion: 2.0.1-incubating + - org.openrewrite.gradle.ChangeDependency: + oldGroupId: cn.idev.excel + oldArtifactId: fastexcel + newGroupId: org.apache.fesod + newArtifactId: fesod-sheet + newVersion: 2.0.1-incubating + + # Step 2: Package Import Updates + - org.openrewrite.java.ChangePackage: + oldPackageName: cn.idev.excel + newPackageName: org.apache.fesod.sheet + recursive: true + - org.openrewrite.java.ChangePackage: + oldPackageName: org.apache.fesod.excel + newPackageName: org.apache.fesod.sheet + recursive: true + + # Step 3: Entry Class Rename + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: org.apache.fesod.sheet.FastExcel + newFullyQualifiedTypeName: org.apache.fesod.sheet.FesodSheet + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: org.apache.fesod.sheet.FastExcelFactory + newFullyQualifiedTypeName: org.apache.fesod.sheet.FesodSheet + + - org.openrewrite.text.FindAndReplace: + find: ByFastExcelCGLIB + replace: ByFesodCGLIB + filePattern: "**/*.java" +``` + +### How It Works + +The recipe executes steps sequentially in declaration order: + +**Step 1 — Update Dependencies**: The first rule updates `pom.xml` for Maven projects; the second rule updates `build.gradle` / `build.gradle.kts` for Gradle projects. If your project uses only one build tool, the other rule is silently skipped. + +**Step 2 — Package Import Updates**: `ChangePackage(recursive=true)` covers all sub-packages under `cn.idev.excel` (annotation, read, write, converters, enums, etc.) in a single rule — no need to enumerate each one individually. The second rule handles legacy code that was already partially migrated to `org.apache.fesod.excel`. After this step, imports like `cn.idev.excel.FastExcel` become `org.apache.fesod.sheet.FastExcel` (the `@Deprecated` bridge class in Fesod). + +**Step 3 — Entry Class Rename**: Once Step 2 completes, all `FastExcel` and `FastExcelFactory` imports are unified under `org.apache.fesod.sheet`. Only two `ChangeType` rules are needed to rename them to the canonical `FesodSheet` class, automatically updating all call sites (`FastExcel.read()`, `FastExcel.write()`, etc.) and type references (variable declarations, class literals). + +**Step 4 — CGLIB String Replacement**: Only affects code that references CGLIB-generated class names at runtime. Most projects don't need this step — the rule is silently skipped if there's no match. + +## Adding OpenRewrite to Your Project + +### Maven + +Add the plugin to `pom.xml`: + +```xml + + org.openrewrite.maven + rewrite-maven-plugin + 6.38.0 + + + org.apache.fesod.MigrateFastExcelToFesod + + + +``` + +### Gradle (Groovy) + +Add to `build.gradle`: + +```groovy +plugins { + id 'java' + id 'maven-publish' + id 'org.openrewrite.rewrite' version '7.32.2' +} + +rewrite { + activeRecipe( + 'org.apache.fesod.MigrateFastExcelToFesod', + ) +} +``` + +### Gradle (Kotlin) + +Add to `build.gradle.kts`: + +```kotlin +plugins { + `java-library` + `maven-publish` + id("org.openrewrite.rewrite") version "7.32.2" +} + +rewrite { + activeRecipe( + "org.apache.fesod.MigrateFastExcelToFesod", + ) +} +``` + +## Running the Migration + +### Preview Changes + +View what the recipe would change without modifying files: + +```bash +# Maven +# Output: target/site/rewrite/rewrite.patch +mvn rewrite:dryRun + +# Gradle +# Output: build/reports/rewrite/rewrite.patch +gradle rewriteDryRun +``` + +### Apply Changes + +Once satisfied with the preview, apply the changes: + +```bash +# Maven +mvn rewrite:run + +# Gradle +gradle rewriteRun +``` + +### Verify + +```bash +# Compile check +mvn compile +# or +gradle compileJava + +# Run tests +mvn test +# or +gradle test +``` + +## Before and After + +Before migration: + +```java +import cn.idev.excel.FastExcel; +import cn.idev.excel.annotation.ExcelProperty; +import cn.idev.excel.read.listener.ReadListener; + +FastExcel.write(outputStream, BookData.class) + .sheet("Sheet1") + .doWrite(data()); +``` + +After migration: + +```java +import org.apache.fesod.sheet.FesodSheet; +import org.apache.fesod.sheet.annotation.ExcelProperty; +import org.apache.fesod.sheet.read.listener.ReadListener; + +FesodSheet.write(outputStream, BookData.class) + .sheet("Sheet1") + .doWrite(data()); +``` + +## References + +- Apache Fesod Official Migration Guide: [https://fesod.apache.org/docs/migration/from-fastexcel/](https://fesod.apache.org/docs/migration/from-fastexcel/) +- OpenRewrite Documentation: [https://docs.openrewrite.org/](https://docs.openrewrite.org/) +- OpenRewrite Recipe Reference: [https://docs.openrewrite.org/recipes](https://docs.openrewrite.org/recipes) diff --git a/website/i18n/zh-cn/docusaurus-plugin-content-blog/2026-05-07-migration-from-fastexcel-with-openrewrite.md b/website/i18n/zh-cn/docusaurus-plugin-content-blog/2026-05-07-migration-from-fastexcel-with-openrewrite.md new file mode 100644 index 000000000..5aecc6fad --- /dev/null +++ b/website/i18n/zh-cn/docusaurus-plugin-content-blog/2026-05-07-migration-from-fastexcel-with-openrewrite.md @@ -0,0 +1,214 @@ +--- +title: "使用 OpenRewrite 从 FastExcel 1.3.0 自动迁移到 Apache Fesod (Incubating)" +description: 将 FastExcel 1.3 迁移至 Apache Fesod 2.0.1-incubating +authors: [bengbengbalabalabeng] +tags: [migration, fastexcel, fesod] +--- + +> 本文介绍如何利用 OpenRewrite 编写声明式迁移配置,将项目从 `cn.idev.excel:fastexcel:1.3.0` 迁移至 `org.apache.fesod:fesod-sheet:2.0.1-incubating`,适用于 Maven 与 Gradle 项目。 + + + +## 背景 + +FastExcel(`cn.idev.excel`)已捐赠给 Apache 软件基金会,孵化为 **Apache Fesod (Incubating)**。迁移的核心变化是 **Java 包路径替换**——API、注解和处理逻辑完全一致,属于低风险的机械重构。 + +官方迁移策略参考:[https://fesod.apache.org/docs/migration/from-fastexcel/](https://fesod.apache.org/docs/migration/from-fastexcel/) + +手动逐文件替换 import 既耗时又容易遗漏。OpenRewrite 提供了 AST 级别的代码变换能力,能精确、安全地完成这类批量迁移。 + +## 迁移范围 + +1. 更新 Maven/Gradle 依赖 +2. 将已废弃的类名替换为 `FesodSheet` +3. 更新包导入 + +## 编写 OpenRewrite Recipe + +在项目根目录创建文件 `rewrite.yml`: + +```yaml +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.apache.fesod.MigrateFastExcelToFesod +displayName: Migrate FastExcel 1.3 to Apache Fesod 2.0.1-incubating +recipeList: + + # 步骤 1:更新依赖 (Maven & Gradle) + - org.openrewrite.maven.ChangeDependencyGroupIdAndArtifactId: + oldGroupId: cn.idev.excel + oldArtifactId: fastexcel + newGroupId: org.apache.fesod + newArtifactId: fesod-sheet + newVersion: 2.0.1-incubating + - org.openrewrite.gradle.ChangeDependency: + oldGroupId: cn.idev.excel + oldArtifactId: fastexcel + newGroupId: org.apache.fesod + newArtifactId: fesod-sheet + newVersion: 2.0.1-incubating + + # 步骤 2:更新包导入 + - org.openrewrite.java.ChangePackage: + oldPackageName: cn.idev.excel + newPackageName: org.apache.fesod.sheet + recursive: true + - org.openrewrite.java.ChangePackage: + oldPackageName: org.apache.fesod.excel + newPackageName: org.apache.fesod.sheet + recursive: true + + # 步骤 3:重命名入口类 + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: org.apache.fesod.sheet.FastExcel + newFullyQualifiedTypeName: org.apache.fesod.sheet.FesodSheet + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: org.apache.fesod.sheet.FastExcelFactory + newFullyQualifiedTypeName: org.apache.fesod.sheet.FesodSheet + + - org.openrewrite.text.FindAndReplace: + find: ByFastExcelCGLIB + replace: ByFesodCGLIB + filePattern: "**/*.java" +``` + +### 执行逻辑解析 + +Recipe 按声明顺序依次执行,分为四个步骤: + +**Step 1 — 更新依赖**:Maven 项目触发第一条规则修改 `pom.xml`;Gradle 项目触发第二条规则修改 `build.gradle` / `build.gradle.kts`。如果项目只使用其中一种构建工具,另一条规则自动跳过,不会报错。 + +**Step 2 — 更新包导入**:`ChangePackage(recursive=true)` 一条规则覆盖 `cn.idev.excel` 下所有子包(annotation、read、write、converters、enums 等),无需逐个枚举。第二条规则处理已部分迁移到 `org.apache.fesod.excel` 的遗留代码。这一步会将 `cn.idev.excel.FastExcel` 的 import 改为 `org.apache.fesod.sheet.FastExcel`(Fesod 中的 `@Deprecated` 桥接类)。 + +**Step 3 — 重命名入口类**:Step 2 完成后,所有 `FastExcel` 和 `FastExcelFactory` 的 import 已统一指向 `org.apache.fesod.sheet` 包。此时只需两条 `ChangeType` 规则,将它们改为正式的 `FesodSheet` 类,同时自动处理所有调用点(`FastExcel.read()`、`FastExcel.write()` 等)和类型引用(变量声明、类字面量)。 + +**Step 4 — CGLIB 字符串替换**:仅对引用了 CGLIB 生成类名的代码生效,多数项目不需要此步骤,不匹配则自动跳过。 + +## 在项目中引入 OpenRewrite + +### Maven 项目 + +在 `pom.xml` 中添加插件: + +```xml + + org.openrewrite.maven + rewrite-maven-plugin + 6.38.0 + + + org.apache.fesod.MigrateFastExcelToFesod + + + +``` + +### Gradle (Groovy) + +在 `build.gradle` 中引入: + +```groovy +plugins { + id 'java' + id 'maven-publish' + id 'org.openrewrite.rewrite' version '7.32.2' +} + +rewrite { + activeRecipe( + 'org.apache.fesod.MigrateFastExcelToFesod', + ) +} +``` + +### Gradle (Kotlin) + +```kotlin +plugins { + `java-library` + `maven-publish` + id("org.openrewrite.rewrite") version "7.32.2" +} + +rewrite { + activeRecipe( + "org.apache.fesod.MigrateFastExcelToFesod", + ) +} +``` + +## 执行迁移 + +### 预览变更 + +先查看 Recipe 会产生哪些修改,不实际改动文件: + +```bash +# Maven +# 默认输出路径:target/site/rewrite/rewrite.patch +mvn rewrite:dryRun + +# Gradle +# 默认输出路径:build/reports/rewrite/rewrite.patch +gradle rewriteDryRun +``` + +输出会列出所有即将修改的文件和具体变更内容。 + +### 执行迁移 + +确认无误后,执行实际修改: + +```bash +# Maven +mvn rewrite:run + +# Gradle +gradle rewriteRun +``` + +### 验证 + +```bash +# 编译检查 +mvn compile +# 或 +gradle compileJava + +# 运行测试 +mvn test +# 或 +gradle test +``` + +## 迁移效果示例 + +迁移前: + +```java +import cn.idev.excel.FastExcel; +import cn.idev.excel.annotation.ExcelProperty; +import cn.idev.excel.read.listener.ReadListener; + +FastExcel.write(outputStream, BookData.class) + .sheet("Sheet1") + .doWrite(data()); +``` + +迁移后: + +```java +import org.apache.fesod.sheet.FesodSheet; +import org.apache.fesod.sheet.annotation.ExcelProperty; +import org.apache.fesod.sheet.read.listener.ReadListener; + +FesodSheet.write(outputStream, BookData.class) + .sheet("Sheet1") + .doWrite(data()); +``` + +## 参考 + +- Apache Fesod 官方迁移指南:[https://fesod.apache.org/docs/migration/from-fastexcel/](https://fesod.apache.org/docs/migration/from-fastexcel/) +- OpenRewrite 官方文档:[https://docs.openrewrite.org/](https://docs.openrewrite.org/) +- OpenRewrite Recipe 参考:[https://docs.openrewrite.org/recipes](https://docs.openrewrite.org/recipes)