From: Dominik Stadler Date: Fri, 28 Oct 2016 18:24:04 +0000 (+0000) Subject: Bug 59026: Add two null-checks to make exporting XLSX to XML work X-Git-Tag: REL_3_16_BETA1~36 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=7cc4c90b700165a9cdeb60467db1306e099df93d;p=poi.git Bug 59026: Add two null-checks to make exporting XLSX to XML work git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1767057 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java b/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java index 2277d600a7..7febd236b4 100644 --- a/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java +++ b/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java @@ -29,7 +29,6 @@ import java.util.Locale; import java.util.Map; import java.util.Vector; -import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Source; import javax.xml.transform.Transformer; @@ -98,12 +97,11 @@ public class XSSFExportToXml implements Comparator{ * Exports the data in an XML stream * * @param os OutputStream in which will contain the output XML - * @param validate if true, validates the XML againts the XML Schema - * @throws SAXException - * @throws TransformerException - * @throws ParserConfigurationException + * @param validate if true, validates the XML against the XML Schema + * @throws SAXException If validating the document fails + * @throws TransformerException If transforming the document fails */ - public void exportToXML(OutputStream os, boolean validate) throws SAXException, ParserConfigurationException, TransformerException { + public void exportToXML(OutputStream os, boolean validate) throws SAXException, TransformerException { exportToXML(os, "UTF-8", validate); } @@ -112,12 +110,11 @@ public class XSSFExportToXml implements Comparator{ * * @param os OutputStream in which will contain the output XML * @param encoding the output charset encoding - * @param validate if true, validates the XML againts the XML Schema - * @throws SAXException - * @throws ParserConfigurationException - * @throws TransformerException + * @param validate if true, validates the XML against the XML Schema + * @throws SAXException If validating the document fails + * @throws TransformerException If transforming the document fails */ - public void exportToXML(OutputStream os, String encoding, boolean validate) throws SAXException, ParserConfigurationException, TransformerException{ + public void exportToXML(OutputStream os, String encoding, boolean validate) throws SAXException, TransformerException{ List singleXMLCells = map.getRelatedSingleXMLCell(); List tables = map.getRelatedTables(); @@ -240,6 +237,7 @@ public class XSSFExportToXml implements Comparator{ * * @param xml the XML to validate * @return true, if document is valid + * @throws SAXException If validating the document fails */ private boolean isValid(Document xml) throws SAXException{ try{ @@ -397,11 +395,11 @@ public class XSSFExportToXml implements Comparator{ String[] leftTokens = leftXpath.split("/"); String[] rightTokens = rightXpath.split("/"); - int minLenght = leftTokens.length< rightTokens.length? leftTokens.length : rightTokens.length; + int minLength = leftTokens.length< rightTokens.length? leftTokens.length : rightTokens.length; Node localComplexTypeRootNode = xmlSchema; - for(int i =1;i { } private int indexOfElementInComplexType(String elementName,Node complexType) { + if(complexType == null) { + return -1; + } NodeList list = complexType.getChildNodes(); int indexOf = -1; @@ -472,6 +473,10 @@ public class XSSFExportToXml implements Comparator{ private String getComplexTypeNameFromChildren(Node localComplexTypeRootNode, String elementNameWithoutNamespace) { + if(localComplexTypeRootNode == null) { + return ""; + } + NodeList list = localComplexTypeRootNode.getChildNodes(); String complexTypeName = ""; diff --git a/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFExportToXML.java b/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFExportToXML.java index 0415029004..783b7a0b26 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFExportToXML.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFExportToXML.java @@ -17,17 +17,7 @@ package org.apache.poi.xssf.extractor; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.Date; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - +import junit.framework.TestCase; import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; @@ -38,12 +28,20 @@ import org.apache.poi.xssf.XSSFTestDataSamples; import org.apache.poi.xssf.model.MapInfo; import org.apache.poi.xssf.usermodel.XSSFMap; import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.junit.Test; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; -import junit.framework.TestCase; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Collection; +import java.util.Date; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * @author Roberto Manicardi @@ -101,15 +99,13 @@ public final class TestXSSFExportToXML extends TestCase { XSSFWorkbook wb = XSSFTestDataSamples .openSampleWorkbook("CustomXmlMappings-inverse-order.xlsx"); - MapInfo mapInfo = null; - boolean found = false; for (POIXMLDocumentPart p : wb.getRelations()) { if (!(p instanceof MapInfo)) { continue; } - mapInfo = (MapInfo) p; + MapInfo mapInfo = (MapInfo) p; XSSFMap map = mapInfo.getXSSFMapById(1); XSSFExportToXml exporter = new XSSFExportToXml(map); @@ -150,13 +146,11 @@ public final class TestXSSFExportToXML extends TestCase { XSSFWorkbook wb = XSSFTestDataSamples .openSampleWorkbook("CustomXmlMappings-inverse-order.xlsx"); - MapInfo mapInfo = null; - boolean found = false; for (POIXMLDocumentPart p : wb.getRelations()) { if (p instanceof MapInfo) { - mapInfo = (MapInfo) p; + MapInfo mapInfo = (MapInfo) p; XSSFMap map = mapInfo.getXSSFMapById(1); XSSFExportToXml exporter = new XSSFExportToXml(map); @@ -340,7 +334,6 @@ public final class TestXSSFExportToXML extends TestCase { assertTrue(found); } - @Test public void testXmlExportIgnoresEmptyCells_Bugzilla_55924() throws Exception { XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("55924.xlsx"); @@ -627,4 +620,18 @@ public final class TestXSSFExportToXML extends TestCase { } assertTrue(found); } + + public void testBug59026() throws Exception { + XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("59026.xlsx"); + + Collection mappings = wb.getCustomXMLMappings(); + assertTrue(mappings.size() > 0); + for (XSSFMap map : mappings) { + XSSFExportToXml exporter = new XSSFExportToXml(map); + + ByteArrayOutputStream os = new ByteArrayOutputStream(); + exporter.exportToXML(os, false); + assertNotNull(os.toString("UTF-8")); + } + } } diff --git a/test-data/spreadsheet/59026.xlsx b/test-data/spreadsheet/59026.xlsx new file mode 100644 index 0000000000..29c8c2dc6e Binary files /dev/null and b/test-data/spreadsheet/59026.xlsx differ