mirror of https://github.com/apache/poi.git
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
This commit is contained in:
parent
07cb031c2e
commit
3e6d942b95
|
@ -388,20 +388,22 @@ public enum XSSFBuiltinTableStyle {
|
||||||
final InputStream is = XSSFBuiltinTableStyle.class.getResourceAsStream("presetTableStyles.xml");
|
final InputStream is = XSSFBuiltinTableStyle.class.getResourceAsStream("presetTableStyles.xml");
|
||||||
try {
|
try {
|
||||||
final Document doc = DocumentHelper.readDocument(is);
|
final Document doc = DocumentHelper.readDocument(is);
|
||||||
|
|
||||||
final NodeList styleNodes = doc.getDocumentElement().getChildNodes();
|
final NodeList styleNodes = doc.getDocumentElement().getChildNodes();
|
||||||
for (int i=0; i < styleNodes.getLength(); i++) {
|
for (int i=0; i < styleNodes.getLength(); i++) {
|
||||||
final Node node = styleNodes.item(i);
|
final Node node = styleNodes.item(i);
|
||||||
if (node.getNodeType() != Node.ELEMENT_NODE) continue; // only care about elements
|
if (node.getNodeType() != Node.ELEMENT_NODE) continue; // only care about elements
|
||||||
final Element tag = (Element) node;
|
final Element tag = (Element) node;
|
||||||
String styleName = tag.getTagName();
|
String styleName = tag.getTagName();
|
||||||
|
XSSFBuiltinTableStyle builtIn = XSSFBuiltinTableStyle.valueOf(styleName);
|
||||||
|
|
||||||
Node dxfsNode = tag.getElementsByTagName("dxfs").item(0);
|
Node dxfsNode = tag.getElementsByTagName("dxfs").item(0);
|
||||||
Node tableStyleNode = tag.getElementsByTagName("tableStyles").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
|
// 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
|
// - build a fake styles.xml file with just this built-in
|
||||||
StylesTable styles = new StylesTable();
|
StylesTable styles = new StylesTable();
|
||||||
styles.readFrom(new ByteArrayInputStream(styleXML(dxfsNode, tableStyleNode).getBytes(Charset.forName("UTF-8"))));
|
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)));
|
styleMap.put(builtIn, new XSSFBuiltinTypeStyleStyle(builtIn, styles.getExplicitTableStyle(styleName)));
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
|
|
|
@ -17,12 +17,18 @@
|
||||||
|
|
||||||
package org.apache.poi.xssf.usermodel;
|
package org.apache.poi.xssf.usermodel;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.EnumMap;
|
import java.util.EnumMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.DifferentialStyleProvider;
|
import org.apache.poi.ss.usermodel.DifferentialStyleProvider;
|
||||||
import org.apache.poi.ss.usermodel.TableStyle;
|
import org.apache.poi.ss.usermodel.TableStyle;
|
||||||
import org.apache.poi.ss.usermodel.TableStyleType;
|
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.CTDxf;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDxfs;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDxfs;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableStyle;
|
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) {
|
public XSSFTableStyle(int index, CTDxfs dxfs, CTTableStyle tableStyle, IndexedColorMap colorMap) {
|
||||||
this.name = tableStyle.getName();
|
this.name = tableStyle.getName();
|
||||||
this.index = index;
|
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()) {
|
for (CTTableStyleElement element : tableStyle.getTableStyleElementList()) {
|
||||||
TableStyleType type = TableStyleType.valueOf(element.getType().toString());
|
TableStyleType type = TableStyleType.valueOf(element.getType().toString());
|
||||||
DifferentialStyleProvider dstyle = null;
|
DifferentialStyleProvider dstyle = null;
|
||||||
if (element.isSetDxfId()) {
|
if (element.isSetDxfId()) {
|
||||||
int idx = (int) element.getDxfId();
|
int idx = (int) element.getDxfId();
|
||||||
CTDxf dxf;
|
CTDxf dxf;
|
||||||
if (idx >= 0 && idx < dxfs.getCount()) {
|
dxf = dxfList.get(idx);
|
||||||
dxf = dxfs.getDxfArray(idx);
|
|
||||||
} else {
|
|
||||||
dxf = null;
|
|
||||||
}
|
|
||||||
int stripeSize = 0;
|
int stripeSize = 0;
|
||||||
if (element.isSetSize()) stripeSize = (int) element.getSize();
|
if (element.isSetSize()) stripeSize = (int) element.getSize();
|
||||||
if (dxf != null) dstyle = new XSSFDxfStyleProvider(dxf, stripeSize, colorMap);
|
if (dxf != null) dstyle = new XSSFDxfStyleProvider(dxf, stripeSize, colorMap);
|
||||||
|
|
|
@ -356,4 +356,14 @@ public final class TestStylesTable {
|
||||||
wb.close();
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue