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]
