From f0a360a7bcc8acc624d6b218161b786dd6f58e37 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Wed, 22 Jul 2015 00:04:59 +0000 Subject: Allow creating of an empty Themes Table on request git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1692211 13f79535-47bb-0310-9956-ffa450edef68 --- .settings/org.eclipse.jdt.ui.prefs | 2 +- .../org/apache/poi/xssf/model/StylesTable.java | 26 +++++++++++++++++- .../org/apache/poi/xssf/model/ThemesTable.java | 31 ++++++++++++++++++++++ .../apache/poi/xssf/usermodel/XSSFWorkbook.java | 8 +++--- .../org/apache/poi/xssf/model/TestThemesTable.java | 22 +++++++++++++++ 5 files changed, 84 insertions(+), 5 deletions(-) diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs index 4ad8c933ca..5227bd2854 100644 --- a/.settings/org.eclipse.jdt.ui.prefs +++ b/.settings/org.eclipse.jdt.ui.prefs @@ -67,7 +67,7 @@ org.eclipse.jdt.ui.ignorelowercasenames=true org.eclipse.jdt.ui.importorder=java;javax;org;com; org.eclipse.jdt.ui.javadoc=false org.eclipse.jdt.ui.keywordthis=false -org.eclipse.jdt.ui.ondemandthreshold=10 +org.eclipse.jdt.ui.ondemandthreshold=20 org.eclipse.jdt.ui.overrideannotation=false org.eclipse.jdt.ui.staticondemandthreshold=10 org.eclipse.jdt.ui.text.custom_code_templates= diff --git a/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java b/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java index 3937e3eeab..c891509274 100644 --- a/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java +++ b/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java @@ -35,7 +35,10 @@ import org.apache.poi.ss.usermodel.BuiltinFormats; import org.apache.poi.ss.usermodel.FontFamily; import org.apache.poi.ss.usermodel.FontScheme; import org.apache.poi.xssf.usermodel.XSSFCellStyle; +import org.apache.poi.xssf.usermodel.XSSFFactory; import org.apache.poi.xssf.usermodel.XSSFFont; +import org.apache.poi.xssf.usermodel.XSSFRelation; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder; import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill; import org.apache.xmlbeans.XmlException; @@ -57,7 +60,6 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTXf; import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPatternType; import org.openxmlformats.schemas.spreadsheetml.x2006.main.StyleSheetDocument; - /** * Table of styles shared across all sheets in a workbook. */ @@ -79,6 +81,7 @@ public class StylesTable extends POIXMLDocumentPart { private static final int MAXIMUM_STYLE_ID = SpreadsheetVersion.EXCEL2007.getMaxCellStyles(); private StyleSheetDocument doc; + private XSSFWorkbook workbook; private ThemesTable theme; /** @@ -96,7 +99,17 @@ public class StylesTable extends POIXMLDocumentPart { super(part, rel); readFrom(part.getInputStream()); } + + public void setWorkbook(XSSFWorkbook wb) { + this.workbook = wb; + } + /** + * Get the current Workbook's theme table, or null if the + * Workbook lacks any themes. + *

Use {@link #ensureThemesTable()} to have a themes table + * created if needed + */ public ThemesTable getTheme() { return theme; } @@ -113,6 +126,17 @@ public class StylesTable extends POIXMLDocumentPart { border.setThemesTable(theme); } } + + /** + * If there isn't currently a {@link ThemesTable} for the + * current Workbook, then creates one and sets it up. + * After this, calls to {@link #getTheme()} won't give null + */ + public void ensureThemesTable() { + if (theme != null) return; + + theme = (ThemesTable)workbook.createRelationship(XSSFRelation.THEME, XSSFFactory.getInstance()); + } /** * Read this shared styles table from an XML file. diff --git a/src/ooxml/java/org/apache/poi/xssf/model/ThemesTable.java b/src/ooxml/java/org/apache/poi/xssf/model/ThemesTable.java index bf58989ccb..c710e3576f 100644 --- a/src/ooxml/java/org/apache/poi/xssf/model/ThemesTable.java +++ b/src/ooxml/java/org/apache/poi/xssf/model/ThemesTable.java @@ -17,12 +17,14 @@ package org.apache.poi.xssf.model; import java.io.IOException; +import java.io.OutputStream; import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; import org.apache.poi.xssf.usermodel.XSSFColor; import org.apache.xmlbeans.XmlException; +import org.apache.xmlbeans.XmlOptions; import org.openxmlformats.schemas.drawingml.x2006.main.CTColor; import org.openxmlformats.schemas.drawingml.x2006.main.CTColorScheme; import org.openxmlformats.schemas.drawingml.x2006.main.ThemeDocument; @@ -34,6 +36,15 @@ import org.openxmlformats.schemas.drawingml.x2006.main.ThemeDocument; public class ThemesTable extends POIXMLDocumentPart { private ThemeDocument theme; + /** + * Create a new, empty ThemesTable + */ + public ThemesTable() { + super(); + theme = ThemeDocument.Factory.newInstance(); + theme.addNewTheme().addNewThemeElements(); + } + /** * Construct a ThemesTable. * @param part A PackagePart. @@ -120,4 +131,24 @@ public class ThemesTable extends POIXMLDocumentPart { // All done } + + /** + * Write this table out as XML. + * + * @param out The stream to write to. + * @throws IOException if an error occurs while writing. + */ + public void writeTo(OutputStream out) throws IOException { + XmlOptions options = new XmlOptions(DEFAULT_XML_OPTIONS); + + theme.save(out, options); + } + + @Override + protected void commit() throws IOException { + PackagePart part = getPackagePart(); + OutputStream out = part.getOutputStream(); + writeTo(out); + out.close(); + } } diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java index f90b48dfa1..0d62135d6e 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java @@ -153,8 +153,6 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable shIdMap = new HashMap(); Map elIdMap = new HashMap(); for(POIXMLDocumentPart p : getRelations()){ @@ -362,6 +361,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable(); sheets = new ArrayList(); @@ -1578,7 +1579,8 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable