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

mthomsen pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new dd8681e3a2 NIFI-13819 Provided a row number and sheet name if 
ExcelReader throws exception when it fails to convert a value.
dd8681e3a2 is described below

commit dd8681e3a24882a94e7fc9ab0c35cbc25aac988e
Author: dan-s1 <[email protected]>
AuthorDate: Mon Sep 30 22:42:18 2024 +0000

    NIFI-13819 Provided a row number and sheet name if ExcelReader throws 
exception when it fails to convert a value.
    
    This closes #9327
    
    Signed-off-by: Mike Thomsen <[email protected]>
---
 .../org/apache/nifi/excel/ExcelRecordReader.java     | 10 ++++++++--
 .../org/apache/nifi/excel/TestExcelRecordReader.java | 20 ++++++++++++++++++++
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git 
a/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/main/java/org/apache/nifi/excel/ExcelRecordReader.java
 
b/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/main/java/org/apache/nifi/excel/ExcelRecordReader.java
index f9df73a38c..8c49603c11 100644
--- 
a/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/main/java/org/apache/nifi/excel/ExcelRecordReader.java
+++ 
b/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/main/java/org/apache/nifi/excel/ExcelRecordReader.java
@@ -76,14 +76,20 @@ public class ExcelRecordReader implements RecordReader {
 
     @Override
     public Record nextRecord(boolean coerceTypes, boolean dropUnknownFields) 
throws MalformedRecordException {
+        Row currentRow = null;
         try {
             if (rowIterator.hasNext()) {
-                Row currentRow = rowIterator.next();
+                currentRow = rowIterator.next();
                 Map<String, Object> currentRowValues = 
getCurrentRowValues(currentRow, coerceTypes, dropUnknownFields);
                 return new MapRecord(schema, currentRowValues);
             }
         } catch (Exception e) {
-            throw new MalformedRecordException("Read next Record from Excel 
XLSX failed", e);
+            String exceptionMessage = "Read next Record from Excel XLSX 
failed";
+            if (currentRow != null) {
+                exceptionMessage = String.format("%s on row %s in sheet %s",
+                        exceptionMessage, currentRow.getRowNum(), 
currentRow.getSheet().getSheetName());
+            }
+            throw new MalformedRecordException(exceptionMessage, e);
         }
         return null;
     }
diff --git 
a/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/test/java/org/apache/nifi/excel/TestExcelRecordReader.java
 
b/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/test/java/org/apache/nifi/excel/TestExcelRecordReader.java
index 3f30b53e82..acc0b8d2a0 100644
--- 
a/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/test/java/org/apache/nifi/excel/TestExcelRecordReader.java
+++ 
b/nifi-extension-bundles/nifi-poi-bundle/nifi-poi-services/src/test/java/org/apache/nifi/excel/TestExcelRecordReader.java
@@ -284,6 +284,26 @@ public class TestExcelRecordReader {
         assertEquals(7, records.size());
     }
 
+    @Test
+    void testWhereCellValueDoesNotMatchSchemaType()  {
+        RecordSchema schema = new SimpleRecordSchema(Arrays.asList(new 
RecordField("first", RecordFieldType.STRING.getDataType()),
+                new RecordField("second", 
RecordFieldType.FLOAT.getDataType())));
+        List<String> requiredSheets = Collections.singletonList("TestSheetA");
+        ExcelRecordReaderConfiguration configuration = new 
ExcelRecordReaderConfiguration.Builder()
+                .withSchema(schema)
+                .withFirstRow(2)
+                .withRequiredSheets(requiredSheets)
+                .build();
+
+        final MalformedRecordException mre = 
assertThrows(MalformedRecordException.class, () ->  {
+            ExcelRecordReader recordReader = new 
ExcelRecordReader(configuration, getInputStream(MULTI_SHEET_FILE), logger);
+            getRecords(recordReader, true, false);
+        });
+
+        assertInstanceOf(NumberFormatException.class, mre.getCause());
+        assertTrue(mre.getMessage().contains("on row") && 
mre.getMessage().contains("in sheet"));
+    }
+
     @Test
     void testPasswordProtected() throws Exception {
         RecordSchema schema = getPasswordProtectedSchema();

Reply via email to