Parcourir la source

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
tags/REL_3_13_FINAL
Nick Burch il y a 9 ans
Parent
révision
f0a360a7bc

+ 1
- 1
.settings/org.eclipse.jdt.ui.prefs
Fichier diff supprimé car celui-ci est trop grand
Voir le fichier


+ 25
- 1
src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java Voir le fichier

@@ -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.
* <p>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.

+ 31
- 0
src/ooxml/java/org/apache/poi/xssf/model/ThemesTable.java Voir le fichier

@@ -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();
}
}

+ 5
- 3
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java Voir le fichier

@@ -153,8 +153,6 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
*/
private StylesTable stylesSource;

private ThemesTable theme;

/**
* The locator of user-defined functions.
* By default includes functions from the Excel Analysis Toolpack
@@ -337,6 +335,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
WorkbookDocument doc = WorkbookDocument.Factory.parse(getPackagePart().getInputStream());
this.workbook = doc.getWorkbook();

ThemesTable theme = null;
Map<String, XSSFSheet> shIdMap = new HashMap<String, XSSFSheet>();
Map<String, ExternalLinksTable> elIdMap = new HashMap<String, ExternalLinksTable>();
for(POIXMLDocumentPart p : getRelations()){
@@ -362,6 +361,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
stylesSource = (StylesTable)createRelationship(XSSFRelation.STYLES, XSSFFactory.getInstance());
}
}
stylesSource.setWorkbook(this);
stylesSource.setTheme(theme);

if (sharedStringSource == null) {
@@ -428,6 +428,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X

sharedStringSource = (SharedStringsTable)createRelationship(XSSFRelation.SHARED_STRINGS, XSSFFactory.getInstance());
stylesSource = (StylesTable)createRelationship(XSSFRelation.STYLES, XSSFFactory.getInstance());
stylesSource.setWorkbook(this);

namedRanges = new ArrayList<XSSFName>();
sheets = new ArrayList<XSSFSheet>();
@@ -1578,7 +1579,8 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
* Returns the Theme of current workbook.
*/
public ThemesTable getTheme() {
return theme;
if (stylesSource == null) return null;
return stylesSource.getTheme();
}

/**

+ 22
- 0
src/ooxml/testcases/org/apache/poi/xssf/model/TestThemesTable.java Voir le fichier

@@ -18,6 +18,7 @@
package org.apache.poi.xssf.model;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.io.FileOutputStream;
@@ -29,6 +30,7 @@ import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;
@@ -75,4 +77,24 @@ public class TestThemesTable {
fos.close();
}
}
@Test
public void testAddNew() throws Exception {
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet s = wb.createSheet();
assertEquals(null, wb.getTheme());
StylesTable styles = wb.getStylesSource();
assertEquals(null, styles.getTheme());
styles.ensureThemesTable();
assertNotNull(styles.getTheme());
assertNotNull(wb.getTheme());
wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
styles = wb.getStylesSource();
assertNotNull(styles.getTheme());
assertNotNull(wb.getTheme());
}
}

Chargement…
Annuler
Enregistrer