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

centic pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/poi.git

commit ac4295deac5ffe1dc5bf8c30b1a9e653ccf1786c
Author: Dominik Stadler <[email protected]>
AuthorDate: Sun Jan 11 18:58:55 2026 +0100

    Avoid NPE when a row in a workbook was deleted and thus getRow() returns 
null
---
 .../apache/poi/xssf/extractor/XSSFExportToXml.java    | 19 ++++++++++++-------
 .../poi/xssf/extractor/TestXSSFExportToXML.java       | 14 ++++++++++++++
 2 files changed, 26 insertions(+), 7 deletions(-)

diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java 
b/poi-ooxml/src/main/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java
index 65d0f6c3d5..4ebdf83fac 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java
@@ -156,7 +156,7 @@ public class XSSFExportToXml implements Comparator<String>{
         indexMap.clear();
         xpaths.sort(this);
         indexMap.clear();
-        
+
         for(String xpath : xpaths) {
 
             XSSFSingleXmlCell simpleXmlCell = 
singleXmlCellsMappings.get(xpath);
@@ -170,7 +170,7 @@ public class XSSFExportToXml implements Comparator<String>{
                     if (cell!=null) {
                         Node currentNode = 
getNodeByXPath(xpath,doc.getFirstChild(),doc,false);
                         mapCellOnNode(cell,currentNode);
-                        
+
                         //remove nodes which are empty in order to keep the 
output xml valid
                         // FIXME: what should be done if 
currentNode.getTextContent() is null?
                         if ("".equals(currentNode.getTextContent()) && 
currentNode.getParentNode() != null) {
@@ -192,6 +192,11 @@ public class XSSFExportToXml implements Comparator<String>{
                     for(int i = startRow; i<= endRow; i++) {
                         XSSFRow row = sheet.getRow(i);
 
+                        // some external created files can miss rows
+                        if (row == null) {
+                            continue;
+                        }
+
                         Node tableRootNode = 
getNodeByXPath(table.getCommonXpath(), doc.getFirstChild(), doc, true);
 
                         short startColumnIndex = 
table.getStartCellReference().getCol();
@@ -255,7 +260,7 @@ public class XSSFExportToXml implements Comparator<String>{
             Schema schema = factory.newSchema(source);
             Validator validator = schema.newValidator();
             validator.validate(new DOMSource(xml));
-            
+
             //if no exceptions where raised, the document is valid
             return true;
         } catch(IOException e) {
@@ -289,8 +294,8 @@ public class XSSFExportToXml implements Comparator<String>{
                }
            }
            break;
-        
-        case NUMERIC: 
+
+        case NUMERIC:
              if (DateUtil.isCellDateFormatted(cell)) {
                   value = getFormattedDate(cell);
               } else {
@@ -459,7 +464,7 @@ public class XSSFExportToXml implements Comparator<String>{
         }
         return Integer.compare(leftIndexOf, rightIndexOf);
     }
-    
+
     private int getAndStoreIndex(String samePath,String withoutNamespace) {
         String withPath = samePath+"/"+withoutNamespace;
         return indexMap.getOrDefault(withPath, -1);
@@ -470,7 +475,7 @@ public class XSSFExportToXml implements Comparator<String>{
         if(returnNode != null) {
             return returnNode;
         }
-        
+
         return node.getAttributes().getNamedItem("name");
     }
 
diff --git 
a/poi-ooxml/src/test/java/org/apache/poi/xssf/extractor/TestXSSFExportToXML.java
 
b/poi-ooxml/src/test/java/org/apache/poi/xssf/extractor/TestXSSFExportToXML.java
index 8fbd2ad535..dff645af4c 100644
--- 
a/poi-ooxml/src/test/java/org/apache/poi/xssf/extractor/TestXSSFExportToXML.java
+++ 
b/poi-ooxml/src/test/java/org/apache/poi/xssf/extractor/TestXSSFExportToXML.java
@@ -677,6 +677,20 @@ public final class TestXSSFExportToXML {
         }
     }
 
+    @Test
+    void testMissingRow() throws Exception {
+        try (XSSFWorkbook wb = 
XSSFTestDataSamples.openSampleWorkbook("xxe_in_schema.xlsx")) {
+            // delete the row to cause a null-row
+            wb.getSheetAt(0).removeRow(wb.getSheetAt(0).getRow(9));
+
+            for (XSSFMap map : wb.getCustomXMLMappings()) {
+                XSSFExportToXml exporter = new XSSFExportToXml(map);
+                UnsynchronizedByteArrayOutputStream bos = 
UnsynchronizedByteArrayOutputStream.builder().get();
+                assertThrows(SAXParseException.class, () -> 
exporter.exportToXML(bos, true));
+            }
+        }
+    }
+
     private static class XPathNSContext implements NamespaceContext {
         final Map<String,String> nsMap = new HashMap<>();
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to