You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fesod.apache.org by de...@apache.org on 2026/10/10 01:46:50 UTC

(fesod) branch main updated: fix: prevent CSV multi-sheet data loss (#1148) (#1158)

This is an automated email from the ASF dual-hosted git repository.

delei pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fesod.git


The following commit(s) were added to refs/heads/main by this push:
     new 9b374942 fix: prevent CSV multi-sheet data loss (#1148) (#1158)
9b374942 is described below

commit 9b37494213dd430e3cb66288f9ff59d0709aed68
Author: aias00 <li...@apache.org>
AuthorDate: Fri Oct 9 18:46:46 2026 -0700

    fix: prevent CSV multi-sheet data loss (#1148) (#1158)
    
    Signed-off-by: liuhy <li...@apache.org>
    Co-authored-by: DeleiGuo <de...@apache.org>
---
 .../fesod/sheet/metadata/csv/CsvWorkbook.java      | 16 +++++++++++--
 .../apache/fesod/sheet/format/CsvFormatTest.java   | 26 ++++++++++++++++++++++
 2 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/metadata/csv/CsvWorkbook.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/metadata/csv/CsvWorkbook.java
index 7fcecb55..62876769 100644
--- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/metadata/csv/CsvWorkbook.java
+++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/metadata/csv/CsvWorkbook.java
@@ -36,6 +36,7 @@ import lombok.Getter;
 import lombok.Setter;
 import org.apache.commons.compress.utils.Lists;
 import org.apache.commons.csv.CSVFormat;
+import org.apache.fesod.sheet.exception.ExcelGenerateException;
 import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.ss.formula.EvaluationWorkbook;
 import org.apache.poi.ss.formula.udf.UDFFinder;
@@ -170,18 +171,29 @@ public class CsvWorkbook implements Workbook {
 
     @Override
     public Sheet createSheet() {
-        assert csvSheet == null : "CSV repeat creation is not allowed.";
+        checkSheetNotCreated();
         csvSheet = new CsvSheet(this, out);
         return csvSheet;
     }
 
     @Override
     public Sheet createSheet(String sheetname) {
-        assert csvSheet == null : "CSV repeat creation is not allowed.";
+        checkSheetNotCreated();
         csvSheet = new CsvSheet(this, out);
         return csvSheet;
     }
 
+    private void checkSheetNotCreated() {
+        if (csvSheet != null) {
+            try {
+                csvSheet.close();
+            } catch (IOException e) {
+                throw new ExcelGenerateException(e);
+            }
+            throw new ExcelGenerateException("CSV repeat creation is not allowed.");
+        }
+    }
+
     @Override
     public Sheet cloneSheet(int sheetNum) {
         return null;
diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/format/CsvFormatTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/format/CsvFormatTest.java
index 4cd889ad..b3b2db4d 100644
--- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/format/CsvFormatTest.java
+++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/format/CsvFormatTest.java
@@ -36,6 +36,7 @@ import org.apache.fesod.common.util.StringUtils;
 import org.apache.fesod.sheet.ExcelReader;
 import org.apache.fesod.sheet.ExcelWriter;
 import org.apache.fesod.sheet.FesodSheet;
+import org.apache.fesod.sheet.exception.ExcelGenerateException;
 import org.apache.fesod.sheet.metadata.csv.CsvConstant;
 import org.apache.fesod.sheet.metadata.csv.CsvWorkbook;
 import org.apache.fesod.sheet.read.metadata.ReadSheet;
@@ -226,6 +227,31 @@ public class CsvFormatTest extends AbstractExcelTest {
                 .doWrite(data);
     }
 
+    @Test
+    public void writeSecondCsvSheetShouldFailWithoutLosingFirstSheetData() throws Exception {
+        File csvFile = createTempFile("csv-repeat-sheet", ExcelFormat.CSV);
+        List<CsvData> firstSheetData = dataList(3, "First");
+        List<CsvData> secondSheetData = dataList(3, "Second");
+
+        try (ExcelWriter excelWriter = FesodSheet.write(csvFile, CsvData.class)
+                .excelType(ExcelTypeEnum.CSV)
+                .build()) {
+            excelWriter.write(firstSheetData, FesodSheet.writerSheet(0).build());
+
+            ExcelGenerateException exception = Assertions.assertThrows(ExcelGenerateException.class, () -> {
+                excelWriter.write(secondSheetData, FesodSheet.writerSheet(1).build());
+            });
+            Assertions.assertEquals("CSV repeat creation is not allowed.", exception.getMessage());
+        }
+
+        List<CsvData> actualData = FesodSheet.read(csvFile, CsvData.class, new CsvDataListener())
+                .csv()
+                .doReadSync();
+        Assertions.assertEquals(3, actualData.size());
+        Assertions.assertEquals("First0", actualData.get(0).getString());
+        Assertions.assertEquals("First2", actualData.get(2).getString());
+    }
+
     private void doTest(
             boolean isCreate,
             File csvFile,


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@fesod.apache.org
For additional commands, e-mail: commits-help@fesod.apache.org