From d47fff6e1c6dfaf1b00c983e5b3364b071ab3e6c Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Fri, 28 Oct 2016 18:24:04 +0000 Subject: [PATCH] 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 --- .../poi/xssf/extractor/XSSFExportToXml.java | 31 +++++++----- .../xssf/extractor/TestXSSFExportToXML.java | 47 ++++++++++-------- test-data/spreadsheet/59026.xlsx | Bin 0 -> 10400 bytes 3 files changed, 45 insertions(+), 33 deletions(-) create mode 100644 test-data/spreadsheet/59026.xlsx 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 0000000000000000000000000000000000000000..29c8c2dc6ee9412ca35863079df6ba1b191a91d3 GIT binary patch literal 10400 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 O3P=S9&mrZ{v;P4w|GDY_ literal 0 HcmV?d00001 -- 2.39.5