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 c399b640cb..056a072374 100644 Binary files a/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/test/resources/excel/dataWithSharedFormula.xlsx and b/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/test/resources/excel/dataWithSharedFormula.xlsx differ