<classpathentry kind="lib" path="lib/ant-1.9.4.jar"/> | <classpathentry kind="lib" path="lib/ant-1.9.4.jar"/> | ||||
<classpathentry kind="lib" path="lib/ant-launcher-1.9.4.jar"/> | <classpathentry kind="lib" path="lib/ant-launcher-1.9.4.jar"/> | ||||
<classpathentry kind="lib" path="lib/log4j-1.2.17.jar"/> | <classpathentry kind="lib" path="lib/log4j-1.2.17.jar"/> | ||||
<classpathentry exported="true" kind="lib" path="ooxml-lib/xmlbeans-2.6.0.jar"/> | |||||
<classpathentry exported="true" kind="lib" path="ooxml-lib/xmlbeans-2.6.0.jar" sourcepath="ooxml-lib/xmlbeans-2.6.0.jar"/> | |||||
<classpathentry kind="lib" path="lib/hamcrest-core-1.3.jar"/> | <classpathentry kind="lib" path="lib/hamcrest-core-1.3.jar"/> | ||||
<classpathentry kind="lib" path="lib/junit-4.12.jar"/> | <classpathentry kind="lib" path="lib/junit-4.12.jar"/> | ||||
<classpathentry kind="lib" path="ooxml-lib/curvesapi-1.04.jar"/> | <classpathentry kind="lib" path="ooxml-lib/curvesapi-1.04.jar"/> |
/** | /** | ||||
* Represents a description of a conditional formatting rule | * Represents a description of a conditional formatting rule | ||||
*/ | */ | ||||
public interface ConditionalFormattingRule { | |||||
public interface ConditionalFormattingRule extends DifferentialStyleProvider { | |||||
/** | /** | ||||
* Create a new border formatting structure if it does not exist, | * Create a new border formatting structure if it does not exist, | ||||
* otherwise just return existing object. | * otherwise just return existing object. |
package org.apache.poi.ss.usermodel; | |||||
/** | |||||
* Interface for classes providing differential style definitions, such as conditional format rules | |||||
* and table/pivot table styles. | |||||
* | |||||
* @since 3.17 beta 1 | |||||
*/ | |||||
public interface DifferentialStyleProvider { | |||||
/** | |||||
* @return - border formatting object if defined, <code>null</code> otherwise | |||||
*/ | |||||
BorderFormatting getBorderFormatting(); | |||||
/** | |||||
* @return - font formatting object if defined, <code>null</code> otherwise | |||||
*/ | |||||
FontFormatting getFontFormatting(); | |||||
/** | |||||
* | |||||
* @return number format defined for this rule, or null if the cell default should be used | |||||
*/ | |||||
ExcelNumberFormat getNumberFormat(); | |||||
/** | |||||
* @return - pattern formatting object if defined, <code>null</code> otherwise | |||||
*/ | |||||
PatternFormatting getPatternFormatting(); | |||||
} |
*/ | */ | ||||
boolean isHasTotalsRow(); | boolean isHasTotalsRow(); | ||||
/** | |||||
* @return TableStyleInfo for this instance | |||||
* @since 3.17 beta 1 | |||||
*/ | |||||
TableStyleInfo getStyle(); | |||||
} | } |
package org.apache.poi.ss.usermodel; | |||||
/** | |||||
* Data table style definition. Includes style elements for various table components. | |||||
* Any number of style elements may be represented, and any cell may be styled by | |||||
* multiple elements. The order of elements in {@link TableStyleType} defines precedence. | |||||
* | |||||
* @since 3.17 beta 1 | |||||
*/ | |||||
public interface TableStyle { | |||||
/** | |||||
* @return name (may be a builtin name) | |||||
*/ | |||||
String getName(); | |||||
/** | |||||
* | |||||
* @param type | |||||
* @return style definition for the given type, or null if not defined in this style. | |||||
*/ | |||||
DifferentialStyleProvider getStyle(TableStyleType type); | |||||
} |
package org.apache.poi.ss.usermodel; | |||||
/** | |||||
* style information for a specific table instance, referencing the document style | |||||
* and indicating which optional portions of the style to apply. | |||||
* | |||||
* @since 3.17 beta 1 | |||||
*/ | |||||
public interface TableStyleInfo { | |||||
/** | |||||
* @return true if alternating column styles should be applied | |||||
*/ | |||||
boolean isShowColumnStripes(); | |||||
/** | |||||
* @return true if alternating row styles should be applied | |||||
*/ | |||||
boolean isShowRowStripes(); | |||||
/** | |||||
* @return true if the distinct first column style should be applied | |||||
*/ | |||||
boolean isShowFirstColumn(); | |||||
/** | |||||
* @return true if the distinct last column style should be applied | |||||
*/ | |||||
boolean isShowLastColumn(); | |||||
/** | |||||
* @return the name of the style (may reference a built-in style) | |||||
*/ | |||||
String getName(); | |||||
/** | |||||
* @return style definition | |||||
*/ | |||||
TableStyle getStyle(); | |||||
} |
package org.apache.poi.ss.usermodel; | |||||
/** | |||||
* Ordered list of table style elements, for both data tables and pivot tables. | |||||
* Some elements only apply to pivot tables, but any style definition can omit any number, | |||||
* so having them in one list should not be a problem. | |||||
* <p/> | |||||
* The order is the specification order of application, with later elements overriding previous | |||||
* ones, if style properties conflict. | |||||
* <p/> | |||||
* Processing could iterate bottom-up if looking for specific properties, and stop when the | |||||
* first style is found defining a value for that property. | |||||
* <p/> | |||||
* Enum names match the OOXML spec values exactly, so {@link #valueOf(String)} will work. | |||||
* | |||||
* @since 3.17 beta 1 | |||||
*/ | |||||
public enum TableStyleType { | |||||
wholeTable, | |||||
headerRow, | |||||
totalRow, | |||||
firstColumn, | |||||
lastColumn, | |||||
firstRowStripe, | |||||
secondRowStripe, | |||||
firstColumnStripe, | |||||
secondColumnStripe, | |||||
firstHeaderCell, | |||||
lastHeaderCell, | |||||
firstTotalCell, | |||||
lastTotalCell, | |||||
firstSubtotalColumn, | |||||
secondSubtotalColumn, | |||||
thirdSubtotalColumn, | |||||
firstSubtotalRow, | |||||
secondSubtotalRow, | |||||
thirdSubtotalRow, | |||||
blankRow, | |||||
firstColumnSubheading, | |||||
secondColumnSubheading, | |||||
thirdColumnSubheading, | |||||
firstRowSubheading, | |||||
secondRowSubheading, | |||||
thirdRowSubheading, | |||||
pageFieldLabels, | |||||
pageFieldValues, | |||||
; | |||||
} |
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.Arrays; | import java.util.Arrays; | ||||
import java.util.Collections; | import java.util.Collections; | ||||
import java.util.HashMap; | |||||
import java.util.List; | import java.util.List; | ||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.Map.Entry; | import java.util.Map.Entry; | ||||
import org.apache.poi.ss.usermodel.BuiltinFormats; | import org.apache.poi.ss.usermodel.BuiltinFormats; | ||||
import org.apache.poi.ss.usermodel.FontFamily; | import org.apache.poi.ss.usermodel.FontFamily; | ||||
import org.apache.poi.ss.usermodel.FontScheme; | import org.apache.poi.ss.usermodel.FontScheme; | ||||
import org.apache.poi.ss.usermodel.TableStyle; | |||||
import org.apache.poi.util.Internal; | import org.apache.poi.util.Internal; | ||||
import org.apache.poi.xssf.usermodel.XSSFBuiltinTableStyle; | |||||
import org.apache.poi.xssf.usermodel.XSSFCellStyle; | import org.apache.poi.xssf.usermodel.XSSFCellStyle; | ||||
import org.apache.poi.xssf.usermodel.XSSFFactory; | import org.apache.poi.xssf.usermodel.XSSFFactory; | ||||
import org.apache.poi.xssf.usermodel.XSSFFont; | import org.apache.poi.xssf.usermodel.XSSFFont; | ||||
import org.apache.poi.xssf.usermodel.XSSFRelation; | import org.apache.poi.xssf.usermodel.XSSFRelation; | ||||
import org.apache.poi.xssf.usermodel.XSSFTableStyle; | |||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook; | import org.apache.poi.xssf.usermodel.XSSFWorkbook; | ||||
import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder; | import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder; | ||||
import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill; | import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill; | ||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTNumFmt; | import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTNumFmt; | ||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTNumFmts; | import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTNumFmts; | ||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTStylesheet; | import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTStylesheet; | ||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableStyle; | |||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableStyles; | |||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTXf; | import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTXf; | ||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPatternType; | import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPatternType; | ||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.StyleSheetDocument; | import org.openxmlformats.schemas.spreadsheetml.x2006.main.StyleSheetDocument; | ||||
private final List<CTXf> xfs = new ArrayList<CTXf>(); | private final List<CTXf> xfs = new ArrayList<CTXf>(); | ||||
private final List<CTDxf> dxfs = new ArrayList<CTDxf>(); | private final List<CTDxf> dxfs = new ArrayList<CTDxf>(); | ||||
private final Map<String, TableStyle> tableStyles = new HashMap<String, TableStyle>(); | |||||
/** | /** | ||||
* The first style id available for use as a custom style | * The first style id available for use as a custom style | ||||
* @param is The input stream containing the XML document. | * @param is The input stream containing the XML document. | ||||
* @throws IOException if an error occurs while reading. | * @throws IOException if an error occurs while reading. | ||||
*/ | */ | ||||
protected void readFrom(InputStream is) throws IOException { | |||||
public void readFrom(InputStream is) throws IOException { | |||||
try { | try { | ||||
doc = StyleSheetDocument.Factory.parse(is, DEFAULT_XML_OPTIONS); | doc = StyleSheetDocument.Factory.parse(is, DEFAULT_XML_OPTIONS); | ||||
CTDxfs styleDxfs = styleSheet.getDxfs(); | CTDxfs styleDxfs = styleSheet.getDxfs(); | ||||
if(styleDxfs != null) dxfs.addAll(Arrays.asList(styleDxfs.getDxfArray())); | if(styleDxfs != null) dxfs.addAll(Arrays.asList(styleDxfs.getDxfArray())); | ||||
CTTableStyles ctTableStyles = styleSheet.getTableStyles(); | |||||
if (ctTableStyles != null) { | |||||
for (CTTableStyle style : Arrays.asList(ctTableStyles.getTableStyleArray())) { | |||||
tableStyles.put(style.getName(), new XSSFTableStyle(styleDxfs, style)); | |||||
} | |||||
} | |||||
} catch (XmlException e) { | } catch (XmlException e) { | ||||
throw new IOException(e.getLocalizedMessage()); | throw new IOException(e.getLocalizedMessage()); | ||||
} | } | ||||
this.dxfs.add(dxf); | this.dxfs.add(dxf); | ||||
return this.dxfs.size(); | return this.dxfs.size(); | ||||
} | } | ||||
/** | |||||
* NOTE: this only returns explicitly defined styles | |||||
* @param name of the table style | |||||
* @return defined style, or null if not explicitly defined | |||||
* | |||||
* @since 3.17 beta 1 | |||||
*/ | |||||
public TableStyle getExplicitTableStyle(String name) { | |||||
return tableStyles.get(name); | |||||
} | |||||
/** | |||||
* @param name of the table style | |||||
* @return defined style, either explicit or built-in, or null if not found | |||||
* | |||||
* @since 3.17 beta 1 | |||||
*/ | |||||
public TableStyle getTableStyle(String name) { | |||||
if (name == null) return null; | |||||
try { | |||||
return XSSFBuiltinTableStyle.valueOf(name).getStyle(); | |||||
} catch (IllegalArgumentException e) { | |||||
return getExplicitTableStyle(name); | |||||
} | |||||
} | |||||
/** | /** | ||||
* Create a cell style in this style table. | * Create a cell style in this style table. | ||||
* Note - End users probably want to call {@link XSSFWorkbook#createCellStyle()} | * Note - End users probably want to call {@link XSSFWorkbook#createCellStyle()} |
package org.apache.poi.xssf.usermodel; | |||||
import java.io.ByteArrayInputStream; | |||||
import java.io.InputStream; | |||||
import java.nio.charset.Charset; | |||||
import java.util.HashMap; | |||||
import java.util.Map; | |||||
import org.apache.poi.ss.usermodel.TableStyle; | |||||
import org.apache.poi.util.DocumentHelper; | |||||
import org.apache.poi.util.IOUtils; | |||||
import org.apache.poi.xssf.model.StylesTable; | |||||
import org.apache.xmlbeans.XmlOptions; | |||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDxfs; | |||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableStyle; | |||||
import org.w3c.dom.Document; | |||||
import org.w3c.dom.Element; | |||||
import org.w3c.dom.Node; | |||||
import org.w3c.dom.NodeList; | |||||
import org.w3c.dom.ls.DOMImplementationLS; | |||||
import org.w3c.dom.ls.LSSerializer; | |||||
/** | |||||
* Table style names defined in the OOXML spec. | |||||
* The actual styling is defined in presetTableStyles.xml | |||||
*/ | |||||
public enum XSSFBuiltinTableStyle { | |||||
/***/ | |||||
TableStyleDark1, | |||||
/***/ | |||||
TableStyleDark2, | |||||
/***/ | |||||
TableStyleDark3, | |||||
/***/ | |||||
TableStyleDark4, | |||||
/***/ | |||||
TableStyleDark5, | |||||
/***/ | |||||
TableStyleDark6, | |||||
/***/ | |||||
TableStyleDark7, | |||||
/***/ | |||||
TableStyleDark8, | |||||
/***/ | |||||
TableStyleDark9, | |||||
/***/ | |||||
TableStyleDark10, | |||||
/***/ | |||||
TableStyleDark11, | |||||
/***/ | |||||
TableStyleLight1, | |||||
/***/ | |||||
TableStyleLight2, | |||||
/***/ | |||||
TableStyleLight3, | |||||
/***/ | |||||
TableStyleLight4, | |||||
/***/ | |||||
TableStyleLight5, | |||||
/***/ | |||||
TableStyleLight6, | |||||
/***/ | |||||
TableStyleLight7, | |||||
/***/ | |||||
TableStyleLight8, | |||||
/***/ | |||||
TableStyleLight9, | |||||
/***/ | |||||
TableStyleLight10, | |||||
/***/ | |||||
TableStyleLight11, | |||||
/***/ | |||||
TableStyleLight12, | |||||
/***/ | |||||
TableStyleLight13, | |||||
/***/ | |||||
TableStyleLight14, | |||||
/***/ | |||||
TableStyleLight15, | |||||
/***/ | |||||
TableStyleLight16, | |||||
/***/ | |||||
TableStyleLight17, | |||||
/***/ | |||||
TableStyleLight18, | |||||
/***/ | |||||
TableStyleLight19, | |||||
/***/ | |||||
TableStyleLight20, | |||||
/***/ | |||||
TableStyleLight21, | |||||
/***/ | |||||
TableStyleMedium1, | |||||
/***/ | |||||
TableStyleMedium2, | |||||
/***/ | |||||
TableStyleMedium3, | |||||
/***/ | |||||
TableStyleMedium4, | |||||
/***/ | |||||
TableStyleMedium5, | |||||
/***/ | |||||
TableStyleMedium6, | |||||
/***/ | |||||
TableStyleMedium7, | |||||
/***/ | |||||
TableStyleMedium8, | |||||
/***/ | |||||
TableStyleMedium9, | |||||
/***/ | |||||
TableStyleMedium10, | |||||
/***/ | |||||
TableStyleMedium11, | |||||
/***/ | |||||
TableStyleMedium12, | |||||
/***/ | |||||
TableStyleMedium13, | |||||
/***/ | |||||
TableStyleMedium14, | |||||
/***/ | |||||
TableStyleMedium15, | |||||
/***/ | |||||
TableStyleMedium16, | |||||
/***/ | |||||
TableStyleMedium17, | |||||
/***/ | |||||
TableStyleMedium18, | |||||
/***/ | |||||
TableStyleMedium19, | |||||
/***/ | |||||
TableStyleMedium20, | |||||
/***/ | |||||
TableStyleMedium21, | |||||
/***/ | |||||
TableStyleMedium22, | |||||
/***/ | |||||
TableStyleMedium23, | |||||
/***/ | |||||
TableStyleMedium24, | |||||
/***/ | |||||
TableStyleMedium25, | |||||
/***/ | |||||
TableStyleMedium26, | |||||
/***/ | |||||
TableStyleMedium27, | |||||
/***/ | |||||
TableStyleMedium28, | |||||
/***/ | |||||
PivotStyleMedium1, | |||||
/***/ | |||||
PivotStyleMedium2, | |||||
/***/ | |||||
PivotStyleMedium3, | |||||
/***/ | |||||
PivotStyleMedium4, | |||||
/***/ | |||||
PivotStyleMedium5, | |||||
/***/ | |||||
PivotStyleMedium6, | |||||
/***/ | |||||
PivotStyleMedium7, | |||||
/***/ | |||||
PivotStyleMedium8, | |||||
/***/ | |||||
PivotStyleMedium9, | |||||
/***/ | |||||
PivotStyleMedium10, | |||||
/***/ | |||||
PivotStyleMedium11, | |||||
/***/ | |||||
PivotStyleMedium12, | |||||
/***/ | |||||
PivotStyleMedium13, | |||||
/***/ | |||||
PivotStyleMedium14, | |||||
/***/ | |||||
PivotStyleMedium15, | |||||
/***/ | |||||
PivotStyleMedium16, | |||||
/***/ | |||||
PivotStyleMedium17, | |||||
/***/ | |||||
PivotStyleMedium18, | |||||
/***/ | |||||
PivotStyleMedium19, | |||||
/***/ | |||||
PivotStyleMedium20, | |||||
/***/ | |||||
PivotStyleMedium21, | |||||
/***/ | |||||
PivotStyleMedium22, | |||||
/***/ | |||||
PivotStyleMedium23, | |||||
/***/ | |||||
PivotStyleMedium24, | |||||
/***/ | |||||
PivotStyleMedium25, | |||||
/***/ | |||||
PivotStyleMedium26, | |||||
/***/ | |||||
PivotStyleMedium27, | |||||
/***/ | |||||
PivotStyleMedium28, | |||||
/***/ | |||||
PivotStyleLight1, | |||||
/***/ | |||||
PivotStyleLight2, | |||||
/***/ | |||||
PivotStyleLight3, | |||||
/***/ | |||||
PivotStyleLight4, | |||||
/***/ | |||||
PivotStyleLight5, | |||||
/***/ | |||||
PivotStyleLight6, | |||||
/***/ | |||||
PivotStyleLight7, | |||||
/***/ | |||||
PivotStyleLight8, | |||||
/***/ | |||||
PivotStyleLight9, | |||||
/***/ | |||||
PivotStyleLight10, | |||||
/***/ | |||||
PivotStyleLight11, | |||||
/***/ | |||||
PivotStyleLight12, | |||||
/***/ | |||||
PivotStyleLight13, | |||||
/***/ | |||||
PivotStyleLight14, | |||||
/***/ | |||||
PivotStyleLight15, | |||||
/***/ | |||||
PivotStyleLight16, | |||||
/***/ | |||||
PivotStyleLight17, | |||||
/***/ | |||||
PivotStyleLight18, | |||||
/***/ | |||||
PivotStyleLight19, | |||||
/***/ | |||||
PivotStyleLight20, | |||||
/***/ | |||||
PivotStyleLight21, | |||||
/***/ | |||||
PivotStyleLight22, | |||||
/***/ | |||||
PivotStyleLight23, | |||||
/***/ | |||||
PivotStyleLight24, | |||||
/***/ | |||||
PivotStyleLight25, | |||||
/***/ | |||||
PivotStyleLight26, | |||||
/***/ | |||||
PivotStyleLight27, | |||||
/***/ | |||||
PivotStyleLight28, | |||||
/***/ | |||||
PivotStyleDark1, | |||||
/***/ | |||||
PivotStyleDark2, | |||||
/***/ | |||||
PivotStyleDark3, | |||||
/***/ | |||||
PivotStyleDark4, | |||||
/***/ | |||||
PivotStyleDark5, | |||||
/***/ | |||||
PivotStyleDark6, | |||||
/***/ | |||||
PivotStyleDark7, | |||||
/***/ | |||||
PivotStyleDark8, | |||||
/***/ | |||||
PivotStyleDark9, | |||||
/***/ | |||||
PivotStyleDark10, | |||||
/***/ | |||||
PivotStyleDark11, | |||||
/***/ | |||||
PivotStyleDark12, | |||||
/***/ | |||||
PivotStyleDark13, | |||||
/***/ | |||||
PivotStyleDark14, | |||||
/***/ | |||||
PivotStyleDark15, | |||||
/***/ | |||||
PivotStyleDark16, | |||||
/***/ | |||||
PivotStyleDark17, | |||||
/***/ | |||||
PivotStyleDark18, | |||||
/***/ | |||||
PivotStyleDark19, | |||||
/***/ | |||||
PivotStyleDark20, | |||||
/***/ | |||||
PivotStyleDark21, | |||||
/***/ | |||||
PivotStyleDark22, | |||||
/***/ | |||||
PivotStyleDark23, | |||||
/***/ | |||||
PivotStyleDark24, | |||||
/***/ | |||||
PivotStyleDark25, | |||||
/***/ | |||||
PivotStyleDark26, | |||||
/***/ | |||||
PivotStyleDark27, | |||||
/***/ | |||||
PivotStyleDark28, | |||||
; | |||||
private static final Map<XSSFBuiltinTableStyle, TableStyle> styleMap = new HashMap<XSSFBuiltinTableStyle, TableStyle>(60); | |||||
private XSSFBuiltinTableStyle() { | |||||
} | |||||
/** | |||||
* @return built-in {@link TableStyle} definition | |||||
*/ | |||||
public TableStyle getStyle() { | |||||
init(); | |||||
return styleMap.get(this); | |||||
} | |||||
/** | |||||
* NOTE: only checks by name, not definition. | |||||
* @param style | |||||
* @return true if the style represents a built-in style, false if it is null or a custom style | |||||
*/ | |||||
public static boolean isBuiltinStyle(TableStyle style) { | |||||
if (style == null) return false; | |||||
try { | |||||
XSSFBuiltinTableStyle.valueOf(style.getName()); | |||||
return true; | |||||
} catch (IllegalArgumentException e) { | |||||
return false; | |||||
} | |||||
} | |||||
/** | |||||
* Only init once - thus the synchronized. Lazy, after creating instances, | |||||
* and only when a style is actually needed, to avoid overhead for uses | |||||
* that don't need the actual style definitions. | |||||
* <p/> | |||||
* Public so clients can initialize the map on startup rather than lazily | |||||
* during evaluation if desired. | |||||
*/ | |||||
public static final synchronized void init() { | |||||
if (! styleMap.isEmpty()) return; | |||||
/* | |||||
* initialize map. Every built-in has this format: | |||||
* <styleName> | |||||
* <dxfs> | |||||
* <dxf>...</dxf> | |||||
* ... | |||||
* </dxfs> | |||||
* <tableStyles count="1"> | |||||
* <tableStyle>...</tableStyle> | |||||
* </tableStyles> | |||||
* </styleName> | |||||
*/ | |||||
try { | |||||
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(); | |||||
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")))); | |||||
styleMap.put(XSSFBuiltinTableStyle.valueOf(styleName), styles.getExplicitTableStyle(styleName)); | |||||
} | |||||
} finally { | |||||
IOUtils.closeQuietly(is); | |||||
} | |||||
} catch (Exception e) { | |||||
throw new RuntimeException(e); | |||||
} | |||||
} | |||||
private static String styleXML(Node dxfsNode, Node tableStyleNode) { | |||||
DOMImplementationLS lsImpl = (DOMImplementationLS)dxfsNode.getOwnerDocument().getImplementation().getFeature("LS", "3.0"); | |||||
LSSerializer lsSerializer = lsImpl.createLSSerializer(); | |||||
lsSerializer.getDomConfig().setParameter("xml-declaration", false); | |||||
StringBuilder sb = new StringBuilder(); | |||||
sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n") | |||||
.append("<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" " | |||||
+ "xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" " | |||||
+ "xmlns:x14ac=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac\" " | |||||
+ "xmlns:x16r2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/02/main\" " | |||||
+ "mc:Ignorable=\"x14ac x16r2\">\n"); | |||||
sb.append(lsSerializer.writeToString(dxfsNode)); | |||||
sb.append(lsSerializer.writeToString(tableStyleNode)); | |||||
sb.append("</styleSheet>"); | |||||
return sb.toString(); | |||||
} | |||||
} |
package org.apache.poi.xssf.usermodel; | |||||
import org.apache.poi.ss.usermodel.BorderFormatting; | |||||
import org.apache.poi.ss.usermodel.DifferentialStyleProvider; | |||||
import org.apache.poi.ss.usermodel.ExcelNumberFormat; | |||||
import org.apache.poi.ss.usermodel.FontFormatting; | |||||
import org.apache.poi.ss.usermodel.PatternFormatting; | |||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDxf; | |||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTNumFmt; | |||||
/** | |||||
* Style based on a dxf record - e.g. table style element or conditional formatting rule | |||||
*/ | |||||
public class XSSFDxfStyleProvider implements DifferentialStyleProvider { | |||||
private final BorderFormatting border; | |||||
private final FontFormatting font; | |||||
private final ExcelNumberFormat number; | |||||
private final PatternFormatting fill; | |||||
/** | |||||
* @param dxf | |||||
*/ | |||||
public XSSFDxfStyleProvider(CTDxf dxf) { | |||||
if (dxf == null) { | |||||
border = null; | |||||
font = null; | |||||
number = null; | |||||
fill = null; | |||||
} else { | |||||
border = dxf.isSetBorder() ? new XSSFBorderFormatting(dxf.getBorder()) : null; | |||||
font = dxf.isSetFont() ? new XSSFFontFormatting(dxf.getFont()) : null; | |||||
if (dxf.isSetNumFmt()) { | |||||
CTNumFmt numFmt = dxf.getNumFmt(); | |||||
number = new ExcelNumberFormat((int) numFmt.getNumFmtId(), numFmt.getFormatCode()); | |||||
} else { | |||||
number = null; | |||||
} | |||||
fill = dxf.isSetFill() ? new XSSFPatternFormatting(dxf.getFill()) : null; | |||||
} | |||||
} | |||||
public BorderFormatting getBorderFormatting() { | |||||
return border; | |||||
} | |||||
public FontFormatting getFontFormatting() { | |||||
return font; | |||||
} | |||||
public ExcelNumberFormat getNumberFormat() { | |||||
return number; | |||||
} | |||||
public PatternFormatting getPatternFormatting() { | |||||
return fill; | |||||
} | |||||
} |
import org.apache.poi.POIXMLDocumentPart; | import org.apache.poi.POIXMLDocumentPart; | ||||
import org.apache.poi.openxml4j.opc.PackagePart; | import org.apache.poi.openxml4j.opc.PackagePart; | ||||
import org.apache.poi.ss.usermodel.Table; | import org.apache.poi.ss.usermodel.Table; | ||||
import org.apache.poi.ss.usermodel.TableStyleInfo; | |||||
import org.apache.poi.ss.util.CellReference; | import org.apache.poi.ss.util.CellReference; | ||||
import org.apache.poi.util.Internal; | import org.apache.poi.util.Internal; | ||||
import org.apache.poi.util.StringUtil; | import org.apache.poi.util.StringUtil; | ||||
public int getEndRowIndex() { | public int getEndRowIndex() { | ||||
return getEndCellReference().getRow(); | return getEndCellReference().getRow(); | ||||
} | } | ||||
/** | |||||
* | |||||
* @since 3.17 beta 1 | |||||
*/ | |||||
public TableStyleInfo getStyle() { | |||||
if (! ctTable.isSetTableStyleInfo()) return null; | |||||
return new XSSFTableStyleInfo(((XSSFSheet) getParent()).getWorkbook().getStylesSource(), ctTable.getTableStyleInfo()); | |||||
} | |||||
} | } |
package org.apache.poi.xssf.usermodel; | |||||
import java.util.EnumMap; | |||||
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.openxmlformats.schemas.spreadsheetml.x2006.main.CTDxf; | |||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDxfs; | |||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableStyle; | |||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableStyleElement; | |||||
/** | |||||
* {@link TableStyle} implementation for styles defined in the OOXML styles.xml. | |||||
* Also used for built-in styles via dummy XML generated from presetTableStyles.xml. | |||||
*/ | |||||
public class XSSFTableStyle implements TableStyle { | |||||
private final String name; | |||||
private final Map<TableStyleType, DifferentialStyleProvider> elementMap = new EnumMap<TableStyleType, DifferentialStyleProvider>(TableStyleType.class); | |||||
/** | |||||
* @param dxfs | |||||
* @param tableStyle | |||||
*/ | |||||
public XSSFTableStyle(CTDxfs dxfs, CTTableStyle tableStyle) { | |||||
this.name = tableStyle.getName(); | |||||
for (CTTableStyleElement element : tableStyle.getTableStyleElementList()) { | |||||
TableStyleType type = TableStyleType.valueOf(element.getType().toString()); | |||||
DifferentialStyleProvider dstyle = null; | |||||
if (element.isSetDxfId()) { | |||||
int idx = (int) element.getDxfId() -1; | |||||
CTDxf dxf; | |||||
if (idx >= 0 && idx < dxfs.getCount()) { | |||||
dxf = dxfs.getDxfArray(idx); | |||||
} else { | |||||
dxf = null; | |||||
} | |||||
if (dxf != null) dstyle = new XSSFDxfStyleProvider(dxf); | |||||
} | |||||
elementMap.put(type, dstyle); | |||||
} | |||||
} | |||||
public String getName() { | |||||
return name; | |||||
} | |||||
public DifferentialStyleProvider getStyle(TableStyleType type) { | |||||
return elementMap.get(type); | |||||
} | |||||
} |
package org.apache.poi.xssf.usermodel; | |||||
import org.apache.poi.ss.usermodel.TableStyle; | |||||
import org.apache.poi.ss.usermodel.TableStyleInfo; | |||||
import org.apache.poi.xssf.model.StylesTable; | |||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableStyleInfo; | |||||
/** | |||||
* Wrapper for the CT class, to cache values and add style lookup | |||||
*/ | |||||
public class XSSFTableStyleInfo implements TableStyleInfo { | |||||
private final boolean columnStripes; | |||||
private final boolean rowStripes; | |||||
private final boolean firstColumn; | |||||
private final boolean lastColumn; | |||||
private final TableStyle style; | |||||
/** | |||||
* @param stylesTable | |||||
* @param tableStyleInfo | |||||
*/ | |||||
public XSSFTableStyleInfo(StylesTable stylesTable, CTTableStyleInfo tableStyleInfo) { | |||||
this.columnStripes = tableStyleInfo.getShowColumnStripes(); | |||||
this.rowStripes = tableStyleInfo.getShowRowStripes(); | |||||
this.firstColumn = tableStyleInfo.getShowFirstColumn(); | |||||
this.lastColumn = tableStyleInfo.getShowLastColumn(); | |||||
this.style = stylesTable.getTableStyle(tableStyleInfo.getName()); | |||||
} | |||||
public boolean isShowColumnStripes() { | |||||
return columnStripes; | |||||
} | |||||
public boolean isShowRowStripes() { | |||||
return rowStripes; | |||||
} | |||||
public boolean isShowFirstColumn() { | |||||
return firstColumn; | |||||
} | |||||
public boolean isShowLastColumn() { | |||||
return lastColumn; | |||||
} | |||||
public String getName() { | |||||
return style.getName(); | |||||
} | |||||
public TableStyle getStyle() { | |||||
return style; | |||||
} | |||||
} |
package org.apache.poi.xssf.usermodel; | |||||
import static org.junit.Assert.assertEquals; | |||||
import static org.junit.Assert.assertNotNull; | |||||
import static org.junit.Assert.assertNull; | |||||
import static org.junit.Assert.assertTrue; | |||||
import org.apache.poi.ss.usermodel.DifferentialStyleProvider; | |||||
import org.apache.poi.ss.usermodel.FontFormatting; | |||||
import org.apache.poi.ss.usermodel.PatternFormatting; | |||||
import org.apache.poi.ss.usermodel.Table; | |||||
import org.apache.poi.ss.usermodel.TableStyle; | |||||
import org.apache.poi.ss.usermodel.TableStyleInfo; | |||||
import org.apache.poi.ss.usermodel.TableStyleType; | |||||
import org.apache.poi.xssf.XSSFTestDataSamples; | |||||
import org.junit.Test; | |||||
/** | |||||
* Test built-in table styles | |||||
*/ | |||||
public class TestTableStyles { | |||||
/** | |||||
* Test that a built-in style is initialized properly | |||||
*/ | |||||
@Test | |||||
public void testBuiltinStyleInit() { | |||||
TableStyle style = XSSFBuiltinTableStyle.TableStyleMedium2.getStyle(); | |||||
assertNotNull("no style found for Medium2", style); | |||||
assertNull("Should not have style info for blankRow", style.getStyle(TableStyleType.blankRow)); | |||||
DifferentialStyleProvider headerRow = style.getStyle(TableStyleType.headerRow); | |||||
assertNotNull("no header row style", headerRow); | |||||
FontFormatting font = headerRow.getFontFormatting(); | |||||
assertNotNull("No header row font formatting", font); | |||||
assertTrue("header row not bold", font.isBold()); | |||||
PatternFormatting fill = headerRow.getPatternFormatting(); | |||||
assertNotNull("No header fill", fill); | |||||
assertEquals("wrong header fill", 4, ((XSSFColor) fill.getFillBackgroundColorColor()).getTheme()); | |||||
} | |||||
@Test | |||||
public void testCustomStyle() throws Exception { | |||||
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("tableStyle.xlsx"); | |||||
Table table = wb.getTable("Table1"); | |||||
assertNotNull("missing table", table); | |||||
TableStyleInfo style = table.getStyle(); | |||||
assertNotNull("Missing table style info", style); | |||||
assertNotNull("Missing table style", style.getStyle()); | |||||
assertEquals("Wrong name", "TestTableStyle", style.getName()); | |||||
assertEquals("Wrong name", "TestTableStyle", style.getStyle().getName()); | |||||
DifferentialStyleProvider firstColumn = style.getStyle().getStyle(TableStyleType.firstColumn); | |||||
assertNotNull("no first column style", firstColumn); | |||||
FontFormatting font = firstColumn.getFontFormatting(); | |||||
assertNotNull("no first col font", font); | |||||
assertTrue("wrong first col bold", font.isBold()); | |||||
wb.close(); | |||||
} | |||||
} |