From 4cf67df083cc6318babd09056237eae3e9d42744 Mon Sep 17 00:00:00 2001 From: hee9841 Date: Fri, 19 Dec 2025 16:49:52 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20try-with-resources=EC=97=90=EC=84=9C?= =?UTF-8?q?=20OutputStream=EA=B9=8C=EC=A7=80=20=EB=8B=AB=EC=A7=80=20?= =?UTF-8?q?=EB=AA=BB=ED=95=98=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/github/hee9841/excel/core/exporter/SXSSFExporter.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/github/hee9841/excel/core/exporter/SXSSFExporter.java b/src/main/java/io/github/hee9841/excel/core/exporter/SXSSFExporter.java index 1710fbb..29b9933 100644 --- a/src/main/java/io/github/hee9841/excel/core/exporter/SXSSFExporter.java +++ b/src/main/java/io/github/hee9841/excel/core/exporter/SXSSFExporter.java @@ -133,9 +133,8 @@ public final void write(OutputStream stream) throws IOException { } logger.info("Start to write Excel file for DTO class({}.java).", dtoTypeName); - try (SXSSFWorkbook autoCloseableWb = this.workbook; - OutputStream autoCloseableStream = stream) { - autoCloseableWb.write(autoCloseableStream); + try (SXSSFWorkbook autoCloseableWb = this.workbook) { + autoCloseableWb.write(stream); logger.info("Successfully wrote Excel file for DTO class({}.java).", dtoTypeName); } } From fa2a1050a6ccedc29fdfddc2bab9c20810da5525 Mon Sep 17 00:00:00 2001 From: hee9841 Date: Fri, 19 Dec 2025 16:51:49 +0900 Subject: [PATCH 2/3] refactor: internalize sheet management in exporter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 공개 API에서 addRows(Sheet, …) → addRows(List<…>)로 되돌리고, 시트 생성/분할을 내부에서 관리하도록 수정. --- .../core/exporter/DefaultExcelExporter.java | 48 +++++-------------- .../excel/core/exporter/ExcelExporter.java | 2 +- .../excel/core/exporter/SXSSFExporter.java | 23 +++++++++ ...aultExcelExporterByteOutputStreamTest.java | 10 ++-- 4 files changed, 41 insertions(+), 42 deletions(-) diff --git a/src/main/java/io/github/hee9841/excel/core/exporter/DefaultExcelExporter.java b/src/main/java/io/github/hee9841/excel/core/exporter/DefaultExcelExporter.java index 931be4b..415c405 100644 --- a/src/main/java/io/github/hee9841/excel/core/exporter/DefaultExcelExporter.java +++ b/src/main/java/io/github/hee9841/excel/core/exporter/DefaultExcelExporter.java @@ -41,7 +41,8 @@ public class DefaultExcelExporter extends SXSSFExporter { private final int maxRowsPerSheet; private SheetStrategy sheetStrategy; - private int currentSheetIndex; + + private Sheet currentSheet; /** @@ -66,7 +67,6 @@ public class DefaultExcelExporter extends SXSSFExporter { super(); this.maxRowsPerSheet = maxRowsPerSheet; this.sheetName = sheetName; - this.currentSheetIndex = 0; setSheetStrategy(sheetStrategy); this.initialize(type, data); @@ -136,18 +136,18 @@ protected void validate(Class type, List data) { */ @Override protected void createExcel(List data) { + + currentSheet = createNewSheet(sheetName, 0); + createHeader(currentSheet, ROW_START_INDEX); + // 1. If data is empty, create createHeader only. if (data.isEmpty()) { - Sheet newSheet = createNewSheet(); - createHeader(newSheet, ROW_START_INDEX); logger.warn("Empty data provided - Excel file will be created with headers only."); return; } - //2. Add rows - Sheet newSheet = createNewSheet(); - createHeader(newSheet, ROW_START_INDEX); - addRows(newSheet, data); + //2. Add Rows + addRows(data); } /** @@ -163,10 +163,10 @@ protected void createExcel(List data) { * @throws ExcelException if ONE_SHEET strategy is used and data exceeds max rows limit */ @Override - public void addRows(Sheet sheet, List data) { + public void addRows(List data) { int leftDataSize = data.size(); for (Object renderedData : data) { - createBody(sheet, renderedData, currentRowIndex++); + createBody(currentSheet, renderedData, currentRowIndex++); leftDataSize--; if (currentRowIndex == maxRowsPerSheet && leftDataSize > 0) { //If one sheet strategy, throw exception @@ -178,8 +178,8 @@ public void addRows(Sheet sheet, List data) { //If multi sheet strategy, create new sheet currentRowIndex = ROW_START_INDEX; - sheet = createNewSheet(); - createHeader(sheet, ROW_START_INDEX); + currentSheet = createNewSheet(sheetName, workbook.getSheetIndex(currentSheet) + 1); + createHeader(currentSheet, ROW_START_INDEX); } } } @@ -195,28 +195,4 @@ protected void createHeader(Sheet sheet, Integer headerRowIndex) { super.createHeader(sheet, headerRowIndex); currentRowIndex++; } - - - /** - * Creates a new sheet with headers. - * - *

This method resets the current row index, creates a new sheet, and adds headers to it. - * If a sheet name is provided, it will be used as a base name with an index(index starts from - * 0) suffix.

- */ - private Sheet createNewSheet() { - //If sheet name is provided, create sheet with sheet name + idx - final String finalSheetName = (sheetName != null) - ? String.format("%s%d", sheetName, currentSheetIndex++) - : null; - - Sheet sheet = (finalSheetName != null) - ? workbook.createSheet(finalSheetName) - : workbook.createSheet(); - - logger.debug("Create new Sheet : {}.", sheet.getSheetName()); - - return sheet; - } - } diff --git a/src/main/java/io/github/hee9841/excel/core/exporter/ExcelExporter.java b/src/main/java/io/github/hee9841/excel/core/exporter/ExcelExporter.java index 40aac19..03460ab 100644 --- a/src/main/java/io/github/hee9841/excel/core/exporter/ExcelExporter.java +++ b/src/main/java/io/github/hee9841/excel/core/exporter/ExcelExporter.java @@ -32,5 +32,5 @@ public interface ExcelExporter { * * @param data The list of data objects to be added as rows */ - void addRows(Sheet sheet, List data); + void addRows(List data); } diff --git a/src/main/java/io/github/hee9841/excel/core/exporter/SXSSFExporter.java b/src/main/java/io/github/hee9841/excel/core/exporter/SXSSFExporter.java index 29b9933..7578fe8 100644 --- a/src/main/java/io/github/hee9841/excel/core/exporter/SXSSFExporter.java +++ b/src/main/java/io/github/hee9841/excel/core/exporter/SXSSFExporter.java @@ -89,6 +89,29 @@ protected void createHeader(Sheet sheet, Integer headerRowIndex) { } } + /** + * Creates a new sheet with headers. + * + *

This method resets the current row index, creates a new sheet, and adds headers to it. + * If a sheet name is provided, it will be used as a base name with an index(index starts from + * 0) suffix.

+ */ + protected Sheet createNewSheet(String sheetName, int sheetIndex) { + //If sheet name is provided, create sheet with sheet name + idx + final String finalSheetName = (sheetName != null) + ? String.format("%s(%d)", sheetName, sheetIndex) + : null; + + + Sheet sheet = (finalSheetName != null) + ? workbook.createSheet(finalSheetName) + : workbook.createSheet(); + + logger.debug("Create new Sheet : {}.", sheet.getSheetName()); + + return sheet; + } + /** * Creates a row in the Excel sheet for the given data object. * This method handles field access and cell value setting based on column mapping information. diff --git a/src/test/java/io/github/hee9841/excel/core/exporter/DefaultExcelExporterByteOutputStreamTest.java b/src/test/java/io/github/hee9841/excel/core/exporter/DefaultExcelExporterByteOutputStreamTest.java index acc43a9..b796234 100644 --- a/src/test/java/io/github/hee9841/excel/core/exporter/DefaultExcelExporterByteOutputStreamTest.java +++ b/src/test/java/io/github/hee9841/excel/core/exporter/DefaultExcelExporterByteOutputStreamTest.java @@ -274,12 +274,12 @@ void createSheetWithSpecifiedName() throws IOException { //then try (Workbook workbook = WorkbookFactory.create( new ByteArrayInputStream(os.toByteArray()))) { - assertEquals("TestSheet0", workbook.getSheetAt(0).getSheetName()); - assertEquals("TestSheet1", workbook.getSheetAt(1).getSheetName()); + assertEquals("TestSheet(0)", workbook.getSheetAt(0).getSheetName()); + assertEquals("TestSheet(1)", workbook.getSheetAt(1).getSheetName()); } - assertTrue(memoryAppender.isPresent("Create new Sheet : TestSheet0.", Level.DEBUG)); - assertTrue(memoryAppender.isPresent("Create new Sheet : TestSheet1.", Level.DEBUG)); + assertTrue(memoryAppender.isPresent("Create new Sheet : TestSheet(0).", Level.DEBUG)); + assertTrue(memoryAppender.isPresent("Create new Sheet : TestSheet(1).", Level.DEBUG)); } } @@ -308,7 +308,7 @@ void checkFormulaType() throws IOException { // then try (Workbook workbook = WorkbookFactory .create(new ByteArrayInputStream(os.toByteArray()))) { - Sheet sheet = workbook.getSheet("TestSheet0"); + Sheet sheet = workbook.getSheetAt(0); for (int i = 1; i < 10; i++) { Row row = sheet.getRow(i); From 1cd34d0e0f0e5da5ca4c153769d86f38fb2c5e9f Mon Sep 17 00:00:00 2001 From: hee9841 Date: Fri, 19 Dec 2025 16:52:25 +0900 Subject: [PATCH 3/3] chore: bump version to 0.0.4 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 0f111ca..cac2fda 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ plugins { } group = 'io.github.hee9841.excel' -version = '0.0.3' +version = '0.0.4' repositories { mavenCentral()