Start supporting styles on the XSSFWorkbook, and tests for it
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@637669 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
944da771ba
commit
7cec45a438
@ -0,0 +1,22 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
package org.apache.poi.ss.usermodel;
|
||||||
|
|
||||||
|
public interface StylesSource {
|
||||||
|
public String getNumberFormatAt(long idx);
|
||||||
|
public long putNumberFormat(String fmt);
|
||||||
|
}
|
@ -20,9 +20,12 @@ package org.apache.poi.xssf.model;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.Hashtable;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.SharedStringSource;
|
import org.apache.poi.ss.usermodel.StylesSource;
|
||||||
import org.apache.xmlbeans.XmlException;
|
import org.apache.xmlbeans.XmlException;
|
||||||
import org.apache.xmlbeans.XmlOptions;
|
import org.apache.xmlbeans.XmlOptions;
|
||||||
import org.openxml4j.opc.PackagePart;
|
import org.openxml4j.opc.PackagePart;
|
||||||
@ -43,8 +46,8 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.StyleSheetDocument;;
|
|||||||
*
|
*
|
||||||
* @version $Id: SharedStringsTable.java 612495 2008-01-16 16:08:22Z ugo $
|
* @version $Id: SharedStringsTable.java 612495 2008-01-16 16:08:22Z ugo $
|
||||||
*/
|
*/
|
||||||
public class StylesTable {
|
public class StylesTable implements StylesSource {
|
||||||
private final LinkedList<String> numberFormats = new LinkedList<String>();
|
private final Hashtable<Long,String> numberFormats = new Hashtable<Long,String>();
|
||||||
private final LinkedList<CTFont> fonts = new LinkedList<CTFont>();
|
private final LinkedList<CTFont> fonts = new LinkedList<CTFont>();
|
||||||
private final LinkedList<CTFill> fills = new LinkedList<CTFill>();
|
private final LinkedList<CTFill> fills = new LinkedList<CTFill>();
|
||||||
private final LinkedList<CTBorder> borders = new LinkedList<CTBorder>();
|
private final LinkedList<CTBorder> borders = new LinkedList<CTBorder>();
|
||||||
@ -80,7 +83,7 @@ public class StylesTable {
|
|||||||
|
|
||||||
// Grab all the different bits we care about
|
// Grab all the different bits we care about
|
||||||
for (CTNumFmt nfmt : doc.getStyleSheet().getNumFmts().getNumFmtArray()) {
|
for (CTNumFmt nfmt : doc.getStyleSheet().getNumFmts().getNumFmtArray()) {
|
||||||
numberFormats.add(nfmt.getFormatCode());
|
numberFormats.put(nfmt.getNumFmtId(), nfmt.getFormatCode());
|
||||||
}
|
}
|
||||||
for (CTFont font : doc.getStyleSheet().getFonts().getFontArray()) {
|
for (CTFont font : doc.getStyleSheet().getFonts().getFontArray()) {
|
||||||
fonts.add(font);
|
fonts.add(font);
|
||||||
@ -96,17 +99,56 @@ public class StylesTable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getNumberFormatAt(int idx) {
|
public String getNumberFormatAt(long idx) {
|
||||||
return numberFormats.get(idx);
|
return numberFormats.get(idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized int putNumberFormat(String fmt) {
|
public synchronized long putNumberFormat(String fmt) {
|
||||||
if (numberFormats.contains(fmt)) {
|
if (numberFormats.containsValue(fmt)) {
|
||||||
return numberFormats.indexOf(fmt);
|
// Find the key, and return that
|
||||||
|
for(Enumeration<Long> keys = numberFormats.keys(); keys.hasMoreElements();) {
|
||||||
|
Long key = keys.nextElement();
|
||||||
|
if(numberFormats.get(key).equals(fmt)) {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new IllegalStateException("Found the format, but couldn't figure out where - should never happen!");
|
||||||
}
|
}
|
||||||
numberFormats.add(fmt);
|
|
||||||
return numberFormats.size() - 1;
|
// Find a spare key, and add that
|
||||||
|
long newKey = 1;
|
||||||
|
while(numberFormats.containsKey(newKey)) {
|
||||||
|
newKey++;
|
||||||
|
}
|
||||||
|
numberFormats.put(newKey, fmt);
|
||||||
|
return newKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For unit testing only
|
||||||
|
*/
|
||||||
|
public int _getNumberFormatSize() {
|
||||||
|
return numberFormats.size();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* For unit testing only
|
||||||
|
*/
|
||||||
|
public int _getFontsSize() {
|
||||||
|
return fonts.size();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* For unit testing only
|
||||||
|
*/
|
||||||
|
public int _getFillsSize() {
|
||||||
|
return fills.size();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* For unit testing only
|
||||||
|
*/
|
||||||
|
public int _getBordersSize() {
|
||||||
|
return borders.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Save this table to its own PackagePart.
|
* Save this table to its own PackagePart.
|
||||||
@ -139,16 +181,21 @@ public class StylesTable {
|
|||||||
// Formats
|
// Formats
|
||||||
CTNumFmts formats = CTNumFmts.Factory.newInstance();
|
CTNumFmts formats = CTNumFmts.Factory.newInstance();
|
||||||
formats.setCount(numberFormats.size());
|
formats.setCount(numberFormats.size());
|
||||||
for (String fmt : numberFormats) {
|
for (Entry<Long, String> fmt : numberFormats.entrySet()) {
|
||||||
formats.addNewNumFmt().setFormatCode(fmt);
|
CTNumFmt ctFmt = formats.addNewNumFmt();
|
||||||
|
ctFmt.setNumFmtId(fmt.getKey());
|
||||||
|
ctFmt.setFormatCode(fmt.getValue());
|
||||||
}
|
}
|
||||||
doc.getStyleSheet().setNumFmts(formats);
|
doc.getStyleSheet().setNumFmts(formats);
|
||||||
|
|
||||||
// Fonts
|
// Fonts
|
||||||
|
// TODO
|
||||||
|
|
||||||
// Fills
|
// Fills
|
||||||
|
// TODO
|
||||||
|
|
||||||
// Borders
|
// Borders
|
||||||
|
// TODO
|
||||||
|
|
||||||
// Save
|
// Save
|
||||||
doc.save(out);
|
doc.save(out);
|
||||||
|
@ -35,10 +35,12 @@ import org.apache.poi.ss.usermodel.Palette;
|
|||||||
import org.apache.poi.ss.usermodel.PictureData;
|
import org.apache.poi.ss.usermodel.PictureData;
|
||||||
import org.apache.poi.ss.usermodel.SharedStringSource;
|
import org.apache.poi.ss.usermodel.SharedStringSource;
|
||||||
import org.apache.poi.ss.usermodel.Sheet;
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
|
import org.apache.poi.ss.usermodel.StylesSource;
|
||||||
import org.apache.poi.ss.usermodel.Workbook;
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
import org.apache.poi.util.POILogFactory;
|
import org.apache.poi.util.POILogFactory;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
import org.apache.poi.xssf.model.SharedStringsTable;
|
import org.apache.poi.xssf.model.SharedStringsTable;
|
||||||
|
import org.apache.poi.xssf.model.StylesTable;
|
||||||
import org.apache.xmlbeans.XmlException;
|
import org.apache.xmlbeans.XmlException;
|
||||||
import org.apache.xmlbeans.XmlObject;
|
import org.apache.xmlbeans.XmlObject;
|
||||||
import org.apache.xmlbeans.XmlOptions;
|
import org.apache.xmlbeans.XmlOptions;
|
||||||
@ -69,6 +71,8 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
|||||||
|
|
||||||
private static final String SHARED_STRINGS_RELATIONSHIP = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings";
|
private static final String SHARED_STRINGS_RELATIONSHIP = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings";
|
||||||
|
|
||||||
|
private static final String STYLES_RELATIONSHIP = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles";
|
||||||
|
|
||||||
private static final String DRAWING_RELATIONSHIP = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing";
|
private static final String DRAWING_RELATIONSHIP = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing";
|
||||||
|
|
||||||
private static final String IMAGE_RELATIONSHIP = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image";
|
private static final String IMAGE_RELATIONSHIP = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image";
|
||||||
@ -78,6 +82,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
|||||||
private List<XSSFSheet> sheets = new LinkedList<XSSFSheet>();
|
private List<XSSFSheet> sheets = new LinkedList<XSSFSheet>();
|
||||||
|
|
||||||
private SharedStringSource sharedStringSource;
|
private SharedStringSource sharedStringSource;
|
||||||
|
private StylesSource stylesSource;
|
||||||
|
|
||||||
private static POILogger log = POILogFactory.getLogger(XSSFWorkbook.class);
|
private static POILogger log = POILogFactory.getLogger(XSSFWorkbook.class);
|
||||||
|
|
||||||
@ -97,14 +102,27 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
|||||||
try {
|
try {
|
||||||
WorkbookDocument doc = WorkbookDocument.Factory.parse(getCorePart().getInputStream());
|
WorkbookDocument doc = WorkbookDocument.Factory.parse(getCorePart().getInputStream());
|
||||||
this.workbook = doc.getWorkbook();
|
this.workbook = doc.getWorkbook();
|
||||||
|
|
||||||
|
PackageRelationshipCollection prc;
|
||||||
|
Iterator<PackageRelationship> it;
|
||||||
|
|
||||||
// Load shared strings
|
// Load shared strings
|
||||||
PackageRelationshipCollection prc = getCorePart().getRelationshipsByType(SHARED_STRINGS_RELATIONSHIP);
|
prc = getCorePart().getRelationshipsByType(SHARED_STRINGS_RELATIONSHIP);
|
||||||
Iterator<PackageRelationship> it = prc.iterator();
|
it = prc.iterator();
|
||||||
if (it.hasNext()) {
|
if (it.hasNext()) {
|
||||||
PackageRelationship rel = it.next();
|
PackageRelationship rel = it.next();
|
||||||
PackagePart part = getTargetPart(rel);
|
PackagePart part = getTargetPart(rel);
|
||||||
this.sharedStringSource = new SharedStringsTable(part);
|
this.sharedStringSource = new SharedStringsTable(part);
|
||||||
}
|
}
|
||||||
|
// Load styles source
|
||||||
|
prc = getCorePart().getRelationshipsByType(STYLES_RELATIONSHIP);
|
||||||
|
it = prc.iterator();
|
||||||
|
if (it.hasNext()) {
|
||||||
|
PackageRelationship rel = it.next();
|
||||||
|
PackagePart part = getTargetPart(rel);
|
||||||
|
this.stylesSource = new StylesTable(part);
|
||||||
|
}
|
||||||
|
|
||||||
// Load individual sheets
|
// Load individual sheets
|
||||||
for (CTSheet ctSheet : this.workbook.getSheets().getSheetArray()) {
|
for (CTSheet ctSheet : this.workbook.getSheets().getSheetArray()) {
|
||||||
PackagePart part = getPackagePart(ctSheet);
|
PackagePart part = getPackagePart(ctSheet);
|
||||||
@ -345,8 +363,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getSSTString(int index) {
|
public String getSSTString(int index) {
|
||||||
// TODO Auto-generated method stub
|
return getSharedStringSource().getSharedStringAt(index);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public short getSelectedTab() {
|
public short getSelectedTab() {
|
||||||
@ -513,6 +530,9 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
|||||||
out.close();
|
out.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO - shared strings source
|
||||||
|
// TODO - styles source
|
||||||
|
|
||||||
pkg.close();
|
pkg.close();
|
||||||
|
|
||||||
} catch (InvalidFormatException e) {
|
} catch (InvalidFormatException e) {
|
||||||
@ -529,10 +549,16 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
|||||||
public SharedStringSource getSharedStringSource() {
|
public SharedStringSource getSharedStringSource() {
|
||||||
return this.sharedStringSource;
|
return this.sharedStringSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setSharedStringSource(SharedStringSource sharedStringSource) {
|
protected void setSharedStringSource(SharedStringSource sharedStringSource) {
|
||||||
this.sharedStringSource = sharedStringSource;
|
this.sharedStringSource = sharedStringSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public StylesSource getStylesSource() {
|
||||||
|
return this.stylesSource;
|
||||||
|
}
|
||||||
|
protected void setStylesSource(StylesSource stylesSource) {
|
||||||
|
this.stylesSource = stylesSource;
|
||||||
|
}
|
||||||
|
|
||||||
public CreationHelper getCreationHelper() {
|
public CreationHelper getCreationHelper() {
|
||||||
return new XSSFCreationHelper(this);
|
return new XSSFCreationHelper(this);
|
||||||
|
@ -281,6 +281,10 @@ public class TestXSSFCell extends TestCase {
|
|||||||
|
|
||||||
assertEquals("A1", ctWorksheet.getSheetViews().getSheetViewArray(0).getSelectionArray(0).getActiveCell());
|
assertEquals("A1", ctWorksheet.getSheetViews().getSheetViewArray(0).getSelectionArray(0).getActiveCell());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testCellFormatting() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private XSSFRow createParentObjects() {
|
private XSSFRow createParentObjects() {
|
||||||
XSSFWorkbook wb = new XSSFWorkbook();
|
XSSFWorkbook wb = new XSSFWorkbook();
|
||||||
|
@ -24,6 +24,8 @@ import java.io.OutputStream;
|
|||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.Sheet;
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
|
import org.apache.poi.ss.usermodel.StylesSource;
|
||||||
|
import org.apache.poi.xssf.model.StylesTable;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook;
|
||||||
|
|
||||||
@ -130,4 +132,40 @@ public class TestXSSFWorkbook extends TestCase {
|
|||||||
workbook.write(out);
|
workbook.write(out);
|
||||||
out.close();
|
out.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testExisting() throws Exception {
|
||||||
|
File xml = new File(
|
||||||
|
System.getProperty("HSSF.testdata.path") +
|
||||||
|
File.separator + "Formatting.xlsx"
|
||||||
|
);
|
||||||
|
assertTrue(xml.exists());
|
||||||
|
|
||||||
|
XSSFWorkbook workbook = new XSSFWorkbook(xml.toString());
|
||||||
|
assertNotNull(workbook.getSharedStringSource());
|
||||||
|
assertNotNull(workbook.getStylesSource());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testStyles() throws Exception {
|
||||||
|
File xml = new File(
|
||||||
|
System.getProperty("HSSF.testdata.path") +
|
||||||
|
File.separator + "Formatting.xlsx"
|
||||||
|
);
|
||||||
|
assertTrue(xml.exists());
|
||||||
|
|
||||||
|
XSSFWorkbook workbook = new XSSFWorkbook(xml.toString());
|
||||||
|
|
||||||
|
StylesSource ss = workbook.getStylesSource();
|
||||||
|
assertNotNull(ss);
|
||||||
|
assertTrue(ss instanceof StylesTable);
|
||||||
|
StylesTable st = (StylesTable)ss;
|
||||||
|
|
||||||
|
// Has 8 number formats
|
||||||
|
assertEquals(8, st._getNumberFormatSize());
|
||||||
|
// Has 2 fonts
|
||||||
|
assertEquals(2, st._getFontsSize());
|
||||||
|
// Has 2 fills
|
||||||
|
assertEquals(2, st._getFillsSize());
|
||||||
|
// Has 1 border
|
||||||
|
assertEquals(1, st._getBordersSize());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user