From eeb09041f5bf462654cf527d94b331b90e345b51 Mon Sep 17 00:00:00 2001 From: DeleiGuo Date: Wed, 26 Aug 2026 13:19:05 +0800 Subject: [PATCH 1/8] refactor: add EscapeHexCellWriteHandler for XLSX escape processing - Moved EscapeHexCellWriteHandler to handler.impl package - Registered EscapeHexCellWriteHandler in DefaultWriteHandlerLoader for XLSX format - Updated XlsxEscapeUtils documentation to link to EscapeHexCellWriteHandler - Improved handling of XLSX character escapes in cell writing process --- .../java/org/apache/fesod/sheet/util/XlsxEscapeUtils.java | 5 +++-- .../fesod/sheet/write/handler/DefaultWriteHandlerLoader.java | 2 ++ .../write/handler/{ => impl}/EscapeHexCellWriteHandler.java | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) rename fesod-sheet/src/main/java/org/apache/fesod/sheet/write/handler/{ => impl}/EscapeHexCellWriteHandler.java (98%) diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/XlsxEscapeUtils.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/XlsxEscapeUtils.java index 64f42d4ec..6c0ff6fb0 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/XlsxEscapeUtils.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/XlsxEscapeUtils.java @@ -21,6 +21,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.fesod.sheet.write.handler.impl.EscapeHexCellWriteHandler; /** * The {@code _xHHHH_} escapes that xlsx uses for characters XML 1.0 forbids, defined by section 3.18.9 of the Office @@ -37,11 +38,11 @@ * {@code _x005F_} is the escape for the underscore. Decoding it yields the literal back, not {@code A}. *

* The write half of the same convention lives in - * {@link org.apache.fesod.sheet.write.handler.EscapeHexCellWriteHandler EscapeHexCellWriteHandler}, which produces + * {@link EscapeHexCellWriteHandler EscapeHexCellWriteHandler}, which produces * that {@code _x005F_x} form. Both sides read {@code _xHHHH_} the same way, so a change to what counts as an escape * belongs in both. * - * @see org.apache.fesod.sheet.write.handler.EscapeHexCellWriteHandler + * @see EscapeHexCellWriteHandler */ public class XlsxEscapeUtils { diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/handler/DefaultWriteHandlerLoader.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/handler/DefaultWriteHandlerLoader.java index 4621e3976..924282ca0 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/handler/DefaultWriteHandlerLoader.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/handler/DefaultWriteHandlerLoader.java @@ -30,6 +30,7 @@ import org.apache.fesod.sheet.support.ExcelTypeEnum; import org.apache.fesod.sheet.write.handler.impl.DefaultRowWriteHandler; import org.apache.fesod.sheet.write.handler.impl.DimensionWorkbookWriteHandler; +import org.apache.fesod.sheet.write.handler.impl.EscapeHexCellWriteHandler; import org.apache.fesod.sheet.write.handler.impl.FillStyleCellWriteHandler; import org.apache.fesod.sheet.write.handler.impl.WriteSheetWorkbookWriteHandler; import org.apache.fesod.sheet.write.style.DefaultStyle; @@ -60,6 +61,7 @@ public static List loadDefaultHandler(Boolean useDefaultStyle, Exc case XLSX: handlerList.add(new DimensionWorkbookWriteHandler()); handlerList.add(new DefaultRowWriteHandler()); + handlerList.add(new EscapeHexCellWriteHandler()); handlerList.add(new FillStyleCellWriteHandler()); handlerList.add(new WriteSheetWorkbookWriteHandler()); if (useDefaultStyle) { diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/handler/impl/EscapeHexCellWriteHandler.java similarity index 98% rename from fesod-sheet/src/main/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandler.java rename to fesod-sheet/src/main/java/org/apache/fesod/sheet/write/handler/impl/EscapeHexCellWriteHandler.java index b2ec70d50..2040584d8 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandler.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/handler/impl/EscapeHexCellWriteHandler.java @@ -17,11 +17,12 @@ * under the License. */ -package org.apache.fesod.sheet.write.handler; +package org.apache.fesod.sheet.write.handler.impl; import org.apache.fesod.sheet.enums.CellDataTypeEnum; import org.apache.fesod.sheet.metadata.Head; import org.apache.fesod.sheet.metadata.data.WriteCellData; +import org.apache.fesod.sheet.write.handler.CellWriteHandler; import org.apache.fesod.sheet.write.metadata.holder.WriteSheetHolder; import org.apache.fesod.sheet.write.metadata.holder.WriteTableHolder; import org.apache.poi.ss.usermodel.Cell; From 139c3b3bf68ab37beb52210fc16dce499f1cd48e Mon Sep 17 00:00:00 2001 From: DeleiGuo Date: Wed, 26 Aug 2026 13:19:14 +0800 Subject: [PATCH 2/8] test: add test for escaping hex sequence round trip - Add EscapeHexCellWriteHandlerRoundTripTest to verify hex escapes on write are read back literally - Remove redundant HexEscapeRoundTripTest which tested similar functionality - Import EscapeHexCellWriteHandler where necessary in write handler tests - Ensure round trip correctness for cells containing hexadecimal escape patterns in data fields --- .../readwrite/HexEscapeRoundTripTest.java | 67 ------------------- ...scapeHexCellWriteHandlerRoundTripTest.java | 19 ++++++ .../EscapeHexCellWriteHandlerTest.java | 1 + 3 files changed, 20 insertions(+), 67 deletions(-) delete mode 100644 fesod-sheet/src/test/java/org/apache/fesod/sheet/readwrite/HexEscapeRoundTripTest.java diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/readwrite/HexEscapeRoundTripTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/readwrite/HexEscapeRoundTripTest.java deleted file mode 100644 index fba19522e..000000000 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/readwrite/HexEscapeRoundTripTest.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.fesod.sheet.readwrite; - -import java.io.File; -import java.io.IOException; -import java.util.Collections; -import java.util.List; -import org.apache.fesod.sheet.FesodSheet; -import org.apache.fesod.sheet.testkit.Tags; -import org.apache.fesod.sheet.testkit.base.AbstractExcelTest; -import org.apache.fesod.sheet.testkit.enums.ExcelFormat; -import org.apache.fesod.sheet.testkit.listeners.CollectingReadListener; -import org.apache.fesod.sheet.testkit.models.SimpleData; -import org.apache.fesod.sheet.write.handler.EscapeHexCellWriteHandler; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; - -/** - * Regression test for issue #696: the {@code _xHHHH_} - * escapes were undone only for cells backed by {@code sharedStrings.xml}, so an inline - * string - what the default writer emits - reached the caller with the raw escape. - */ -@Tag(Tags.ROUND_TRIP) -class HexEscapeRoundTripTest extends AbstractExcelTest { - - /** - * The handler is what puts a real escape in the cell, storing the literal as {@code Product_x005F_x0002_Code}. - * Taking it from the writer's own output instead would tie the expectation to a writer default, not to the - * reader under test. - */ - @Test - void escapedOnWrite_readsBackAsTheLiteral() throws IOException { - SimpleData data = new SimpleData(); - data.setName("Product_x0002_Code"); - File file = createTempFile("hex-escape", ExcelFormat.XLSX); - FesodSheet.write(file, SimpleData.class) - .registerWriteHandler(new EscapeHexCellWriteHandler()) - .sheet() - .doWrite(Collections.singletonList(data)); - - CollectingReadListener listener = new CollectingReadListener<>(); - FesodSheet.read(file, SimpleData.class, listener).sheet().doRead(); - List rows = listener.getRows(); - - Assertions.assertEquals(1, rows.size()); - Assertions.assertEquals("Product_x0002_Code", rows.get(0).getName()); - } -} diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java index 6227dca34..2108ec8d2 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java @@ -31,12 +31,16 @@ import org.apache.fesod.sheet.testkit.Tags; import org.apache.fesod.sheet.testkit.base.AbstractExcelTest; import org.apache.fesod.sheet.testkit.enums.ExcelFormat; +import org.apache.fesod.sheet.testkit.listeners.CollectingReadListener; +import org.apache.fesod.sheet.testkit.models.SimpleData; import org.apache.fesod.sheet.testkit.params.ExcelFormatSource; +import org.apache.fesod.sheet.write.handler.impl.EscapeHexCellWriteHandler; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.xssf.streaming.SXSSFCell; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @Tag(Tags.ROUND_TRIP) @@ -81,4 +85,19 @@ void registeredOnAWrite_keepsLiteralHexSequencesIntactAcrossFormats(ExcelFormat File file = writeEscapedWorkbook(format); Assertions.assertEquals("_xB9f0_ and _x1234_", readBackFirstDataValue(file, format)); } + + @Test + void escapedOnWrite_readsBackAsTheLiteral() throws IOException { + SimpleData data = new SimpleData(); + data.setName("Product_x0002_Code"); + File file = createTempFile("hex-escape", ExcelFormat.XLSX); + FesodSheet.write(file, SimpleData.class).sheet().doWrite(Collections.singletonList(data)); + + CollectingReadListener listener = new CollectingReadListener<>(); + FesodSheet.read(file, SimpleData.class, listener).sheet().doRead(); + List rows = listener.getRows(); + + Assertions.assertEquals(1, rows.size()); + Assertions.assertEquals("Product_x0002_Code", rows.get(0).getName()); + } } diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerTest.java index f751594e7..7a5c1b947 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerTest.java @@ -22,6 +22,7 @@ import org.apache.fesod.sheet.enums.CellDataTypeEnum; import org.apache.fesod.sheet.metadata.data.WriteCellData; import org.apache.fesod.sheet.testkit.Tags; +import org.apache.fesod.sheet.write.handler.impl.EscapeHexCellWriteHandler; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.xssf.streaming.SXSSFCell; import org.junit.jupiter.api.Assertions; From 44b94627c1330bcf20b4ef1d432619ca401fa1cb Mon Sep 17 00:00:00 2001 From: DeleiGuo Date: Wed, 26 Aug 2026 13:24:33 +0800 Subject: [PATCH 3/8] test: clean up imports in EscapeHexCellWriteHandlerRoundTripTest --- ...scapeHexCellWriteHandlerRoundTripTest.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java index 2108ec8d2..63aa93770 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java @@ -19,14 +19,6 @@ package org.apache.fesod.sheet.write.handler; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import org.apache.fesod.sheet.FesodSheet; import org.apache.fesod.sheet.testkit.Tags; import org.apache.fesod.sheet.testkit.base.AbstractExcelTest; @@ -34,7 +26,6 @@ import org.apache.fesod.sheet.testkit.listeners.CollectingReadListener; import org.apache.fesod.sheet.testkit.models.SimpleData; import org.apache.fesod.sheet.testkit.params.ExcelFormatSource; -import org.apache.fesod.sheet.write.handler.impl.EscapeHexCellWriteHandler; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.xssf.streaming.SXSSFCell; @@ -43,6 +34,15 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + @Tag(Tags.ROUND_TRIP) class EscapeHexCellWriteHandlerRoundTripTest extends AbstractExcelTest { @@ -54,7 +54,6 @@ private File writeEscapedWorkbook(ExcelFormat format) throws IOException { FesodSheet.write(file) .excelType(format.toExcelTypeEnum()) .head(Collections.singletonList(Collections.singletonList("value"))) - .registerWriteHandler(new EscapeHexCellWriteHandler()) .sheet("escape") .doWrite(rows); return file; From 0e2173b7766b7e3622367da2cd306582172b7bf9 Mon Sep 17 00:00:00 2001 From: DeleiGuo Date: Wed, 26 Aug 2026 13:29:07 +0800 Subject: [PATCH 4/8] refactor: code style --- .../EscapeHexCellWriteHandlerRoundTripTest.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java index 63aa93770..5d18d3e62 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java @@ -19,6 +19,14 @@ package org.apache.fesod.sheet.write.handler; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import org.apache.fesod.sheet.FesodSheet; import org.apache.fesod.sheet.testkit.Tags; import org.apache.fesod.sheet.testkit.base.AbstractExcelTest; @@ -34,15 +42,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - @Tag(Tags.ROUND_TRIP) class EscapeHexCellWriteHandlerRoundTripTest extends AbstractExcelTest { From 0a102baef1fc739f6a7c9dc2ab4663b73eb4c619 Mon Sep 17 00:00:00 2001 From: DeleiGuo Date: Wed, 26 Aug 2026 15:29:04 +0800 Subject: [PATCH 5/8] docs: update EscapeHexCellWriteHandler comments --- .../sheet/write/handler/impl/EscapeHexCellWriteHandler.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/handler/impl/EscapeHexCellWriteHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/handler/impl/EscapeHexCellWriteHandler.java index 2040584d8..161282556 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/handler/impl/EscapeHexCellWriteHandler.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/handler/impl/EscapeHexCellWriteHandler.java @@ -37,10 +37,6 @@ * To store the literal _xHHHH_ sequence without it being decoded by POI, we need to escape the initial underscore by * replacing _x with _x005F_x. *

- * This handler is not registered by default. Without it the writer stores {@code _xHHHH_}-shaped text exactly as - * typed, and any reader that follows the convention - Fesod, POI or Excel - decodes it back to the character it - * names, so the literal does not survive a round trip. Register it on the write to keep such text intact. - *

* The read half of the same convention lives in * {@link org.apache.fesod.sheet.util.XlsxEscapeUtils#utfDecode(String) XlsxEscapeUtils.utfDecode}, which undoes what * this handler writes. Both sides read {@code _xHHHH_} the same way, so a change to what counts as an escape belongs From 4c3748c98a1079eb305402bc7b7e40b05d9cb78d Mon Sep 17 00:00:00 2001 From: DeleiGuo Date: Wed, 26 Aug 2026 16:50:41 +0800 Subject: [PATCH 6/8] feat: implement unique execution for EscapeHexCellWriteHandler --- .../impl/EscapeHexCellWriteHandler.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/handler/impl/EscapeHexCellWriteHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/handler/impl/EscapeHexCellWriteHandler.java index 161282556..20c748592 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/handler/impl/EscapeHexCellWriteHandler.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/handler/impl/EscapeHexCellWriteHandler.java @@ -20,6 +20,7 @@ package org.apache.fesod.sheet.write.handler.impl; import org.apache.fesod.sheet.enums.CellDataTypeEnum; +import org.apache.fesod.sheet.event.NotRepeatExecutor; import org.apache.fesod.sheet.metadata.Head; import org.apache.fesod.sheet.metadata.data.WriteCellData; import org.apache.fesod.sheet.write.handler.CellWriteHandler; @@ -41,10 +42,14 @@ * {@link org.apache.fesod.sheet.util.XlsxEscapeUtils#utfDecode(String) XlsxEscapeUtils.utfDecode}, which undoes what * this handler writes. Both sides read {@code _xHHHH_} the same way, so a change to what counts as an escape belongs * in both. + *

+ * This handler implements {@link NotRepeatExecutor} so that it is only executed once. {@link #uniqueValue()} returns + * the fully qualified class name, which never collides with handlers from other classes even across different class + * loaders. * * @see org.apache.fesod.sheet.util.XlsxEscapeUtils#utfDecode(String) */ -public class EscapeHexCellWriteHandler implements CellWriteHandler { +public class EscapeHexCellWriteHandler implements CellWriteHandler, NotRepeatExecutor { // ASCII hex digits only. Not Character.digit(c, 16), which also accepts non-ASCII // digits such as U+0663 that OOXML never uses. @@ -61,6 +66,17 @@ public class EscapeHexCellWriteHandler implements CellWriteHandler { private static final int PREFIX_LENGTH = PREFIX.length(); private static final int HEX_DIGIT_COUNT = 4; + /** + * Returns the fully qualified class name as the unique identity of this handler. + *

+ * This handler only needs to execute once. The fully qualified class name serves as the unique identity, + * which never collides with handlers from other classes even across different class loaders. + */ + @Override + public String uniqueValue() { + return this.getClass().getName(); + } + @Override public void afterCellDataConverted( WriteSheetHolder writeSheetHolder, From 4ba31e9262f1e8d604b992933ff6d4387a9aa936 Mon Sep 17 00:00:00 2001 From: DeleiGuo Date: Wed, 26 Aug 2026 16:50:57 +0800 Subject: [PATCH 7/8] test: register EscapeHexCellWriteHandler in round-trip tests --- ...scapeHexCellWriteHandlerRoundTripTest.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java index 5d18d3e62..93a25ecb0 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java @@ -19,14 +19,6 @@ package org.apache.fesod.sheet.write.handler; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import org.apache.fesod.sheet.FesodSheet; import org.apache.fesod.sheet.testkit.Tags; import org.apache.fesod.sheet.testkit.base.AbstractExcelTest; @@ -34,6 +26,7 @@ import org.apache.fesod.sheet.testkit.listeners.CollectingReadListener; import org.apache.fesod.sheet.testkit.models.SimpleData; import org.apache.fesod.sheet.testkit.params.ExcelFormatSource; +import org.apache.fesod.sheet.write.handler.impl.EscapeHexCellWriteHandler; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.xssf.streaming.SXSSFCell; @@ -42,6 +35,15 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + @Tag(Tags.ROUND_TRIP) class EscapeHexCellWriteHandlerRoundTripTest extends AbstractExcelTest { @@ -52,6 +54,7 @@ private File writeEscapedWorkbook(ExcelFormat format) throws IOException { FesodSheet.write(file) .excelType(format.toExcelTypeEnum()) + .registerWriteHandler(new EscapeHexCellWriteHandler()) .head(Collections.singletonList(Collections.singletonList("value"))) .sheet("escape") .doWrite(rows); @@ -89,7 +92,9 @@ void escapedOnWrite_readsBackAsTheLiteral() throws IOException { SimpleData data = new SimpleData(); data.setName("Product_x0002_Code"); File file = createTempFile("hex-escape", ExcelFormat.XLSX); - FesodSheet.write(file, SimpleData.class).sheet().doWrite(Collections.singletonList(data)); + FesodSheet.write(file, SimpleData.class) + .registerWriteHandler(new EscapeHexCellWriteHandler()) + .sheet().doWrite(Collections.singletonList(data)); CollectingReadListener listener = new CollectingReadListener<>(); FesodSheet.read(file, SimpleData.class, listener).sheet().doRead(); From 9e04c3878305f37a6e38d90f1472b7cecaa5e255 Mon Sep 17 00:00:00 2001 From: DeleiGuo Date: Wed, 26 Aug 2026 17:19:11 +0800 Subject: [PATCH 8/8] fix: code style --- ...scapeHexCellWriteHandlerRoundTripTest.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java index 93a25ecb0..b3ac634cd 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/write/handler/EscapeHexCellWriteHandlerRoundTripTest.java @@ -19,6 +19,14 @@ package org.apache.fesod.sheet.write.handler; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import org.apache.fesod.sheet.FesodSheet; import org.apache.fesod.sheet.testkit.Tags; import org.apache.fesod.sheet.testkit.base.AbstractExcelTest; @@ -35,15 +43,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - @Tag(Tags.ROUND_TRIP) class EscapeHexCellWriteHandlerRoundTripTest extends AbstractExcelTest { @@ -94,7 +93,8 @@ void escapedOnWrite_readsBackAsTheLiteral() throws IOException { File file = createTempFile("hex-escape", ExcelFormat.XLSX); FesodSheet.write(file, SimpleData.class) .registerWriteHandler(new EscapeHexCellWriteHandler()) - .sheet().doWrite(Collections.singletonList(data)); + .sheet() + .doWrite(Collections.singletonList(data)); CollectingReadListener listener = new CollectingReadListener<>(); FesodSheet.read(file, SimpleData.class, listener).sheet().doRead();