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

hansva pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hop.git


The following commit(s) were added to refs/heads/master by this push:
     new 98172aae18 Updated Excel Transform to allow streaming where a template 
is used
     new 89ba7e37ff Merge pull request #2896 from 
dameikle/excel_streaming_template
98172aae18 is described below

commit 98172aae188405e18532be926ccba18791f45b70
Author: David Meikle <[email protected]>
AuthorDate: Wed May 3 15:24:09 2023 +0100

    Updated Excel Transform to allow streaming where a template is used
---
 .../excelwriter/ExcelWriterTransform.java          |  33 ++++++++++++---
 .../excelwriter/ExcelWriterTransformTest.java      |  47 ++++++++++++++++++++-
 .../template_with_formatting_streaming.xlsx        | Bin 0 -> 10206 bytes
 3 files changed, 74 insertions(+), 6 deletions(-)

diff --git 
a/plugins/transforms/excel/src/main/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterTransform.java
 
b/plugins/transforms/excel/src/main/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterTransform.java
index 083bd80007..7afa795a75 100644
--- 
a/plugins/transforms/excel/src/main/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterTransform.java
+++ 
b/plugins/transforms/excel/src/main/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterTransform.java
@@ -985,17 +985,28 @@ public class ExcelWriterTransform
       int startY = !Utils.isEmpty(data.realStartingCell) ? posY : 
Math.max(posY, sheet.getLastRowNum());
 
       ExcelWriterWorkbookDefinition workbookDefinition =
-          new ExcelWriterWorkbookDefinition(baseFileName, file, wb, sheet, 
posX, startY);
-      workbookDefinition.setSplitNr(splitNr);
-      data.usedFiles.add(workbookDefinition);
-      data.currentWorkbookDefinition = workbookDefinition;
-      data.currentWorkbookDefinition.clearStyleCache(numOfFields);
+              prepareWorkbookDefinition(numOfFields, splitNr, file, wb, sheet, 
posX, baseFileName, startY);
 
       // may have to write a header here
       if (meta.isHeaderEnabled()
           && !(!data.createNewSheet && meta.isAppendOmitHeader() && 
appendingToSheet)) {
         
data.currentWorkbookDefinition.setSheet(writeHeader(workbookDefinition, sheet, 
posX, posY));
       }
+
+      // Reload Worksheet in Streaming mode when a template is used
+      if (meta.getFile().getExtension().equalsIgnoreCase("xlsx")
+              && meta.getFile().isStreamingData()
+              && meta.getTemplate().isTemplateEnabled()) {
+        try (InputStream inputStream = 
HopVfs.getInputStream(HopVfs.getFilename(file))) {
+          XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream);
+          wb = new SXSSFWorkbook(xssfWorkbook, 100);
+          sheet = wb.getSheet(data.realSheetname);
+          // Replace workbookDefinition with reloaded one
+          data.usedFiles.remove(workbookDefinition);
+          prepareWorkbookDefinition(numOfFields, splitNr, file, wb, sheet, 
posX, baseFileName, startY);
+        }
+      }
+
       if (log.isDebug()) {
         logDebug(
             BaseMessages.getString(
@@ -1009,6 +1020,18 @@ public class ExcelWriterTransform
     }
   }
 
+  private ExcelWriterWorkbookDefinition prepareWorkbookDefinition(int 
numOfFields, int splitNr, FileObject file,
+                                                                  Workbook wb, 
Sheet sheet, int posX,
+                                                                  String 
baseFileName, int startY) {
+    ExcelWriterWorkbookDefinition workbookDefinition =
+            new ExcelWriterWorkbookDefinition(baseFileName, file, wb, sheet, 
posX, startY);
+    workbookDefinition.setSplitNr(splitNr);
+    data.usedFiles.add(workbookDefinition);
+    data.currentWorkbookDefinition = workbookDefinition;
+    data.currentWorkbookDefinition.clearStyleCache(numOfFields);
+    return workbookDefinition;
+  }
+
   private Sheet openLine(Sheet sheet, int posY) {
     if (data.shiftExistingCells) {
       sheet.shiftRows(posY, Math.max(posY, sheet.getLastRowNum()), 1);
diff --git 
a/plugins/transforms/excel/src/test/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterTransformTest.java
 
b/plugins/transforms/excel/src/test/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterTransformTest.java
index bcfb6c5fcf..ef99fd912e 100644
--- 
a/plugins/transforms/excel/src/test/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterTransformTest.java
+++ 
b/plugins/transforms/excel/src/test/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterTransformTest.java
@@ -203,7 +203,7 @@ public class ExcelWriterTransformTest {
     when(vmi.getNumber(anyObject())).thenReturn(12.0);
 
     when(metaMock.getTemplate().isTemplateEnabled()).thenReturn(true);
-    when(metaMock.getFile().isStreamingData()).thenReturn(true);
+    when(metaMock.getFile().isStreamingData()).thenReturn(false);
     when(metaMock.isHeaderEnabled()).thenReturn(false);
     when(metaMock.getFile().getExtension()).thenReturn(XLSX);
     when(metaMock.getOutputFields()).thenReturn(fields);
@@ -223,6 +223,51 @@ public class ExcelWriterTransformTest {
     verify(dataMock.currentWorkbookDefinition.getSheet()).getRow(1);
   }
 
+
+  @Test
+  public void testWriteUsingTemplateWithFormatting_Streaming() throws 
Exception {
+
+    String path = Files.createTempDir().getAbsolutePath() + File.separator + 
"formatted_streaming.xlsx";
+
+    dataMock.fieldnrs = new int[] {0};
+    dataMock.linkfieldnrs = new int[] {-1};
+    dataMock.commentfieldnrs = new int[] {-1};
+    dataMock.createNewFile = true;
+    dataMock.realTemplateFileName =
+            
getClass().getResource("template_with_formatting_streaming.xlsx").getFile();
+    dataMock.realSheetname = "Data";
+    dataMock.inputRowMeta = mock(IRowMeta.class);
+
+    List<ExcelWriterOutputField> fields = new ArrayList<>();
+    fields.add(new ExcelWriterOutputField());
+
+    IValueMeta vmi = mock(ValueMetaInteger.class);
+    when(vmi.getType()).thenReturn(IValueMeta.TYPE_INTEGER);
+    when(vmi.getName()).thenReturn("name");
+    when(vmi.getNumber(anyObject())).thenReturn(12.0);
+
+    when(metaMock.getTemplate().isTemplateEnabled()).thenReturn(true);
+    when(metaMock.getFile().isStreamingData()).thenReturn(true);
+    when(metaMock.getStartingCell()).thenReturn("A2");
+
+    when(metaMock.isHeaderEnabled()).thenReturn(false);
+    when(metaMock.getFile().getExtension()).thenReturn(XLSX);
+    when(metaMock.getOutputFields()).thenReturn(fields);
+
+    when(dataMock.inputRowMeta.size()).thenReturn(10);
+    when(dataMock.inputRowMeta.getValueMeta(anyInt())).thenReturn(vmi);
+
+    when(transform.buildFilename(0)).thenReturn(path);
+    dataMock.usedFiles.add(dataMock.currentWorkbookDefinition);
+    transform.prepareNextOutputFile(any(Object[].class));
+
+    dataMock.currentWorkbookDefinition.setPosY(1);
+    
dataMock.currentWorkbookDefinition.setSheet(spy(dataMock.currentWorkbookDefinition.getSheet()));
+    transform.writeNextLine(dataMock.currentWorkbookDefinition, new Object[] 
{12});
+
+    verify(dataMock.currentWorkbookDefinition.getSheet(), 
times(1)).createRow(1);
+    verify(dataMock.currentWorkbookDefinition.getSheet()).getRow(1);
+  }
   @Test
   public void testValueBigNumber() throws Exception {
 
diff --git 
a/plugins/transforms/excel/src/test/resources/org/apache/hop/pipeline/transforms/excelwriter/template_with_formatting_streaming.xlsx
 
b/plugins/transforms/excel/src/test/resources/org/apache/hop/pipeline/transforms/excelwriter/template_with_formatting_streaming.xlsx
new file mode 100644
index 0000000000..28130df8a9
Binary files /dev/null and 
b/plugins/transforms/excel/src/test/resources/org/apache/hop/pipeline/transforms/excelwriter/template_with_formatting_streaming.xlsx
 differ

Reply via email to