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:
Nick Burch 2008-03-16 22:07:38 +00:00
parent 944da771ba
commit 7cec45a438
5 changed files with 154 additions and 17 deletions

View File

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

View File

@ -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;
} }
numberFormats.add(fmt);
return numberFormats.size() - 1;
} }
throw new IllegalStateException("Found the format, but couldn't figure out where - should never happen!");
}
// 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);

View File

@ -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,11 +549,17 @@ 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);
} }

View File

@ -282,6 +282,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();
wb.setSharedStringSource(new DummySharedStringSource()); wb.setSharedStringSource(new DummySharedStringSource());

View File

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