diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/ExcelBuilderImpl.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/ExcelBuilderImpl.java index 97128f56c..882c29faf 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/ExcelBuilderImpl.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/ExcelBuilderImpl.java @@ -81,8 +81,6 @@ public void addContent(Collection data, WriteSheet writeSheet, WriteTable wri excelWriteAddExecutor = new ExcelWriteAddExecutor(context); } excelWriteAddExecutor.add(data); - // execute callback after the sheet is written - WriteHandlerUtils.afterSheetDispose(context); } catch (RuntimeException e) { finishOnException(); throw e; @@ -106,8 +104,6 @@ public void fill(Object data, FillConfig fillConfig, WriteSheet writeSheet) { excelWriteFillExecutor = new ExcelWriteFillExecutor(context); } excelWriteFillExecutor.fill(data, fillConfig); - // execute callback after the sheet is written - WriteHandlerUtils.afterSheetDispose(context); } catch (RuntimeException e) { finishOnException(); throw e; @@ -124,6 +120,9 @@ private void finishOnException() { @Override public void finish(boolean onException) { if (context != null) { + // executes the callback after the current sheet has been fully written. + WriteHandlerUtils.afterSheetDispose(context); + context.finish(onException); } } diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/handler/CountingWriteHandler.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/handler/CountingWriteHandler.java new file mode 100644 index 000000000..2f2cefc91 --- /dev/null +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/handler/CountingWriteHandler.java @@ -0,0 +1,196 @@ +/* + * 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.handler; + +import java.util.List; +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.handler.RowWriteHandler; +import org.apache.fesod.sheet.write.handler.SheetWriteHandler; +import org.apache.fesod.sheet.write.handler.WorkbookWriteHandler; +import org.apache.fesod.sheet.write.handler.context.SheetWriteHandlerContext; +import org.apache.fesod.sheet.write.metadata.holder.WriteSheetHolder; +import org.apache.fesod.sheet.write.metadata.holder.WriteTableHolder; +import org.apache.fesod.sheet.write.metadata.holder.WriteWorkbookHolder; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.junit.jupiter.api.Assertions; + +public class CountingWriteHandler + implements WorkbookWriteHandler, SheetWriteHandler, RowWriteHandler, CellWriteHandler { + + private final long headCount; + private final long dataCount; + + private long beforeCellCreate = 0L; + private long afterCellCreate = 0L; + private long afterCellDataConverted = 0L; + private long afterCellDispose = 0L; + private long beforeRowCreate = 0L; + private long afterRowCreate = 0L; + private long afterRowDispose = 0L; + private long beforeSheetCreate = 0L; + private long afterSheetCreate = 0L; + private long afterSheetDispose = 0L; + private long beforeWorkbookCreate = 0L; + private long afterWorkbookCreate = 0L; + private long afterWorkbookDispose = 0L; + + public CountingWriteHandler(long headCount, long dataCount) { + this.headCount = headCount; + this.dataCount = dataCount; + } + + @Override + public void beforeCellCreate( + WriteSheetHolder writeSheetHolder, + WriteTableHolder writeTableHolder, + Row row, + Head head, + Integer columnIndex, + Integer relativeRowIndex, + Boolean isHead) { + if (isHead) { + beforeCellCreate++; + } + } + + @Override + public void afterCellCreate( + WriteSheetHolder writeSheetHolder, + WriteTableHolder writeTableHolder, + Cell cell, + Head head, + Integer relativeRowIndex, + Boolean isHead) { + if (isHead) { + afterCellCreate++; + } + } + + @Override + public void afterCellDataConverted( + WriteSheetHolder writeSheetHolder, + WriteTableHolder writeTableHolder, + WriteCellData cellData, + Cell cell, + Head head, + Integer relativeRowIndex, + Boolean isHead) { + afterCellDataConverted++; + } + + @Override + public void afterCellDispose( + WriteSheetHolder writeSheetHolder, + WriteTableHolder writeTableHolder, + List> cellDataList, + Cell cell, + Head head, + Integer relativeRowIndex, + Boolean isHead) { + if (isHead) { + afterCellDispose++; + } + } + + @Override + public void beforeRowCreate( + WriteSheetHolder writeSheetHolder, + WriteTableHolder writeTableHolder, + Integer rowIndex, + Integer relativeRowIndex, + Boolean isHead) { + if (isHead) { + beforeRowCreate++; + } + } + + @Override + public void afterRowCreate( + WriteSheetHolder writeSheetHolder, + WriteTableHolder writeTableHolder, + Row row, + Integer relativeRowIndex, + Boolean isHead) { + if (isHead) { + afterRowCreate++; + } + } + + @Override + public void afterRowDispose( + WriteSheetHolder writeSheetHolder, + WriteTableHolder writeTableHolder, + Row row, + Integer relativeRowIndex, + Boolean isHead) { + if (isHead) { + afterRowDispose++; + } + } + + @Override + public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { + beforeSheetCreate++; + } + + @Override + public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { + afterSheetCreate++; + } + + @Override + public void beforeWorkbookCreate() { + beforeWorkbookCreate++; + } + + @Override + public void afterWorkbookCreate(WriteWorkbookHolder writeWorkbookHolder) { + afterWorkbookCreate++; + } + + @Override + public void afterWorkbookDispose(WriteWorkbookHolder writeWorkbookHolder) { + afterWorkbookDispose++; + } + + @Override + public void afterSheetDispose(SheetWriteHandlerContext context) { + afterSheetDispose++; + } + + public void afterAll() { + Assertions.assertEquals(headCount, beforeCellCreate); + Assertions.assertEquals(headCount, afterCellCreate); + Assertions.assertEquals(dataCount, afterCellDataConverted); + Assertions.assertEquals(headCount, afterCellDispose); + Assertions.assertEquals(headCount, beforeRowCreate); + Assertions.assertEquals(headCount, afterRowCreate); + Assertions.assertEquals(headCount, afterRowDispose); + Assertions.assertEquals(1L, beforeSheetCreate); + Assertions.assertEquals(1L, afterSheetCreate); + Assertions.assertEquals(1L, beforeWorkbookCreate); + Assertions.assertEquals(1L, afterWorkbookCreate); + Assertions.assertEquals(1L, afterWorkbookDispose); + Assertions.assertEquals(1L, afterSheetDispose); + } +} diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/handler/WriteHandlerTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/handler/WriteHandlerTest.java index 475c55669..554cd8a19 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/handler/WriteHandlerTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/handler/WriteHandlerTest.java @@ -26,11 +26,19 @@ package org.apache.fesod.sheet.handler; import java.io.File; +import java.net.URISyntaxException; +import java.net.URL; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import org.apache.fesod.sheet.ExcelWriter; import org.apache.fesod.sheet.FesodSheet; import org.apache.fesod.sheet.util.TestFileUtil; -import org.junit.jupiter.api.BeforeAll; +import org.apache.fesod.sheet.write.metadata.WriteSheet; +import org.apache.fesod.sheet.write.metadata.WriteTable; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; @@ -41,15 +49,31 @@ @TestMethodOrder(MethodOrderer.MethodName.class) public class WriteHandlerTest { - private static File file07; - private static File file03; - private static File fileCsv; + private File file07; + private File file03; + private File fileCsv; - @BeforeAll - public static void init() { + private File fillTemplate07; + private File fillTemplate03; + private File fill07; + private File fill03; + + @BeforeEach + void init() throws Exception { file07 = TestFileUtil.createNewFile("writeHandler07.xlsx"); file03 = TestFileUtil.createNewFile("writeHandler03.xls"); fileCsv = TestFileUtil.createNewFile("writeHandlerCsv.csv"); + + fillTemplate07 = loadTemplate("fillHandler07.xlsx"); + fillTemplate03 = loadTemplate("fillHandler03.xls"); + fill07 = TestFileUtil.createNewFile("fill07.xlsx"); + fill03 = TestFileUtil.createNewFile("fill03.xls"); + } + + private File loadTemplate(String filename) throws URISyntaxException { + URL resource = getClass().getClassLoader().getResource("fill" + File.separator + filename); + Assertions.assertNotNull(resource); + return new File(resource.toURI()); } @Test @@ -97,6 +121,46 @@ public void t23TableWriteCsv() throws Exception { tableWrite(fileCsv); } + @Test + public void t31SheetWrite07() throws Exception { + writeSheetWithMultiWrites(file07); + } + + @Test + public void t32SheetWrite03() throws Exception { + writeSheetWithMultiWrites(file03); + } + + @Test + public void t33SheetWriteCsv() throws Exception { + writeSheetWithMultiWrites(fileCsv); + } + + @Test + public void t41TableWrite07() throws Exception { + writeTableWithMultiWrites(file07); + } + + @Test + public void t42TableWrite03() throws Exception { + writeTableWithMultiWrites(file03); + } + + @Test + public void t43TableWriteCsv() throws Exception { + writeTableWithMultiWrites(fileCsv); + } + + @Test + public void t51SheetFill07() throws Exception { + fillSheetWithMultiFills(fillTemplate07, fill07); + } + + @Test + public void t52SheetFill03() throws Exception { + fillSheetWithMultiFills(fillTemplate03, fill03); + } + private void workbookWrite(File file) { WriteHandler writeHandler = new WriteHandler(); FesodSheet.write(file) @@ -117,6 +181,24 @@ private void sheetWrite(File file) { writeHandler.afterAll(); } + private void writeSheetWithMultiWrites(File file) { + CountingWriteHandler writeHandler = new CountingWriteHandler(1L, 2L); + + try (ExcelWriter writer = + FesodSheet.write(file).head(WriteHandlerData.class).build()) { + + WriteSheet writeSheet = FesodSheet.writerSheet() + .needHead(Boolean.TRUE) + .registerWriteHandler(writeHandler) + .build(); + + writer.write(data(), writeSheet); + writer.write(data(), writeSheet); + } + + writeHandler.afterAll(); + } + private void tableWrite(File file) { WriteHandler writeHandler = new WriteHandler(); FesodSheet.write(file) @@ -128,6 +210,47 @@ private void tableWrite(File file) { writeHandler.afterAll(); } + private void writeTableWithMultiWrites(File file) { + CountingWriteHandler writeHandler = new CountingWriteHandler(2L, 2L); + + try (ExcelWriter writer = + FesodSheet.write(file).head(WriteHandlerData.class).build()) { + + WriteSheet writeSheet = FesodSheet.writerSheet() + .needHead(Boolean.FALSE) + .registerWriteHandler(writeHandler) + .build(); + WriteTable table1 = FesodSheet.writerTable(0).needHead(Boolean.TRUE).build(); + WriteTable table2 = FesodSheet.writerTable(1).needHead(Boolean.TRUE).build(); + + writer.write(data(), writeSheet, table1); + writer.write(data(), writeSheet, table2); + } + + writeHandler.afterAll(); + } + + private void fillSheetWithMultiFills(File template, File file) { + CountingWriteHandler writeHandler = new CountingWriteHandler(0L, 4L); + + try (ExcelWriter writer = FesodSheet.write(file).withTemplate(template).build()) { + + WriteSheet writeSheet = + FesodSheet.writerSheet().registerWriteHandler(writeHandler).build(); + + Map data1 = new HashMap<>(); + data1.put("name", "Tom"); + + Map data2 = new HashMap<>(); + data2.put("code", "Custom Code"); + + writer.fill(data1, writeSheet); + writer.fill(data2, writeSheet); + } + + writeHandler.afterAll(); + } + private List data() { List list = new ArrayList(); for (int i = 0; i < 1; i++) { diff --git a/fesod-sheet/src/test/resources/fill/fillHandler03.xls b/fesod-sheet/src/test/resources/fill/fillHandler03.xls new file mode 100644 index 000000000..44305a77f Binary files /dev/null and b/fesod-sheet/src/test/resources/fill/fillHandler03.xls differ diff --git a/fesod-sheet/src/test/resources/fill/fillHandler07.xlsx b/fesod-sheet/src/test/resources/fill/fillHandler07.xlsx new file mode 100644 index 000000000..9ed3b2d7d Binary files /dev/null and b/fesod-sheet/src/test/resources/fill/fillHandler07.xlsx differ