Skip to content

Commit b12ced9

Browse files
authored
Release 0.0.4 (#71)
* fix: try-with-resources에서 OutputStream까지 닫지 못하게 변경 * refactor: internalize sheet management in exporter - 공개 API에서 addRows(Sheet, …) → addRows(List<…>)로 되돌리고, 시트 생성/분할을 내부에서 관리하도록 수정. * chore: bump version to 0.0.4
1 parent b09a987 commit b12ced9

File tree

5 files changed

+44
-46
lines changed

5 files changed

+44
-46
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ plugins {
1111
}
1212

1313
group = 'io.github.hee9841.excel'
14-
version = '0.0.3'
14+
version = '0.0.4'
1515

1616
repositories {
1717
mavenCentral()

src/main/java/io/github/hee9841/excel/core/exporter/DefaultExcelExporter.java

Lines changed: 12 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ public class DefaultExcelExporter<T> extends SXSSFExporter<T> {
4141
private final int maxRowsPerSheet;
4242

4343
private SheetStrategy sheetStrategy;
44-
private int currentSheetIndex;
44+
45+
private Sheet currentSheet;
4546

4647

4748
/**
@@ -66,7 +67,6 @@ public class DefaultExcelExporter<T> extends SXSSFExporter<T> {
6667
super();
6768
this.maxRowsPerSheet = maxRowsPerSheet;
6869
this.sheetName = sheetName;
69-
this.currentSheetIndex = 0;
7070
setSheetStrategy(sheetStrategy);
7171

7272
this.initialize(type, data);
@@ -136,18 +136,18 @@ protected void validate(Class<?> type, List<T> data) {
136136
*/
137137
@Override
138138
protected void createExcel(List<T> data) {
139+
140+
currentSheet = createNewSheet(sheetName, 0);
141+
createHeader(currentSheet, ROW_START_INDEX);
142+
139143
// 1. If data is empty, create createHeader only.
140144
if (data.isEmpty()) {
141-
Sheet newSheet = createNewSheet();
142-
createHeader(newSheet, ROW_START_INDEX);
143145
logger.warn("Empty data provided - Excel file will be created with headers only.");
144146
return;
145147
}
146148

147-
//2. Add rows
148-
Sheet newSheet = createNewSheet();
149-
createHeader(newSheet, ROW_START_INDEX);
150-
addRows(newSheet, data);
149+
//2. Add Rows
150+
addRows(data);
151151
}
152152

153153
/**
@@ -163,10 +163,10 @@ protected void createExcel(List<T> data) {
163163
* @throws ExcelException if ONE_SHEET strategy is used and data exceeds max rows limit
164164
*/
165165
@Override
166-
public void addRows(Sheet sheet, List<T> data) {
166+
public void addRows(List<T> data) {
167167
int leftDataSize = data.size();
168168
for (Object renderedData : data) {
169-
createBody(sheet, renderedData, currentRowIndex++);
169+
createBody(currentSheet, renderedData, currentRowIndex++);
170170
leftDataSize--;
171171
if (currentRowIndex == maxRowsPerSheet && leftDataSize > 0) {
172172
//If one sheet strategy, throw exception
@@ -178,8 +178,8 @@ public void addRows(Sheet sheet, List<T> data) {
178178

179179
//If multi sheet strategy, create new sheet
180180
currentRowIndex = ROW_START_INDEX;
181-
sheet = createNewSheet();
182-
createHeader(sheet, ROW_START_INDEX);
181+
currentSheet = createNewSheet(sheetName, workbook.getSheetIndex(currentSheet) + 1);
182+
createHeader(currentSheet, ROW_START_INDEX);
183183
}
184184
}
185185
}
@@ -195,28 +195,4 @@ protected void createHeader(Sheet sheet, Integer headerRowIndex) {
195195
super.createHeader(sheet, headerRowIndex);
196196
currentRowIndex++;
197197
}
198-
199-
200-
/**
201-
* Creates a new sheet with headers.
202-
*
203-
* <p>This method resets the current row index, creates a new sheet, and adds headers to it.
204-
* If a sheet name is provided, it will be used as a base name with an index(index starts from
205-
* 0) suffix.</p>
206-
*/
207-
private Sheet createNewSheet() {
208-
//If sheet name is provided, create sheet with sheet name + idx
209-
final String finalSheetName = (sheetName != null)
210-
? String.format("%s%d", sheetName, currentSheetIndex++)
211-
: null;
212-
213-
Sheet sheet = (finalSheetName != null)
214-
? workbook.createSheet(finalSheetName)
215-
: workbook.createSheet();
216-
217-
logger.debug("Create new Sheet : {}.", sheet.getSheetName());
218-
219-
return sheet;
220-
}
221-
222198
}

src/main/java/io/github/hee9841/excel/core/exporter/ExcelExporter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,5 @@ public interface ExcelExporter<T> {
3232
*
3333
* @param data The list of data objects to be added as rows
3434
*/
35-
void addRows(Sheet sheet, List<T> data);
35+
void addRows(List<T> data);
3636
}

src/main/java/io/github/hee9841/excel/core/exporter/SXSSFExporter.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,29 @@ protected void createHeader(Sheet sheet, Integer headerRowIndex) {
8989
}
9090
}
9191

92+
/**
93+
* Creates a new sheet with headers.
94+
*
95+
* <p>This method resets the current row index, creates a new sheet, and adds headers to it.
96+
* If a sheet name is provided, it will be used as a base name with an index(index starts from
97+
* 0) suffix.</p>
98+
*/
99+
protected Sheet createNewSheet(String sheetName, int sheetIndex) {
100+
//If sheet name is provided, create sheet with sheet name + idx
101+
final String finalSheetName = (sheetName != null)
102+
? String.format("%s(%d)", sheetName, sheetIndex)
103+
: null;
104+
105+
106+
Sheet sheet = (finalSheetName != null)
107+
? workbook.createSheet(finalSheetName)
108+
: workbook.createSheet();
109+
110+
logger.debug("Create new Sheet : {}.", sheet.getSheetName());
111+
112+
return sheet;
113+
}
114+
92115
/**
93116
* Creates a row in the Excel sheet for the given data object.
94117
* This method handles field access and cell value setting based on column mapping information.
@@ -133,9 +156,8 @@ public final void write(OutputStream stream) throws IOException {
133156
}
134157
logger.info("Start to write Excel file for DTO class({}.java).", dtoTypeName);
135158

136-
try (SXSSFWorkbook autoCloseableWb = this.workbook;
137-
OutputStream autoCloseableStream = stream) {
138-
autoCloseableWb.write(autoCloseableStream);
159+
try (SXSSFWorkbook autoCloseableWb = this.workbook) {
160+
autoCloseableWb.write(stream);
139161
logger.info("Successfully wrote Excel file for DTO class({}.java).", dtoTypeName);
140162
}
141163
}

src/test/java/io/github/hee9841/excel/core/exporter/DefaultExcelExporterByteOutputStreamTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -274,12 +274,12 @@ void createSheetWithSpecifiedName() throws IOException {
274274
//then
275275
try (Workbook workbook = WorkbookFactory.create(
276276
new ByteArrayInputStream(os.toByteArray()))) {
277-
assertEquals("TestSheet0", workbook.getSheetAt(0).getSheetName());
278-
assertEquals("TestSheet1", workbook.getSheetAt(1).getSheetName());
277+
assertEquals("TestSheet(0)", workbook.getSheetAt(0).getSheetName());
278+
assertEquals("TestSheet(1)", workbook.getSheetAt(1).getSheetName());
279279
}
280280

281-
assertTrue(memoryAppender.isPresent("Create new Sheet : TestSheet0.", Level.DEBUG));
282-
assertTrue(memoryAppender.isPresent("Create new Sheet : TestSheet1.", Level.DEBUG));
281+
assertTrue(memoryAppender.isPresent("Create new Sheet : TestSheet(0).", Level.DEBUG));
282+
assertTrue(memoryAppender.isPresent("Create new Sheet : TestSheet(1).", Level.DEBUG));
283283

284284
}
285285
}
@@ -308,7 +308,7 @@ void checkFormulaType() throws IOException {
308308
// then
309309
try (Workbook workbook = WorkbookFactory
310310
.create(new ByteArrayInputStream(os.toByteArray()))) {
311-
Sheet sheet = workbook.getSheet("TestSheet0");
311+
Sheet sheet = workbook.getSheetAt(0);
312312

313313
for (int i = 1; i < 10; i++) {
314314
Row row = sheet.getRow(i);

0 commit comments

Comments
 (0)