diff options
author | Greg Woolsey <gwoolsey@apache.org> | 2017-06-24 05:55:45 +0000 |
---|---|---|
committer | Greg Woolsey <gwoolsey@apache.org> | 2017-06-24 05:55:45 +0000 |
commit | 3e6d942b958744d78900efd9eb923cbbd190a73a (patch) | |
tree | bdef0af161923c67354c7d416802c318988afcbc | |
parent | 07cb031c2ece83239299e3af8acbb6f22202d15d (diff) | |
download | poi-3e6d942b958744d78900efd9eb923cbbd190a73a.tar.gz poi-3e6d942b958744d78900efd9eb923cbbd190a73a.zip |
Add file that failed regression tests as a unit test.
Adjust table style processing to allow for AlternateContent wrappers for table element style definitions.
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1799733 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFBuiltinTableStyle.java | 6 | ||||
-rw-r--r-- | src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFTableStyle.java | 40 | ||||
-rw-r--r-- | src/ooxml/testcases/org/apache/poi/xssf/model/TestStylesTable.java | 10 | ||||
-rw-r--r-- | test-data/spreadsheet/style-alternate-content.xlsx | bin | 0 -> 10103 bytes |
4 files changed, 49 insertions, 7 deletions
diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFBuiltinTableStyle.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFBuiltinTableStyle.java index aab86abca1..828ceeeec4 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFBuiltinTableStyle.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFBuiltinTableStyle.java @@ -388,20 +388,22 @@ public enum XSSFBuiltinTableStyle { final InputStream is = XSSFBuiltinTableStyle.class.getResourceAsStream("presetTableStyles.xml"); try { final Document doc = DocumentHelper.readDocument(is); + final NodeList styleNodes = doc.getDocumentElement().getChildNodes(); for (int i=0; i < styleNodes.getLength(); i++) { final Node node = styleNodes.item(i); if (node.getNodeType() != Node.ELEMENT_NODE) continue; // only care about elements final Element tag = (Element) node; String styleName = tag.getTagName(); + XSSFBuiltinTableStyle builtIn = XSSFBuiltinTableStyle.valueOf(styleName); + Node dxfsNode = tag.getElementsByTagName("dxfs").item(0); Node tableStyleNode = tag.getElementsByTagName("tableStyles").item(0); - + // hack because I can't figure out how to get XMLBeans to parse a sub-element in a standalone manner // - build a fake styles.xml file with just this built-in StylesTable styles = new StylesTable(); styles.readFrom(new ByteArrayInputStream(styleXML(dxfsNode, tableStyleNode).getBytes(Charset.forName("UTF-8")))); - XSSFBuiltinTableStyle builtIn = XSSFBuiltinTableStyle.valueOf(styleName); styleMap.put(builtIn, new XSSFBuiltinTypeStyleStyle(builtIn, styles.getExplicitTableStyle(styleName))); } } finally { diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFTableStyle.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFTableStyle.java index 0b7be4963f..8c6306d219 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFTableStyle.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFTableStyle.java @@ -17,12 +17,18 @@ package org.apache.poi.xssf.usermodel; +import java.util.ArrayList; import java.util.EnumMap; +import java.util.List; import java.util.Map; import org.apache.poi.ss.usermodel.DifferentialStyleProvider; import org.apache.poi.ss.usermodel.TableStyle; import org.apache.poi.ss.usermodel.TableStyleType; +import org.apache.xmlbeans.XmlCursor; +import org.apache.xmlbeans.XmlException; +import org.apache.xmlbeans.XmlObject; +import org.apache.xmlbeans.XmlOptions; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDxf; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDxfs; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableStyle; @@ -48,17 +54,41 @@ public class XSSFTableStyle implements TableStyle { public XSSFTableStyle(int index, CTDxfs dxfs, CTTableStyle tableStyle, IndexedColorMap colorMap) { this.name = tableStyle.getName(); this.index = index; + + List<CTDxf> dxfList = new ArrayList<CTDxf>(); + + // CT* classes don't handle "mc:AlternateContent" elements, so get the Dxf instances manually + XmlCursor cur = dxfs.newCursor(); + // sometimes there are namespaces sometimes not. + String xquery = "declare namespace x='"+XSSFRelation.NS_SPREADSHEETML+"' .//x:dxf | .//dxf"; + cur.selectPath(xquery); + while (cur.toNextSelection()) { + XmlObject obj = cur.getObject(); + String parentName = obj.getDomNode().getParentNode().getNodeName(); + // ignore alternate content choices, we won't know anything about their namespaces + if (parentName.equals("mc:Fallback") || parentName.equals("x:dxfs") || parentName.contentEquals("dxfs")) { + CTDxf dxf; + try { + if (obj instanceof CTDxf) { + dxf = (CTDxf) obj; + } else { + dxf = CTDxf.Factory.parse(obj.newXMLStreamReader(), new XmlOptions().setDocumentType(CTDxf.type)); + } + if (dxf != null) dxfList.add(dxf); + } catch (XmlException e) { + // ignore + e.printStackTrace(); + } + } + } + for (CTTableStyleElement element : tableStyle.getTableStyleElementList()) { TableStyleType type = TableStyleType.valueOf(element.getType().toString()); DifferentialStyleProvider dstyle = null; if (element.isSetDxfId()) { int idx = (int) element.getDxfId(); CTDxf dxf; - if (idx >= 0 && idx < dxfs.getCount()) { - dxf = dxfs.getDxfArray(idx); - } else { - dxf = null; - } + dxf = dxfList.get(idx); int stripeSize = 0; if (element.isSetSize()) stripeSize = (int) element.getSize(); if (dxf != null) dstyle = new XSSFDxfStyleProvider(dxf, stripeSize, colorMap); diff --git a/src/ooxml/testcases/org/apache/poi/xssf/model/TestStylesTable.java b/src/ooxml/testcases/org/apache/poi/xssf/model/TestStylesTable.java index 9d29fc4538..652d40fbcb 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/model/TestStylesTable.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/model/TestStylesTable.java @@ -356,4 +356,14 @@ public final class TestStylesTable { wb.close(); } } + + @Test + public void testLoadWithAlternateContent() { + XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("style-alternate-content.xlsx"); + assertNotNull(workbook.getStylesSource()); + + StylesTable st = workbook.getStylesSource(); + + assertNotNull(XSSFTestDataSamples.writeOutAndReadBack(workbook)); + } } diff --git a/test-data/spreadsheet/style-alternate-content.xlsx b/test-data/spreadsheet/style-alternate-content.xlsx Binary files differnew file mode 100644 index 0000000000..9ae63becf2 --- /dev/null +++ b/test-data/spreadsheet/style-alternate-content.xlsx |