]> source.dussan.org Git - poi.git/commitdiff
Add file that failed regression tests as a unit test.
authorGreg Woolsey <gwoolsey@apache.org>
Sat, 24 Jun 2017 05:55:45 +0000 (05:55 +0000)
committerGreg Woolsey <gwoolsey@apache.org>
Sat, 24 Jun 2017 05:55:45 +0000 (05:55 +0000)
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

src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFBuiltinTableStyle.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFTableStyle.java
src/ooxml/testcases/org/apache/poi/xssf/model/TestStylesTable.java
test-data/spreadsheet/style-alternate-content.xlsx [new file with mode: 0644]

index aab86abca1c6c7b66d5d60531dbf8f58b03706b4..828ceeeec4be6093913b9f7f55b6d33dcde99bfd 100644 (file)
@@ -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 {
index 0b7be4963ffff1cb3dec66c73cbb19688883b631..8c6306d219c550d96afc4f9f7b99da719c36359d 100644 (file)
 
 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);
index 9d29fc453849dc992170117b9f360574721dab19..652d40fbcb32011eb8d594ee2634846580e5477b 100644 (file)
@@ -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
new file mode 100644 (file)
index 0000000..9ae63be
Binary files /dev/null and b/test-data/spreadsheet/style-alternate-content.xlsx differ