[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6AD34ANHN9W8NPFDN6EZ9VT":3,"skill-same:01M6AD34ANHN9W8NPFDN6EZ9VT":79},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":45,"linkOnly":46,"markdownContent":47,"markdownBody":48,"frontMatter":49,"refName":50,"commitSha":51,"skillDirectory":52,"forksCount":53,"repositoryHtmlUrl":54,"repositoryHomepageUrl":55,"ownerHtmlUrl":56,"ownerBlogUrl":57,"ownerDescription":6,"updatedAt":58,"install":59,"resources":72},"01M6AD34ANHN9W8NPFDN6EZ9VT","fastexcel-to-fesod",null,"Migrates a Java project from FastExcel 1.3 (cn.idev.excel:fastexcel:1.3.0) to Apache Fesod (org.apache.fesod:fesod-sheet:2.0.1-incubating). Invoke this skill when asked to \"migrate FastExcel to Fesod\", \"upgrade to Apache Fesod\", or \"replace cn.idev.excel\". FastExcel 1.3 is the direct predecessor of Apache Fesod. Supports both legacy namespaces seen in real projects: cn.idev.excel.* and org.apache.fesod.excel.*. The entry classes FastExcel and FastExcelFactory are kept as @Deprecated aliases in Fesod, so call-site renames are strongly recommended but NOT required for compilation. The only breaking change is the Java package prefix.","apache\u002Ffesod","apache","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F47359?v=4","01M6AC83E6K4FDKK7HZ8WNMQKE","The Apache Software Foundation","01M6AD325T05QVZ6R8Z8GHTZY8",6287,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fapache\u002Ffesod\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Ffastexcel-to-fesod\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000004","电子表格","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,9,44],"fastexcel","fastexcel to fesod","only","when","invoke","deprecated","for","namespaces","org","as","project","upgrade","but","xlsx","direct","projects","breaking change","migrate","java","package","change","2026-11-10 10:12:30",false,"---\nname: fastexcel-to-fesod\ndescription: >\n  Migrates a Java project from FastExcel 1.3 (cn.idev.excel:fastexcel:1.3.0)\n  to Apache Fesod (org.apache.fesod:fesod-sheet:2.0.1-incubating).\n  Invoke this skill when asked to \"migrate FastExcel to Fesod\",\n  \"upgrade to Apache Fesod\", or \"replace cn.idev.excel\".\n  FastExcel 1.3 is the direct predecessor of Apache Fesod.\n  Supports both legacy namespaces seen in real projects:\n  cn.idev.excel.* and org.apache.fesod.excel.*.\n  The entry classes FastExcel and FastExcelFactory are kept as @Deprecated\n  aliases in Fesod, so call-site renames are strongly recommended but NOT\n  required for compilation. The only breaking change is the Java package prefix.\n---\n\n\u003C!--\n- Licensed to the Apache Software Foundation (ASF) under one or more\n- contributor license agreements.  See the NOTICE file distributed with\n- this work for additional information regarding copyright ownership.\n- The ASF licenses this file to You under the Apache License, Version 2.0\n- (the \"License\"); you may not use this file except in compliance with\n- the License.  You may obtain a copy of the License at\n-\n-   http:\u002F\u002Fwww.apache.org\u002Flicenses\u002FLICENSE-2.0\n-\n- Unless required by applicable law or agreed to in writing, software\n- distributed under the License is distributed on an \"AS IS\" BASIS,\n- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- See the License for the specific language governing permissions and\n- limitations under the License.\n-->\n\n# FastExcel 1.3 → Apache Fesod Migration Skill\n\n## Background\n\nFastExcel (`cn.idev.excel:fastexcel:1.3.0`) was donated to the Apache Software\nFoundation and reborn as **Apache Fesod (Incubating)**.\nThe latest stable release is `2.0.1-incubating`.\n\nKey facts that affect how this migration works:\n\n- `cn.idev.excel.FastExcel` and `cn.idev.excel.FastExcelFactory` are renamed,\n  but Fesod ships **`@Deprecated` bridge subclasses** at\n  `org.apache.fesod.sheet.FastExcel` and `org.apache.fesod.sheet.FastExcelFactory`\n  so existing call sites compile after a package-only swap.\n- The **only hard breaking change** is the Java package prefix:\n  any `*.excel.*` imports must move to `*.sheet.*`.\n  In practice, both of these are common and must be handled:\n    - `cn.idev.excel.*` → `org.apache.fesod.sheet.*`\n    - `org.apache.fesod.excel.*` → `org.apache.fesod.sheet.*`\n- The CGLIB naming tag changed from `ByFastExcelCGLIB` → `ByFesodCGLIB`.\n  This only matters if the project inspects generated class names at runtime.\n- All annotation names, method signatures, and processing logic are identical.\n\nThe official Fesod migration doc recommends a **three-phase gradual approach**;\nthis skill implements all three phases in one pass, but each phase is\nclearly labelled so the developer can stop after Phase 1 or Phase 2 if needed.\n\n---\n\n## Phase 1 — Dependency swap (REQUIRED, zero code changes)\n\nThis phase alone is sufficient to make the project compile and run on Fesod\nwith deprecation warnings. It is always safe to stop here first and run tests.\n\n### 1a. Maven — single-module project\n\nIn `pom.xml`, find the FastExcel dependency block:\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>cn.idev.excel\u003C\u002FgroupId>\n    \u003CartifactId>fastexcel\u003C\u002FartifactId>\n    \u003Cversion>...\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\nReplace it with:\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>org.apache.fesod\u003C\u002FgroupId>\n    \u003CartifactId>fesod-sheet\u003C\u002FartifactId>\n    \u003Cversion>2.0.1-incubating\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\nAlso remove the FastExcel version property if it exists, e.g.:\n\n```xml\n\u003Cfastexcel.version>1.3.0\u003C\u002Ffastexcel.version>\n```\n\n### 1b. Gradle\n\nIn `build.gradle` (or `build.gradle.kts`), replace:\n\n```groovy\n\u002F\u002F Groovy DSL\nimplementation 'cn.idev.excel:fastexcel:1.3.0'\n```\n\nwith:\n\n```groovy\nimplementation 'org.apache.fesod:fesod-sheet:2.0.1-incubating'\n```\n\nKotlin DSL:\n\n```kotlin\nimplementation(\"org.apache.fesod:fesod-sheet:2.0.1-incubating\")\n```\n\n---\n\n## Phase 2 — Package import rename (REQUIRED for compilation)\n\nAfter swapping the dependency, any import under `*.excel.*` can be unresolved.\nApply the following substitutions to every `.java` file in the project.\n\nProcess the table **top-to-bottom** (most specific first) to avoid partial replacements.\n\n### 2x. Scope guardrails (IMPORTANT)\n\nTo avoid accidental regressions, apply replacements only in migration-relevant code.\n\n- ✅ Safe targets:\n    - `import ...` lines under `cn.idev.excel.*` \u002F `org.apache.fesod.excel.*`\n    - static call sites such as `FastExcel.read(` \u002F `FastExcel.write(` \u002F `FastExcelFactory.*(`\n- ❌ Do **not** bulk-replace whole files or whole repositories for `FastExcel` text.\n- ❌ Do **not** modify business literals unless explicitly requested:\n    - `@ExcelProperty(\"...\")` labels\n    - sheet names \u002F file names \u002F i18n text\n    - controller response strings\n- ❌ Do **not** rewrite comments\u002FJavadoc as part of mechanical migration.\n\nIf you use scripted replacement, constrain the pattern to imports and call expressions,\nthen review diffs before running tests.\n\n### 2a0. Pre-migrated namespace cleanup (very common)\n\nSome repositories are already partially migrated and use `org.apache.fesod.excel.*`\nwhile still depending on older artifacts. After moving to `fesod-sheet`, these\nimports must be rewritten to `org.apache.fesod.sheet.*`.\n\nApply this explicit replacement before the detailed mapping table:\n\n| Find                             | Replace with                     |\n|----------------------------------|----------------------------------|\n| `import org.apache.fesod.excel.` | `import org.apache.fesod.sheet.` |\n\nThen continue with the specific import mappings below.\n\n### 2a. Core entry classes\n\n| Find (exact import string)               | Replace with                                      |\n|------------------------------------------|---------------------------------------------------|\n| `import cn.idev.excel.FastExcel;`        | `import org.apache.fesod.sheet.FastExcel;`        |\n| `import cn.idev.excel.FastExcelFactory;` | `import org.apache.fesod.sheet.FastExcelFactory;` |\n| `import cn.idev.excel.ExcelWriter;`      | `import org.apache.fesod.sheet.ExcelWriter;`      |\n| `import cn.idev.excel.ExcelReader;`      | `import org.apache.fesod.sheet.ExcelReader;`      |\n\n> **Note**: After this phase, `FastExcel.read(...)` and `FastExcelFactory.writerSheet(...)`\n> still compile — they resolve to the `@Deprecated` bridge classes in Fesod.\n> Phase 3 replaces them with the canonical `FesodSheet` class.\n\n### 2b. Read API\n\n| Find                                                         | Replace with                                                          |\n|--------------------------------------------------------------|-----------------------------------------------------------------------|\n| `import cn.idev.excel.read.listener.ReadListener;`           | `import org.apache.fesod.sheet.read.listener.ReadListener;`           |\n| `import cn.idev.excel.read.listener.PageReadListener;`       | `import org.apache.fesod.sheet.read.listener.PageReadListener;`       |\n| `import cn.idev.excel.read.metadata.ReadSheet;`              | `import org.apache.fesod.sheet.read.metadata.ReadSheet;`              |\n| `import cn.idev.excel.read.metadata.ReadWorkbook;`           | `import org.apache.fesod.sheet.read.metadata.ReadWorkbook;`           |\n| `import cn.idev.excel.read.metadata.ReadBasicParameter;`     | `import org.apache.fesod.sheet.read.metadata.ReadBasicParameter;`     |\n| `import cn.idev.excel.read.builder.ExcelReaderBuilder;`      | `import org.apache.fesod.sheet.read.builder.ExcelReaderBuilder;`      |\n| `import cn.idev.excel.read.builder.ExcelReaderSheetBuilder;` | `import org.apache.fesod.sheet.read.builder.ExcelReaderSheetBuilder;` |\n| `import cn.idev.excel.context.AnalysisContext;`              | `import org.apache.fesod.sheet.context.AnalysisContext;`              |\n| `import cn.idev.excel.event.SyncReadListener;`               | `import org.apache.fesod.sheet.event.SyncReadListener;`               |\n\n### 2c. Write API\n\n| Find                                                          | Replace with                                                           |\n|---------------------------------------------------------------|------------------------------------------------------------------------|\n| `import cn.idev.excel.write.metadata.WriteSheet;`             | `import org.apache.fesod.sheet.write.metadata.WriteSheet;`             |\n| `import cn.idev.excel.write.metadata.WriteWorkbook;`          | `import org.apache.fesod.sheet.write.metadata.WriteWorkbook;`          |\n| `import cn.idev.excel.write.metadata.WriteTable;`             | `import org.apache.fesod.sheet.write.metadata.WriteTable;`             |\n| `import cn.idev.excel.write.metadata.WriteBasicParameter;`    | `import org.apache.fesod.sheet.write.metadata.WriteBasicParameter;`    |\n| `import cn.idev.excel.write.builder.ExcelWriterBuilder;`      | `import org.apache.fesod.sheet.write.builder.ExcelWriterBuilder;`      |\n| `import cn.idev.excel.write.builder.ExcelWriterSheetBuilder;` | `import org.apache.fesod.sheet.write.builder.ExcelWriterSheetBuilder;` |\n| `import cn.idev.excel.write.builder.ExcelWriterTableBuilder;` | `import org.apache.fesod.sheet.write.builder.ExcelWriterTableBuilder;` |\n\n### 2d. Write handlers\n\n| Find                                                                  | Replace with                                                                   |\n|-----------------------------------------------------------------------|--------------------------------------------------------------------------------|\n| `import cn.idev.excel.write.handler.WriteHandler;`                    | `import org.apache.fesod.sheet.write.handler.WriteHandler;`                    |\n| `import cn.idev.excel.write.handler.SheetWriteHandler;`               | `import org.apache.fesod.sheet.write.handler.SheetWriteHandler;`               |\n| `import cn.idev.excel.write.handler.CellWriteHandler;`                | `import org.apache.fesod.sheet.write.handler.CellWriteHandler;`                |\n| `import cn.idev.excel.write.handler.RowWriteHandler;`                 | `import org.apache.fesod.sheet.write.handler.RowWriteHandler;`                 |\n| `import cn.idev.excel.write.handler.WorkbookWriteHandler;`            | `import org.apache.fesod.sheet.write.handler.WorkbookWriteHandler;`            |\n| `import cn.idev.excel.write.handler.context.CellWriteHandlerContext;` | `import org.apache.fesod.sheet.write.handler.context.CellWriteHandlerContext;` |\n\n### 2e. Annotations\n\n| Find                                                             | Replace with                                                              |\n|------------------------------------------------------------------|---------------------------------------------------------------------------|\n| `import cn.idev.excel.annotation.ExcelProperty;`                 | `import org.apache.fesod.sheet.annotation.ExcelProperty;`                 |\n| `import cn.idev.excel.annotation.ExcelIgnore;`                   | `import org.apache.fesod.sheet.annotation.ExcelIgnore;`                   |\n| `import cn.idev.excel.annotation.ExcelIgnoreUnannotated;`        | `import org.apache.fesod.sheet.annotation.ExcelIgnoreUnannotated;`        |\n| `import cn.idev.excel.annotation.format.DateTimeFormat;`         | `import org.apache.fesod.sheet.annotation.format.DateTimeFormat;`         |\n| `import cn.idev.excel.annotation.format.NumberFormat;`           | `import org.apache.fesod.sheet.annotation.format.NumberFormat;`           |\n| `import cn.idev.excel.annotation.write.style.ColumnWidth;`       | `import org.apache.fesod.sheet.annotation.write.style.ColumnWidth;`       |\n| `import cn.idev.excel.annotation.write.style.HeadStyle;`         | `import org.apache.fesod.sheet.annotation.write.style.HeadStyle;`         |\n| `import cn.idev.excel.annotation.write.style.ContentStyle;`      | `import org.apache.fesod.sheet.annotation.write.style.ContentStyle;`      |\n| `import cn.idev.excel.annotation.write.style.HeadFontStyle;`     | `import org.apache.fesod.sheet.annotation.write.style.HeadFontStyle;`     |\n| `import cn.idev.excel.annotation.write.style.ContentFontStyle;`  | `import org.apache.fesod.sheet.annotation.write.style.ContentFontStyle;`  |\n| `import cn.idev.excel.annotation.write.style.HeadRowHeight;`     | `import org.apache.fesod.sheet.annotation.write.style.HeadRowHeight;`     |\n| `import cn.idev.excel.annotation.write.style.ContentRowHeight;`  | `import org.apache.fesod.sheet.annotation.write.style.ContentRowHeight;`  |\n| `import cn.idev.excel.annotation.write.style.OnceAbsoluteMerge;` | `import org.apache.fesod.sheet.annotation.write.style.OnceAbsoluteMerge;` |\n| `import cn.idev.excel.annotation.write.style.ContentLoopMerge;`  | `import org.apache.fesod.sheet.annotation.write.style.ContentLoopMerge;`  |\n\n### 2f. Converters\n\n| Find                                                     | Replace with                                                      |\n|----------------------------------------------------------|-------------------------------------------------------------------|\n| `import cn.idev.excel.converters.Converter;`             | `import org.apache.fesod.sheet.converters.Converter;`             |\n| `import cn.idev.excel.converters.AutoConverter;`         | `import org.apache.fesod.sheet.converters.AutoConverter;`         |\n| `import cn.idev.excel.converters.ReadConverterContext;`  | `import org.apache.fesod.sheet.converters.ReadConverterContext;`  |\n| `import cn.idev.excel.converters.WriteConverterContext;` | `import org.apache.fesod.sheet.converters.WriteConverterContext;` |\n\n### 2g. Enums\n\n| Find                                                      | Replace with                                                       |\n|-----------------------------------------------------------|--------------------------------------------------------------------|\n| `import cn.idev.excel.enums.CellDataTypeEnum;`            | `import org.apache.fesod.sheet.enums.CellDataTypeEnum;`            |\n| `import cn.idev.excel.enums.CellExtraTypeEnum;`           | `import org.apache.fesod.sheet.enums.CellExtraTypeEnum;`           |\n| `import cn.idev.excel.enums.WriteDirectionEnum;`          | `import org.apache.fesod.sheet.enums.WriteDirectionEnum;`          |\n| `import cn.idev.excel.enums.poi.HorizontalAlignmentEnum;` | `import org.apache.fesod.sheet.enums.poi.HorizontalAlignmentEnum;` |\n| `import cn.idev.excel.enums.poi.BorderStyleEnum;`         | `import org.apache.fesod.sheet.enums.poi.BorderStyleEnum;`         |\n| `import cn.idev.excel.enums.poi.FillPatternTypeEnum;`     | `import org.apache.fesod.sheet.enums.poi.FillPatternTypeEnum;`     |\n\n### 2h. Exceptions and metadata\n\n| Find                                                           | Replace with                                                            |\n|----------------------------------------------------------------|-------------------------------------------------------------------------|\n| `import cn.idev.excel.exception.ExcelAnalysisException;`       | `import org.apache.fesod.sheet.exception.ExcelAnalysisException;`       |\n| `import cn.idev.excel.exception.ExcelAnalysisStopException;`   | `import org.apache.fesod.sheet.exception.ExcelAnalysisStopException;`   |\n| `import cn.idev.excel.exception.ExcelCommonException;`         | `import org.apache.fesod.sheet.exception.ExcelCommonException;`         |\n| `import cn.idev.excel.exception.ExcelGenerateException;`       | `import org.apache.fesod.sheet.exception.ExcelGenerateException;`       |\n| `import cn.idev.excel.metadata.data.WriteCellData;`            | `import org.apache.fesod.sheet.metadata.data.WriteCellData;`            |\n| `import cn.idev.excel.metadata.data.ReadCellData;`             | `import org.apache.fesod.sheet.metadata.data.ReadCellData;`             |\n| `import cn.idev.excel.metadata.CellExtra;`                     | `import org.apache.fesod.sheet.metadata.CellExtra;`                     |\n| `import cn.idev.excel.metadata.Head;`                          | `import org.apache.fesod.sheet.metadata.Head;`                          |\n| `import cn.idev.excel.metadata.property.ExcelContentProperty;` | `import org.apache.fesod.sheet.metadata.property.ExcelContentProperty;` |\n\n### 2i. Renamed helper classes (conditional)\n\nOnly if the project references these classes directly (rare — they are\nmostly internal). Rename the type and update the import together:\n\n| Find (exact import string)                              | Replace with                                                     |\n|---------------------------------------------------------|------------------------------------------------------------------|\n| `import cn.idev.excel.constant.FastExcelConstants;`     | `import org.apache.fesod.sheet.constant.FesodSheetConstants;`    |\n| `import cn.idev.excel.util.FastExcelTempFileCreationStrategy;` | `import org.apache.fesod.sheet.util.FesodTempFileCreationStrategy;` |\n| `import cn.idev.excel.util.BeanMapUtils;`               | `import org.apache.fesod.sheet.util.BeanMapUtils;` + rename usages `BeanMapUtils.FastExcelNamingPolicy` → `BeanMapUtils.FesodSheetNamingPolicy` (the nested class was renamed; the import itself stays `BeanMapUtils`) |\n\n### 2j. Utility classes moved to fesod-common (conditional)\n\nFastExcel 1.3 kept these under `cn.idev.excel.util`; Fesod moved them to the\n`fesod-common` module. Only apply if the project imports them directly (e.g.\ncustom converters or strategies):\n\n| Find                              | Replace with                        |\n|-----------------------------------|-------------------------------------|\n| `import cn.idev.excel.util.StringUtils;`   | `import org.apache.fesod.common.util.StringUtils;`   |\n| `import cn.idev.excel.util.IoUtils;`       | `import org.apache.fesod.common.util.IoUtils;`       |\n| `import cn.idev.excel.util.MapUtils;`      | `import org.apache.fesod.common.util.MapUtils;`      |\n| `import cn.idev.excel.util.ListUtils;`     | `import org.apache.fesod.common.util.ListUtils;`     |\n| `import cn.idev.excel.util.BooleanUtils;`  | `import org.apache.fesod.common.util.BooleanUtils;`  |\n| `import cn.idev.excel.util.IntUtils;`      | `import org.apache.fesod.common.util.IntUtils;`      |\n| `import cn.idev.excel.util.MemberUtils;`   | `import org.apache.fesod.common.util.MemberUtils;`   |\n| `import cn.idev.excel.util.PositionUtils;` | `import org.apache.fesod.common.util.PositionUtils;` |\n\n### 2k. Wildcard catch-all (apply LAST)\n\nAfter all specific replacements above, scan for any remaining wildcard imports:\n\n| Find                             | Replace with                     |\n|----------------------------------|----------------------------------|\n| `import cn.idev.excel.`          | `import org.apache.fesod.sheet.` |\n| `import org.apache.fesod.excel.` | `import org.apache.fesod.sheet.` |\n\nApply this only after all the specific rules above (including 2i\u002F2j), as a\nsafety net. Do NOT let the wildcard rule rewrite `cn.idev.excel.util` to\n`org.apache.fesod.sheet.util` — those classes moved to fesod-common (rule 2j).\n\n---\n\n## Phase 3 — Entry class rename (STRONGLY RECOMMENDED)\n\n`FastExcel` and `FastExcelFactory` compile in Fesod but are `@Deprecated` and\n**will be removed in a future release**. Replace all call sites with `FesodSheet`.\n\n### 3a. Import replacement\n\n| Find                                              | Replace with                                |\n|---------------------------------------------------|---------------------------------------------|\n| `import org.apache.fesod.sheet.FastExcel;`        | `import org.apache.fesod.sheet.FesodSheet;` |\n| `import org.apache.fesod.sheet.FastExcelFactory;` | `import org.apache.fesod.sheet.FesodSheet;` |\n\n### 3b. Call site replacement — FastExcel\n\n| Find                     | Replace with              |\n|--------------------------|---------------------------|\n| `FastExcel.read(`        | `FesodSheet.read(`        |\n| `FastExcel.write(`       | `FesodSheet.write(`       |\n| `FastExcel.writerSheet(` | `FesodSheet.writerSheet(` |\n| `FastExcel.readSheet(`   | `FesodSheet.readSheet(`   |\n| `FastExcel.writerTable(` | `FesodSheet.writerTable(` |\n\n### 3c. Call site replacement — FastExcelFactory\n\nFastExcel 1.3 shipped `FastExcelFactory` as a second entry class with an\nidentical API surface. All of its static methods map directly to `FesodSheet`:\n\n| Find                            | Replace with              |\n|---------------------------------|---------------------------|\n| `FastExcelFactory.read(`        | `FesodSheet.read(`        |\n| `FastExcelFactory.write(`       | `FesodSheet.write(`       |\n| `FastExcelFactory.writerSheet(` | `FesodSheet.writerSheet(` |\n| `FastExcelFactory.readSheet(`   | `FesodSheet.readSheet(`   |\n| `FastExcelFactory.writerTable(` | `FesodSheet.writerTable(` |\n\n### 3d. Type reference rename\n\nIf `FastExcel` or `FastExcelFactory` appear as a **type name** (not a call site),\nrename those too:\n\n- Variable type: `FastExcel x = ...` → `FesodSheet x = ...`\n- Class literal: `FastExcel.class` → `FesodSheet.class`\n\n`ExcelWriter` and `ExcelReader` are **not renamed** — they keep the same class name.\n\n---\n\n## Phase 4 — CGLIB class name (conditional)\n\nThis phase only applies if the project contains code that **inspects or asserts\non generated CGLIB class names at runtime**, for example in tests or serialisation logic.\n\nSearch all `.java` files for the string `ByFastExcelCGLIB`.\nIf found, replace with `ByFesodCGLIB`.\n\nIn Fesod, the naming policy is defined in\n`org.apache.fesod.sheet.util.BeanMapUtils.FesodSheetNamingPolicy` and its\n`getTag()` returns `\"ByFesodCGLIB\"`.\n\nIf no file references `ByFastExcelCGLIB`, skip this phase entirely.\n\n---\n\n## Phase 5 — Encoding and text safety (RECOMMENDED)\n\nThis phase prevents encoding-related breakage on Windows locales (for example GBK terminals).\n\n- Keep source files in UTF-8; do not run global \"remove non-ASCII\" replacements.\n- If compilation reports unmappable characters, fix only the specific broken lines.\n- Prefer preserving existing business-language strings (Chinese\u002FEnglish\u002Fetc.) unless the task\n  explicitly asks to normalize or translate them.\n- If a replacement tool introduces malformed characters (e.g. `�?`), revert those hunks and\n  re-apply scoped replacements.\n\n---\n\n## Phase 6 — New Fesod-only features (OPTIONAL, informational)\n\nFesod ships features that did not exist in FastExcel 1.3.0. They are NOT part\nof the migration — mention them in the summary only if the developer's project\ncould benefit, without rewriting any existing code:\n\n- `@FreezePane` (`org.apache.fesod.sheet.annotation.write.style`) — freeze rows\u002Fcolumns on write.\n- URL image security (`org.apache.fesod.sheet.converters.url`) — `UrlImageFetchPolicy` with `SchemePolicy` and `CidrBlock` guard the URL image converter against SSRF.\n- `StringBase64ImageConverter` \u002F `StringPathnameImageConverter` (`org.apache.fesod.sheet.converters.string`) — explicit string-to-image conversion (base64 \u002F file path), alongside the legacy `StringImageConverter`.\n- `HeadBuilder` \u002F `DefaultHeadBuilder` (`org.apache.fesod.sheet.metadata`) — fluent No-Bean header construction via `.head(builder -> ...)`.\n- `HeaderMergeStrategy` (`org.apache.fesod.sheet.enums`) — `NONE` \u002F `HORIZONTAL_ONLY` \u002F `VERTICAL_ONLY` \u002F `FULL_RECTANGLE` \u002F `AUTO` via `headerMergeStrategy(...)`, superseding `automaticMergeHead`.\n\n---\n\n## Verification\n\nAfter completing the desired phases, confirm the following:\n\n**Must be true after Phase 2:**\n\n- No `.java` file contains `import cn.idev.excel.`\n- No `.java` file contains `import org.apache.fesod.excel.`\n- No `pom.xml` or `build.gradle` references `cn.idev.excel`\n- If 2i applied: no `.java` file references `FastExcelConstants`, `FastExcelTempFileCreationStrategy`, or `BeanMapUtils.FastExcelNamingPolicy`; check `.java` files for `FastExcelNamingPolicy` → renamed to `FesodSheetNamingPolicy`\n- If 2j applied: no `.java` file contains `cn.idev.excel.util.StringUtils` (or any of the 8 moved utils); check for `import cn.idev.excel.util.` — must be gone (wildcard rule 2k must not have rewritten these to `org.apache.fesod.sheet.util`)\n\n**Must be true after Phase 3 (additional):**\n\n- No `.java` file calls `FastExcel.` or `FastExcelFactory.` as a static call site\n- No `.java` file imports `org.apache.fesod.sheet.FastExcel` or\n  `org.apache.fesod.sheet.FastExcelFactory`\n\n**Must be true after Phase 4 (if applicable):**\n\n- No `.java` file contains the string `ByFastExcelCGLIB`\n\n**Must be true after Phase 5 (recommended):**\n\n- No malformed replacement artifacts such as `�?` remain in source files\n- No unintended changes in business literals (headers\u002Fsheet names\u002Fmessages) unless requested\n- No accidental rewrites in comments\u002FJavadoc caused by mechanical replace\n\nRun the project's existing test suite to confirm functional equivalence:\n\n```\n# Maven\nmvn clean test\n\n# Gradle\n.\u002Fgradlew clean test\n```\n\nIf tests fail with runtime messages like `Unresolved compilation problem`, rerun\nwith a clean build first (`mvn clean test` \u002F `.\u002Fgradlew clean test`) to avoid\nstale compiled classes masking the real source-level error.\n\n---\n\n## Migration summary output\n\nAfter applying all changes, produce a table in this format:\n\n```\n## Migration Summary\n\n| Phase | File | Changes |\n|---|---|---|\n| 1 | pom.xml | Replaced cn.idev.excel:fastexcel:1.3.0 with org.apache.fesod:fesod-sheet:2.0.1-incubating |\n| 2 | src\u002F...\u002FFoo.java | N import statements updated (cn.idev.excel → org.apache.fesod.sheet) |\n| 3 | src\u002F...\u002FBar.java | M FastExcel.\u002FFastExcelFactory. call sites renamed to FesodSheet. |\n| 4 | src\u002F...\u002FBaz.java | ByFastExcelCGLIB → ByFesodCGLIB (if applicable) |\n| 5 | src\u002F...\u002FQux.java | Encoding\u002Fliteral safety check passed (no malformed artifacts \u002F no unintended literal rewrites) |\n\nRemaining cn.idev.excel references : 0 ✅\nRemaining FastExcel. call sites    : 0 ✅  (or N ⚠️  if Phase 3 was skipped)\nRemaining ByFastExcelCGLIB refs    : 0 ✅  (or skipped — not present)\n```\n","\u003C!--\n- Licensed to the Apache Software Foundation (ASF) under one or more\n- contributor license agreements.  See the NOTICE file distributed with\n- this work for additional information regarding copyright ownership.\n- The ASF licenses this file to You under the Apache License, Version 2.0\n- (the \"License\"); you may not use this file except in compliance with\n- the License.  You may obtain a copy of the License at\n-\n-   http:\u002F\u002Fwww.apache.org\u002Flicenses\u002FLICENSE-2.0\n-\n- Unless required by applicable law or agreed to in writing, software\n- distributed under the License is distributed on an \"AS IS\" BASIS,\n- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- See the License for the specific language governing permissions and\n- limitations under the License.\n-->\n\n# FastExcel 1.3 → Apache Fesod Migration Skill\n\n## Background\n\nFastExcel (`cn.idev.excel:fastexcel:1.3.0`) was donated to the Apache Software\nFoundation and reborn as **Apache Fesod (Incubating)**.\nThe latest stable release is `2.0.1-incubating`.\n\nKey facts that affect how this migration works:\n\n- `cn.idev.excel.FastExcel` and `cn.idev.excel.FastExcelFactory` are renamed,\n  but Fesod ships **`@Deprecated` bridge subclasses** at\n  `org.apache.fesod.sheet.FastExcel` and `org.apache.fesod.sheet.FastExcelFactory`\n  so existing call sites compile after a package-only swap.\n- The **only hard breaking change** is the Java package prefix:\n  any `*.excel.*` imports must move to `*.sheet.*`.\n  In practice, both of these are common and must be handled:\n    - `cn.idev.excel.*` → `org.apache.fesod.sheet.*`\n    - `org.apache.fesod.excel.*` → `org.apache.fesod.sheet.*`\n- The CGLIB naming tag changed from `ByFastExcelCGLIB` → `ByFesodCGLIB`.\n  This only matters if the project inspects generated class names at runtime.\n- All annotation names, method signatures, and processing logic are identical.\n\nThe official Fesod migration doc recommends a **three-phase gradual approach**;\nthis skill implements all three phases in one pass, but each phase is\nclearly labelled so the developer can stop after Phase 1 or Phase 2 if needed.\n\n---\n\n## Phase 1 — Dependency swap (REQUIRED, zero code changes)\n\nThis phase alone is sufficient to make the project compile and run on Fesod\nwith deprecation warnings. It is always safe to stop here first and run tests.\n\n### 1a. Maven — single-module project\n\nIn `pom.xml`, find the FastExcel dependency block:\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>cn.idev.excel\u003C\u002FgroupId>\n    \u003CartifactId>fastexcel\u003C\u002FartifactId>\n    \u003Cversion>...\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\nReplace it with:\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>org.apache.fesod\u003C\u002FgroupId>\n    \u003CartifactId>fesod-sheet\u003C\u002FartifactId>\n    \u003Cversion>2.0.1-incubating\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\nAlso remove the FastExcel version property if it exists, e.g.:\n\n```xml\n\u003Cfastexcel.version>1.3.0\u003C\u002Ffastexcel.version>\n```\n\n### 1b. Gradle\n\nIn `build.gradle` (or `build.gradle.kts`), replace:\n\n```groovy\n\u002F\u002F Groovy DSL\nimplementation 'cn.idev.excel:fastexcel:1.3.0'\n```\n\nwith:\n\n```groovy\nimplementation 'org.apache.fesod:fesod-sheet:2.0.1-incubating'\n```\n\nKotlin DSL:\n\n```kotlin\nimplementation(\"org.apache.fesod:fesod-sheet:2.0.1-incubating\")\n```\n\n---\n\n## Phase 2 — Package import rename (REQUIRED for compilation)\n\nAfter swapping the dependency, any import under `*.excel.*` can be unresolved.\nApply the following substitutions to every `.java` file in the project.\n\nProcess the table **top-to-bottom** (most specific first) to avoid partial replacements.\n\n### 2x. Scope guardrails (IMPORTANT)\n\nTo avoid accidental regressions, apply replacements only in migration-relevant code.\n\n- ✅ Safe targets:\n    - `import ...` lines under `cn.idev.excel.*` \u002F `org.apache.fesod.excel.*`\n    - static call sites such as `FastExcel.read(` \u002F `FastExcel.write(` \u002F `FastExcelFactory.*(`\n- ❌ Do **not** bulk-replace whole files or whole repositories for `FastExcel` text.\n- ❌ Do **not** modify business literals unless explicitly requested:\n    - `@ExcelProperty(\"...\")` labels\n    - sheet names \u002F file names \u002F i18n text\n    - controller response strings\n- ❌ Do **not** rewrite comments\u002FJavadoc as part of mechanical migration.\n\nIf you use scripted replacement, constrain the pattern to imports and call expressions,\nthen review diffs before running tests.\n\n### 2a0. Pre-migrated namespace cleanup (very common)\n\nSome repositories are already partially migrated and use `org.apache.fesod.excel.*`\nwhile still depending on older artifacts. After moving to `fesod-sheet`, these\nimports must be rewritten to `org.apache.fesod.sheet.*`.\n\nApply this explicit replacement before the detailed mapping table:\n\n| Find                             | Replace with                     |\n|----------------------------------|----------------------------------|\n| `import org.apache.fesod.excel.` | `import org.apache.fesod.sheet.` |\n\nThen continue with the specific import mappings below.\n\n### 2a. Core entry classes\n\n| Find (exact import string)               | Replace with                                      |\n|------------------------------------------|---------------------------------------------------|\n| `import cn.idev.excel.FastExcel;`        | `import org.apache.fesod.sheet.FastExcel;`        |\n| `import cn.idev.excel.FastExcelFactory;` | `import org.apache.fesod.sheet.FastExcelFactory;` |\n| `import cn.idev.excel.ExcelWriter;`      | `import org.apache.fesod.sheet.ExcelWriter;`      |\n| `import cn.idev.excel.ExcelReader;`      | `import org.apache.fesod.sheet.ExcelReader;`      |\n\n> **Note**: After this phase, `FastExcel.read(...)` and `FastExcelFactory.writerSheet(...)`\n> still compile — they resolve to the `@Deprecated` bridge classes in Fesod.\n> Phase 3 replaces them with the canonical `FesodSheet` class.\n\n### 2b. Read API\n\n| Find                                                         | Replace with                                                          |\n|--------------------------------------------------------------|-----------------------------------------------------------------------|\n| `import cn.idev.excel.read.listener.ReadListener;`           | `import org.apache.fesod.sheet.read.listener.ReadListener;`           |\n| `import cn.idev.excel.read.listener.PageReadListener;`       | `import org.apache.fesod.sheet.read.listener.PageReadListener;`       |\n| `import cn.idev.excel.read.metadata.ReadSheet;`              | `import org.apache.fesod.sheet.read.metadata.ReadSheet;`              |\n| `import cn.idev.excel.read.metadata.ReadWorkbook;`           | `import org.apache.fesod.sheet.read.metadata.ReadWorkbook;`           |\n| `import cn.idev.excel.read.metadata.ReadBasicParameter;`     | `import org.apache.fesod.sheet.read.metadata.ReadBasicParameter;`     |\n| `import cn.idev.excel.read.builder.ExcelReaderBuilder;`      | `import org.apache.fesod.sheet.read.builder.ExcelReaderBuilder;`      |\n| `import cn.idev.excel.read.builder.ExcelReaderSheetBuilder;` | `import org.apache.fesod.sheet.read.builder.ExcelReaderSheetBuilder;` |\n| `import cn.idev.excel.context.AnalysisContext;`              | `import org.apache.fesod.sheet.context.AnalysisContext;`              |\n| `import cn.idev.excel.event.SyncReadListener;`               | `import org.apache.fesod.sheet.event.SyncReadListener;`               |\n\n### 2c. Write API\n\n| Find                                                          | Replace with                                                           |\n|---------------------------------------------------------------|------------------------------------------------------------------------|\n| `import cn.idev.excel.write.metadata.WriteSheet;`             | `import org.apache.fesod.sheet.write.metadata.WriteSheet;`             |\n| `import cn.idev.excel.write.metadata.WriteWorkbook;`          | `import org.apache.fesod.sheet.write.metadata.WriteWorkbook;`          |\n| `import cn.idev.excel.write.metadata.WriteTable;`             | `import org.apache.fesod.sheet.write.metadata.WriteTable;`             |\n| `import cn.idev.excel.write.metadata.WriteBasicParameter;`    | `import org.apache.fesod.sheet.write.metadata.WriteBasicParameter;`    |\n| `import cn.idev.excel.write.builder.ExcelWriterBuilder;`      | `import org.apache.fesod.sheet.write.builder.ExcelWriterBuilder;`      |\n| `import cn.idev.excel.write.builder.ExcelWriterSheetBuilder;` | `import org.apache.fesod.sheet.write.builder.ExcelWriterSheetBuilder;` |\n| `import cn.idev.excel.write.builder.ExcelWriterTableBuilder;` | `import org.apache.fesod.sheet.write.builder.ExcelWriterTableBuilder;` |\n\n### 2d. Write handlers\n\n| Find                                                                  | Replace with                                                                   |\n|-----------------------------------------------------------------------|--------------------------------------------------------------------------------|\n| `import cn.idev.excel.write.handler.WriteHandler;`                    | `import org.apache.fesod.sheet.write.handler.WriteHandler;`                    |\n| `import cn.idev.excel.write.handler.SheetWriteHandler;`               | `import org.apache.fesod.sheet.write.handler.SheetWriteHandler;`               |\n| `import cn.idev.excel.write.handler.CellWriteHandler;`                | `import org.apache.fesod.sheet.write.handler.CellWriteHandler;`                |\n| `import cn.idev.excel.write.handler.RowWriteHandler;`                 | `import org.apache.fesod.sheet.write.handler.RowWriteHandler;`                 |\n| `import cn.idev.excel.write.handler.WorkbookWriteHandler;`            | `import org.apache.fesod.sheet.write.handler.WorkbookWriteHandler;`            |\n| `import cn.idev.excel.write.handler.context.CellWriteHandlerContext;` | `import org.apache.fesod.sheet.write.handler.context.CellWriteHandlerContext;` |\n\n### 2e. Annotations\n\n| Find                                                             | Replace with                                                              |\n|------------------------------------------------------------------|---------------------------------------------------------------------------|\n| `import cn.idev.excel.annotation.ExcelProperty;`                 | `import org.apache.fesod.sheet.annotation.ExcelProperty;`                 |\n| `import cn.idev.excel.annotation.ExcelIgnore;`                   | `import org.apache.fesod.sheet.annotation.ExcelIgnore;`                   |\n| `import cn.idev.excel.annotation.ExcelIgnoreUnannotated;`        | `import org.apache.fesod.sheet.annotation.ExcelIgnoreUnannotated;`        |\n| `import cn.idev.excel.annotation.format.DateTimeFormat;`         | `import org.apache.fesod.sheet.annotation.format.DateTimeFormat;`         |\n| `import cn.idev.excel.annotation.format.NumberFormat;`           | `import org.apache.fesod.sheet.annotation.format.NumberFormat;`           |\n| `import cn.idev.excel.annotation.write.style.ColumnWidth;`       | `import org.apache.fesod.sheet.annotation.write.style.ColumnWidth;`       |\n| `import cn.idev.excel.annotation.write.style.HeadStyle;`         | `import org.apache.fesod.sheet.annotation.write.style.HeadStyle;`         |\n| `import cn.idev.excel.annotation.write.style.ContentStyle;`      | `import org.apache.fesod.sheet.annotation.write.style.ContentStyle;`      |\n| `import cn.idev.excel.annotation.write.style.HeadFontStyle;`     | `import org.apache.fesod.sheet.annotation.write.style.HeadFontStyle;`     |\n| `import cn.idev.excel.annotation.write.style.ContentFontStyle;`  | `import org.apache.fesod.sheet.annotation.write.style.ContentFontStyle;`  |\n| `import cn.idev.excel.annotation.write.style.HeadRowHeight;`     | `import org.apache.fesod.sheet.annotation.write.style.HeadRowHeight;`     |\n| `import cn.idev.excel.annotation.write.style.ContentRowHeight;`  | `import org.apache.fesod.sheet.annotation.write.style.ContentRowHeight;`  |\n| `import cn.idev.excel.annotation.write.style.OnceAbsoluteMerge;` | `import org.apache.fesod.sheet.annotation.write.style.OnceAbsoluteMerge;` |\n| `import cn.idev.excel.annotation.write.style.ContentLoopMerge;`  | `import org.apache.fesod.sheet.annotation.write.style.ContentLoopMerge;`  |\n\n### 2f. Converters\n\n| Find                                                     | Replace with                                                      |\n|----------------------------------------------------------|-------------------------------------------------------------------|\n| `import cn.idev.excel.converters.Converter;`             | `import org.apache.fesod.sheet.converters.Converter;`             |\n| `import cn.idev.excel.converters.AutoConverter;`         | `import org.apache.fesod.sheet.converters.AutoConverter;`         |\n| `import cn.idev.excel.converters.ReadConverterContext;`  | `import org.apache.fesod.sheet.converters.ReadConverterContext;`  |\n| `import cn.idev.excel.converters.WriteConverterContext;` | `import org.apache.fesod.sheet.converters.WriteConverterContext;` |\n\n### 2g. Enums\n\n| Find                                                      | Replace with                                                       |\n|-----------------------------------------------------------|--------------------------------------------------------------------|\n| `import cn.idev.excel.enums.CellDataTypeEnum;`            | `import org.apache.fesod.sheet.enums.CellDataTypeEnum;`            |\n| `import cn.idev.excel.enums.CellExtraTypeEnum;`           | `import org.apache.fesod.sheet.enums.CellExtraTypeEnum;`           |\n| `import cn.idev.excel.enums.WriteDirectionEnum;`          | `import org.apache.fesod.sheet.enums.WriteDirectionEnum;`          |\n| `import cn.idev.excel.enums.poi.HorizontalAlignmentEnum;` | `import org.apache.fesod.sheet.enums.poi.HorizontalAlignmentEnum;` |\n| `import cn.idev.excel.enums.poi.BorderStyleEnum;`         | `import org.apache.fesod.sheet.enums.poi.BorderStyleEnum;`         |\n| `import cn.idev.excel.enums.poi.FillPatternTypeEnum;`     | `import org.apache.fesod.sheet.enums.poi.FillPatternTypeEnum;`     |\n\n### 2h. Exceptions and metadata\n\n| Find                                                           | Replace with                                                            |\n|----------------------------------------------------------------|-------------------------------------------------------------------------|\n| `import cn.idev.excel.exception.ExcelAnalysisException;`       | `import org.apache.fesod.sheet.exception.ExcelAnalysisException;`       |\n| `import cn.idev.excel.exception.ExcelAnalysisStopException;`   | `import org.apache.fesod.sheet.exception.ExcelAnalysisStopException;`   |\n| `import cn.idev.excel.exception.ExcelCommonException;`         | `import org.apache.fesod.sheet.exception.ExcelCommonException;`         |\n| `import cn.idev.excel.exception.ExcelGenerateException;`       | `import org.apache.fesod.sheet.exception.ExcelGenerateException;`       |\n| `import cn.idev.excel.metadata.data.WriteCellData;`            | `import org.apache.fesod.sheet.metadata.data.WriteCellData;`            |\n| `import cn.idev.excel.metadata.data.ReadCellData;`             | `import org.apache.fesod.sheet.metadata.data.ReadCellData;`             |\n| `import cn.idev.excel.metadata.CellExtra;`                     | `import org.apache.fesod.sheet.metadata.CellExtra;`                     |\n| `import cn.idev.excel.metadata.Head;`                          | `import org.apache.fesod.sheet.metadata.Head;`                          |\n| `import cn.idev.excel.metadata.property.ExcelContentProperty;` | `import org.apache.fesod.sheet.metadata.property.ExcelContentProperty;` |\n\n### 2i. Renamed helper classes (conditional)\n\nOnly if the project references these classes directly (rare — they are\nmostly internal). Rename the type and update the import together:\n\n| Find (exact import string)                              | Replace with                                                     |\n|---------------------------------------------------------|------------------------------------------------------------------|\n| `import cn.idev.excel.constant.FastExcelConstants;`     | `import org.apache.fesod.sheet.constant.FesodSheetConstants;`    |\n| `import cn.idev.excel.util.FastExcelTempFileCreationStrategy;` | `import org.apache.fesod.sheet.util.FesodTempFileCreationStrategy;` |\n| `import cn.idev.excel.util.BeanMapUtils;`               | `import org.apache.fesod.sheet.util.BeanMapUtils;` + rename usages `BeanMapUtils.FastExcelNamingPolicy` → `BeanMapUtils.FesodSheetNamingPolicy` (the nested class was renamed; the import itself stays `BeanMapUtils`) |\n\n### 2j. Utility classes moved to fesod-common (conditional)\n\nFastExcel 1.3 kept these under `cn.idev.excel.util`; Fesod moved them to the\n`fesod-common` module. Only apply if the project imports them directly (e.g.\ncustom converters or strategies):\n\n| Find                              | Replace with                        |\n|-----------------------------------|-------------------------------------|\n| `import cn.idev.excel.util.StringUtils;`   | `import org.apache.fesod.common.util.StringUtils;`   |\n| `import cn.idev.excel.util.IoUtils;`       | `import org.apache.fesod.common.util.IoUtils;`       |\n| `import cn.idev.excel.util.MapUtils;`      | `import org.apache.fesod.common.util.MapUtils;`      |\n| `import cn.idev.excel.util.ListUtils;`     | `import org.apache.fesod.common.util.ListUtils;`     |\n| `import cn.idev.excel.util.BooleanUtils;`  | `import org.apache.fesod.common.util.BooleanUtils;`  |\n| `import cn.idev.excel.util.IntUtils;`      | `import org.apache.fesod.common.util.IntUtils;`      |\n| `import cn.idev.excel.util.MemberUtils;`   | `import org.apache.fesod.common.util.MemberUtils;`   |\n| `import cn.idev.excel.util.PositionUtils;` | `import org.apache.fesod.common.util.PositionUtils;` |\n\n### 2k. Wildcard catch-all (apply LAST)\n\nAfter all specific replacements above, scan for any remaining wildcard imports:\n\n| Find                             | Replace with                     |\n|----------------------------------|----------------------------------|\n| `import cn.idev.excel.`          | `import org.apache.fesod.sheet.` |\n| `import org.apache.fesod.excel.` | `import org.apache.fesod.sheet.` |\n\nApply this only after all the specific rules above (including 2i\u002F2j), as a\nsafety net. Do NOT let the wildcard rule rewrite `cn.idev.excel.util` to\n`org.apache.fesod.sheet.util` — those classes moved to fesod-common (rule 2j).\n\n---\n\n## Phase 3 — Entry class rename (STRONGLY RECOMMENDED)\n\n`FastExcel` and `FastExcelFactory` compile in Fesod but are `@Deprecated` and\n**will be removed in a future release**. Replace all call sites with `FesodSheet`.\n\n### 3a. Import replacement\n\n| Find                                              | Replace with                                |\n|---------------------------------------------------|---------------------------------------------|\n| `import org.apache.fesod.sheet.FastExcel;`        | `import org.apache.fesod.sheet.FesodSheet;` |\n| `import org.apache.fesod.sheet.FastExcelFactory;` | `import org.apache.fesod.sheet.FesodSheet;` |\n\n### 3b. Call site replacement — FastExcel\n\n| Find                     | Replace with              |\n|--------------------------|---------------------------|\n| `FastExcel.read(`        | `FesodSheet.read(`        |\n| `FastExcel.write(`       | `FesodSheet.write(`       |\n| `FastExcel.writerSheet(` | `FesodSheet.writerSheet(` |\n| `FastExcel.readSheet(`   | `FesodSheet.readSheet(`   |\n| `FastExcel.writerTable(` | `FesodSheet.writerTable(` |\n\n### 3c. Call site replacement — FastExcelFactory\n\nFastExcel 1.3 shipped `FastExcelFactory` as a second entry class with an\nidentical API surface. All of its static methods map directly to `FesodSheet`:\n\n| Find                            | Replace with              |\n|---------------------------------|---------------------------|\n| `FastExcelFactory.read(`        | `FesodSheet.read(`        |\n| `FastExcelFactory.write(`       | `FesodSheet.write(`       |\n| `FastExcelFactory.writerSheet(` | `FesodSheet.writerSheet(` |\n| `FastExcelFactory.readSheet(`   | `FesodSheet.readSheet(`   |\n| `FastExcelFactory.writerTable(` | `FesodSheet.writerTable(` |\n\n### 3d. Type reference rename\n\nIf `FastExcel` or `FastExcelFactory` appear as a **type name** (not a call site),\nrename those too:\n\n- Variable type: `FastExcel x = ...` → `FesodSheet x = ...`\n- Class literal: `FastExcel.class` → `FesodSheet.class`\n\n`ExcelWriter` and `ExcelReader` are **not renamed** — they keep the same class name.\n\n---\n\n## Phase 4 — CGLIB class name (conditional)\n\nThis phase only applies if the project contains code that **inspects or asserts\non generated CGLIB class names at runtime**, for example in tests or serialisation logic.\n\nSearch all `.java` files for the string `ByFastExcelCGLIB`.\nIf found, replace with `ByFesodCGLIB`.\n\nIn Fesod, the naming policy is defined in\n`org.apache.fesod.sheet.util.BeanMapUtils.FesodSheetNamingPolicy` and its\n`getTag()` returns `\"ByFesodCGLIB\"`.\n\nIf no file references `ByFastExcelCGLIB`, skip this phase entirely.\n\n---\n\n## Phase 5 — Encoding and text safety (RECOMMENDED)\n\nThis phase prevents encoding-related breakage on Windows locales (for example GBK terminals).\n\n- Keep source files in UTF-8; do not run global \"remove non-ASCII\" replacements.\n- If compilation reports unmappable characters, fix only the specific broken lines.\n- Prefer preserving existing business-language strings (Chinese\u002FEnglish\u002Fetc.) unless the task\n  explicitly asks to normalize or translate them.\n- If a replacement tool introduces malformed characters (e.g. `�?`), revert those hunks and\n  re-apply scoped replacements.\n\n---\n\n## Phase 6 — New Fesod-only features (OPTIONAL, informational)\n\nFesod ships features that did not exist in FastExcel 1.3.0. They are NOT part\nof the migration — mention them in the summary only if the developer's project\ncould benefit, without rewriting any existing code:\n\n- `@FreezePane` (`org.apache.fesod.sheet.annotation.write.style`) — freeze rows\u002Fcolumns on write.\n- URL image security (`org.apache.fesod.sheet.converters.url`) — `UrlImageFetchPolicy` with `SchemePolicy` and `CidrBlock` guard the URL image converter against SSRF.\n- `StringBase64ImageConverter` \u002F `StringPathnameImageConverter` (`org.apache.fesod.sheet.converters.string`) — explicit string-to-image conversion (base64 \u002F file path), alongside the legacy `StringImageConverter`.\n- `HeadBuilder` \u002F `DefaultHeadBuilder` (`org.apache.fesod.sheet.metadata`) — fluent No-Bean header construction via `.head(builder -> ...)`.\n- `HeaderMergeStrategy` (`org.apache.fesod.sheet.enums`) — `NONE` \u002F `HORIZONTAL_ONLY` \u002F `VERTICAL_ONLY` \u002F `FULL_RECTANGLE` \u002F `AUTO` via `headerMergeStrategy(...)`, superseding `automaticMergeHead`.\n\n---\n\n## Verification\n\nAfter completing the desired phases, confirm the following:\n\n**Must be true after Phase 2:**\n\n- No `.java` file contains `import cn.idev.excel.`\n- No `.java` file contains `import org.apache.fesod.excel.`\n- No `pom.xml` or `build.gradle` references `cn.idev.excel`\n- If 2i applied: no `.java` file references `FastExcelConstants`, `FastExcelTempFileCreationStrategy`, or `BeanMapUtils.FastExcelNamingPolicy`; check `.java` files for `FastExcelNamingPolicy` → renamed to `FesodSheetNamingPolicy`\n- If 2j applied: no `.java` file contains `cn.idev.excel.util.StringUtils` (or any of the 8 moved utils); check for `import cn.idev.excel.util.` — must be gone (wildcard rule 2k must not have rewritten these to `org.apache.fesod.sheet.util`)\n\n**Must be true after Phase 3 (additional):**\n\n- No `.java` file calls `FastExcel.` or `FastExcelFactory.` as a static call site\n- No `.java` file imports `org.apache.fesod.sheet.FastExcel` or\n  `org.apache.fesod.sheet.FastExcelFactory`\n\n**Must be true after Phase 4 (if applicable):**\n\n- No `.java` file contains the string `ByFastExcelCGLIB`\n\n**Must be true after Phase 5 (recommended):**\n\n- No malformed replacement artifacts such as `�?` remain in source files\n- No unintended changes in business literals (headers\u002Fsheet names\u002Fmessages) unless requested\n- No accidental rewrites in comments\u002FJavadoc caused by mechanical replace\n\nRun the project's existing test suite to confirm functional equivalence:\n\n```\n# Maven\nmvn clean test\n\n# Gradle\n.\u002Fgradlew clean test\n```\n\nIf tests fail with runtime messages like `Unresolved compilation problem`, rerun\nwith a clean build first (`mvn clean test` \u002F `.\u002Fgradlew clean test`) to avoid\nstale compiled classes masking the real source-level error.\n\n---\n\n## Migration summary output\n\nAfter applying all changes, produce a table in this format:\n\n```\n## Migration Summary\n\n| Phase | File | Changes |\n|---|---|---|\n| 1 | pom.xml | Replaced cn.idev.excel:fastexcel:1.3.0 with org.apache.fesod:fesod-sheet:2.0.1-incubating |\n| 2 | src\u002F...\u002FFoo.java | N import statements updated (cn.idev.excel → org.apache.fesod.sheet) |\n| 3 | src\u002F...\u002FBar.java | M FastExcel.\u002FFastExcelFactory. call sites renamed to FesodSheet. |\n| 4 | src\u002F...\u002FBaz.java | ByFastExcelCGLIB → ByFesodCGLIB (if applicable) |\n| 5 | src\u002F...\u002FQux.java | Encoding\u002Fliteral safety check passed (no malformed artifacts \u002F no unintended literal rewrites) |\n\nRemaining cn.idev.excel references : 0 ✅\nRemaining FastExcel. call sites    : 0 ✅  (or N ⚠️  if Phase 3 was skipped)\nRemaining ByFastExcelCGLIB refs    : 0 ✅  (or skipped — not present)\n```\n",{"name":5,"description":7},"main","126dde9d57ff869e3887749614effaa0c26c7f9f",".github\u002Fskills\u002Ffastexcel-to-fesod",558,"https:\u002F\u002Fgithub.com\u002Fapache\u002Ffesod","https:\u002F\u002Ffesod.apache.org","https:\u002F\u002Fgithub.com\u002Fapache","https:\u002F\u002Fwww.apache.org\u002F","2026-11-13 19:00:07",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add apache\u002Ffesod --skill fastexcel-to-fesod",{"tool":65,"command":66},"bunx","bunx skills add apache\u002Ffesod --skill fastexcel-to-fesod",{"tool":68,"command":69},"pnpm","pnpm dlx skills add apache\u002Ffesod --skill fastexcel-to-fesod","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fapache\u002Ffesod\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Ffastexcel-to-fesod\u002FSKILL.md",true,[73],{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"agents\u002Fopenai.yaml","REFERENCE","参考文档",94,"https:\u002F\u002Fgithub.com\u002Ffeniix\u002Fdotfiles\u002Fblob\u002Fmain\u002Fagents\u002Fskills\u002Fresearch\u002Fagents\u002Fopenai.yaml",[]]