From aacbd514ce4af7e41f54fc2418394c563395c9bd Mon Sep 17 00:00:00 2001 From: dan-s1 Date: Mon, 28 Oct 2024 20:59:23 -0400 Subject: [PATCH] NIFI-13922 Fixed SplitExcel to use the evaluated formula value for cells (#9466) Corrected the copy configuration in SplitExcel to ensure the evaluated value of formulas are copied and not the actual formula. Signed-off-by: David Handermann --- .../nifi/processors/excel/SplitExcel.java | 2 +- .../nifi/processors/excel/TestSplitExcel.java | 36 +++++++++++++++++- .../excel/dataWithSharedFormula.xlsx | Bin 16865 -> 14138 bytes 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/main/java/org/apache/nifi/processors/excel/SplitExcel.java b/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/main/java/org/apache/nifi/processors/excel/SplitExcel.java index 727440b921..145449bcd0 100644 --- a/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/main/java/org/apache/nifi/processors/excel/SplitExcel.java +++ b/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/main/java/org/apache/nifi/processors/excel/SplitExcel.java @@ -111,7 +111,7 @@ public class SplitExcel extends AbstractProcessor { private static final List DESCRIPTORS = List.of(PROTECTION_TYPE, PASSWORD); private static final Set RELATIONSHIPS = Set.of(REL_ORIGINAL, REL_FAILURE, REL_SPLIT); private static final CellCopyPolicy CELL_COPY_POLICY = new CellCopyPolicy.Builder() - .cellFormula(CellCopyPolicy.DEFAULT_COPY_CELL_FORMULA_POLICY) + .cellFormula(false) // NOTE: setting to false allows for copying the evaluated formula value. .cellStyle(false) // NOTE: setting to false avoids exceeding the maximum number of cell styles (64000) in a .xlsx Workbook. .cellValue(CellCopyPolicy.DEFAULT_COPY_CELL_VALUE_POLICY) .condenseRows(CellCopyPolicy.DEFAULT_CONDENSE_ROWS_POLICY) diff --git a/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/test/java/org/apache/nifi/processors/excel/TestSplitExcel.java b/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/test/java/org/apache/nifi/processors/excel/TestSplitExcel.java index 52927b3e26..1f1267c19f 100644 --- a/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/test/java/org/apache/nifi/processors/excel/TestSplitExcel.java +++ b/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/test/java/org/apache/nifi/processors/excel/TestSplitExcel.java @@ -19,6 +19,11 @@ package org.apache.nifi.processors.excel; import org.apache.nifi.util.MockFlowFile; import org.apache.nifi.util.TestRunner; import org.apache.nifi.util.TestRunners; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -26,6 +31,8 @@ import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; +import java.util.Objects; +import java.util.stream.Stream; import static org.apache.nifi.flowfile.attributes.FragmentAttributes.FRAGMENT_COUNT; import static org.apache.nifi.flowfile.attributes.FragmentAttributes.FRAGMENT_ID; @@ -33,6 +40,7 @@ import static org.apache.nifi.flowfile.attributes.FragmentAttributes.FRAGMENT_IN import static org.apache.nifi.flowfile.attributes.FragmentAttributes.SEGMENT_ORIGINAL_FILENAME; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; public class TestSplitExcel { private TestRunner runner; @@ -131,5 +139,31 @@ public class TestSplitExcel { runner.assertTransferCount(SplitExcel.REL_SPLIT, 2); runner.assertTransferCount(SplitExcel.REL_ORIGINAL, 1); runner.assertTransferCount(SplitExcel.REL_FAILURE, 0); + + for (MockFlowFile flowFile : runner.getFlowFilesForRelationship(SplitExcel.REL_SPLIT)) { + try (XSSFWorkbook workbook = new XSSFWorkbook(flowFile.getContentStream())) { + Sheet firstSheet = workbook.sheetIterator().next(); + + // Start from the second row as the first row has column header names + List formulaCells = Stream.iterate(firstSheet.getFirstRowNum() + 1, rowIndex -> rowIndex + 1) + .limit(firstSheet.getLastRowNum()) + .map(firstSheet::getRow) + .filter(Objects::nonNull) + .map(row -> row.getCell(7)) // NOTE: The argument is 0 based although the formula column when viewed in Excel is in the 8th column. + .filter(Objects::nonNull) + .toList(); + + for (Cell formulaCell : formulaCells) { + Row row = formulaCell.getRow(); + Sheet sheet = row.getSheet(); + String messagePrefix = String.format("Cell %s in row %s in sheet %s", + formulaCell.getColumnIndex(), row.getRowNum(), sheet.getSheetName()); + + // If copy cell formula is set to true the cell types would be FORMULA and the numeric value would be 0.0. + assertEquals(CellType.NUMERIC, formulaCell.getCellType(), String.format("%s did not have the expected NUMERIC cell type", messagePrefix)); + assertTrue(formulaCell.getNumericCellValue() > 0.0, String.format("%s did not have expected numeric value greater than 0.0", messagePrefix)); + } + } + } } -} +} \ No newline at end of file diff --git a/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/test/resources/excel/dataWithSharedFormula.xlsx b/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/test/resources/excel/dataWithSharedFormula.xlsx index c399b640cbe0d981839621de3a95c07c529ee87e..056a0723741be10cc73048a1b36b2e86277bf705 100644 GIT binary patch literal 14138 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

>9MAZOjHcXD79zn+=^sKC8e4`-y4 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 y;$PA1+MFb~wbYv3>d;Qs(Tyq`A!