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
This commit is contained in:
Dominik Stadler 2016-10-28 18:24:04 +00:00
parent 1cdf883548
commit d47fff6e1c
3 changed files with 45 additions and 33 deletions

View File

@ -29,7 +29,6 @@ import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Vector; import java.util.Vector;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys; import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source; import javax.xml.transform.Source;
import javax.xml.transform.Transformer; import javax.xml.transform.Transformer;
@ -98,12 +97,11 @@ public class XSSFExportToXml implements Comparator<String>{
* Exports the data in an XML stream * Exports the data in an XML stream
* *
* @param os OutputStream in which will contain the output XML * @param os OutputStream in which will contain the output XML
* @param validate if true, validates the XML againts the XML Schema * @param validate if true, validates the XML against the XML Schema
* @throws SAXException * @throws SAXException If validating the document fails
* @throws TransformerException * @throws TransformerException If transforming the document fails
* @throws ParserConfigurationException
*/ */
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); exportToXML(os, "UTF-8", validate);
} }
@ -112,12 +110,11 @@ public class XSSFExportToXml implements Comparator<String>{
* *
* @param os OutputStream in which will contain the output XML * @param os OutputStream in which will contain the output XML
* @param encoding the output charset encoding * @param encoding the output charset encoding
* @param validate if true, validates the XML againts the XML Schema * @param validate if true, validates the XML against the XML Schema
* @throws SAXException * @throws SAXException If validating the document fails
* @throws ParserConfigurationException * @throws TransformerException If transforming the document fails
* @throws TransformerException
*/ */
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<XSSFSingleXmlCell> singleXMLCells = map.getRelatedSingleXMLCell(); List<XSSFSingleXmlCell> singleXMLCells = map.getRelatedSingleXMLCell();
List<XSSFTable> tables = map.getRelatedTables(); List<XSSFTable> tables = map.getRelatedTables();
@ -240,6 +237,7 @@ public class XSSFExportToXml implements Comparator<String>{
* *
* @param xml the XML to validate * @param xml the XML to validate
* @return true, if document is valid * @return true, if document is valid
* @throws SAXException If validating the document fails
*/ */
private boolean isValid(Document xml) throws SAXException{ private boolean isValid(Document xml) throws SAXException{
try{ try{
@ -397,11 +395,11 @@ public class XSSFExportToXml implements Comparator<String>{
String[] leftTokens = leftXpath.split("/"); String[] leftTokens = leftXpath.split("/");
String[] rightTokens = rightXpath.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; Node localComplexTypeRootNode = xmlSchema;
for(int i =1;i <minLenght; i++) { for(int i =1;i <minLength; i++) {
String leftElementName = leftTokens[i]; String leftElementName = leftTokens[i];
String rightElementName = rightTokens[i]; String rightElementName = rightTokens[i];
@ -427,6 +425,9 @@ public class XSSFExportToXml implements Comparator<String>{
} }
private int indexOfElementInComplexType(String elementName,Node complexType) { private int indexOfElementInComplexType(String elementName,Node complexType) {
if(complexType == null) {
return -1;
}
NodeList list = complexType.getChildNodes(); NodeList list = complexType.getChildNodes();
int indexOf = -1; int indexOf = -1;
@ -472,6 +473,10 @@ public class XSSFExportToXml implements Comparator<String>{
private String getComplexTypeNameFromChildren(Node localComplexTypeRootNode, private String getComplexTypeNameFromChildren(Node localComplexTypeRootNode,
String elementNameWithoutNamespace) { String elementNameWithoutNamespace) {
if(localComplexTypeRootNode == null) {
return "";
}
NodeList list = localComplexTypeRootNode.getChildNodes(); NodeList list = localComplexTypeRootNode.getChildNodes();
String complexTypeName = ""; String complexTypeName = "";

View File

@ -17,17 +17,7 @@
package org.apache.poi.xssf.extractor; package org.apache.poi.xssf.extractor;
import java.io.ByteArrayInputStream; import junit.framework.TestCase;
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 org.apache.poi.POIXMLDocumentPart; import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType; 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.model.MapInfo;
import org.apache.poi.xssf.usermodel.XSSFMap; import org.apache.poi.xssf.usermodel.XSSFMap;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;
import org.xml.sax.EntityResolver; import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource; import org.xml.sax.InputSource;
import org.xml.sax.SAXException; 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 * @author Roberto Manicardi
@ -101,15 +99,13 @@ public final class TestXSSFExportToXML extends TestCase {
XSSFWorkbook wb = XSSFTestDataSamples XSSFWorkbook wb = XSSFTestDataSamples
.openSampleWorkbook("CustomXmlMappings-inverse-order.xlsx"); .openSampleWorkbook("CustomXmlMappings-inverse-order.xlsx");
MapInfo mapInfo = null;
boolean found = false; boolean found = false;
for (POIXMLDocumentPart p : wb.getRelations()) { for (POIXMLDocumentPart p : wb.getRelations()) {
if (!(p instanceof MapInfo)) { if (!(p instanceof MapInfo)) {
continue; continue;
} }
mapInfo = (MapInfo) p; MapInfo mapInfo = (MapInfo) p;
XSSFMap map = mapInfo.getXSSFMapById(1); XSSFMap map = mapInfo.getXSSFMapById(1);
XSSFExportToXml exporter = new XSSFExportToXml(map); XSSFExportToXml exporter = new XSSFExportToXml(map);
@ -150,13 +146,11 @@ public final class TestXSSFExportToXML extends TestCase {
XSSFWorkbook wb = XSSFTestDataSamples XSSFWorkbook wb = XSSFTestDataSamples
.openSampleWorkbook("CustomXmlMappings-inverse-order.xlsx"); .openSampleWorkbook("CustomXmlMappings-inverse-order.xlsx");
MapInfo mapInfo = null;
boolean found = false; boolean found = false;
for (POIXMLDocumentPart p : wb.getRelations()) { for (POIXMLDocumentPart p : wb.getRelations()) {
if (p instanceof MapInfo) { if (p instanceof MapInfo) {
mapInfo = (MapInfo) p; MapInfo mapInfo = (MapInfo) p;
XSSFMap map = mapInfo.getXSSFMapById(1); XSSFMap map = mapInfo.getXSSFMapById(1);
XSSFExportToXml exporter = new XSSFExportToXml(map); XSSFExportToXml exporter = new XSSFExportToXml(map);
@ -340,7 +334,6 @@ public final class TestXSSFExportToXML extends TestCase {
assertTrue(found); assertTrue(found);
} }
@Test
public void testXmlExportIgnoresEmptyCells_Bugzilla_55924() throws Exception { public void testXmlExportIgnoresEmptyCells_Bugzilla_55924() throws Exception {
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("55924.xlsx"); XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("55924.xlsx");
@ -627,4 +620,18 @@ public final class TestXSSFExportToXML extends TestCase {
} }
assertTrue(found); assertTrue(found);
} }
public void testBug59026() throws Exception {
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("59026.xlsx");
Collection<XSSFMap> 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"));
}
}
} }

Binary file not shown.