Start to tie up the XSSF cell styles stuff with the StylesTable code

git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@637692 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2008-03-17 00:10:17 +00:00
parent 86bac45ee8
commit 000cafe678
7 changed files with 134 additions and 34 deletions

View File

@ -22,4 +22,7 @@ public interface StylesSource {
public Font getFontAt(long idx); public Font getFontAt(long idx);
public long putFont(Font font); public long putFont(Font font);
public CellStyle getStyleAt(long idx);
public long putStyle(CellStyle style);
} }

View File

@ -25,8 +25,11 @@ import java.util.Hashtable;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.Map.Entry; import java.util.Map.Entry;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.StylesSource; import org.apache.poi.ss.usermodel.StylesSource;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder;
import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlOptions; import org.apache.xmlbeans.XmlOptions;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBorder; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBorder;
@ -35,6 +38,8 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFont;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFonts; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFonts;
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.CTXf;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.StyleSheetDocument;; import org.openxmlformats.schemas.spreadsheetml.x2006.main.StyleSheetDocument;;
@ -48,6 +53,8 @@ public class StylesTable implements StylesSource, XSSFModel {
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>();
private final LinkedList<CTXf> styleXfs = new LinkedList<CTXf>();
private final LinkedList<CTXf> xfs = new LinkedList<CTXf>();
/** /**
* The first style id available for use as a custom style * The first style id available for use as a custom style
@ -71,6 +78,7 @@ public class StylesTable implements StylesSource, XSSFModel {
*/ */
public StylesTable() { public StylesTable() {
doc = StyleSheetDocument.Factory.newInstance(); doc = StyleSheetDocument.Factory.newInstance();
doc.addNewStyleSheet();
} }
/** /**
@ -96,6 +104,12 @@ public class StylesTable implements StylesSource, XSSFModel {
for (CTBorder border : doc.getStyleSheet().getBorders().getBorderArray()) { for (CTBorder border : doc.getStyleSheet().getBorders().getBorderArray()) {
borders.add(border); borders.add(border);
} }
for (CTXf xf : doc.getStyleSheet().getCellXfs().getXfArray()) {
xfs.add(xf);
}
for (CTXf xf : doc.getStyleSheet().getCellStyleXfs().getXfArray()) {
styleXfs.add(xf);
}
} catch (XmlException e) { } catch (XmlException e) {
throw new IOException(e.getLocalizedMessage()); throw new IOException(e.getLocalizedMessage());
} }
@ -138,7 +152,35 @@ public class StylesTable implements StylesSource, XSSFModel {
return -1; return -1;
} }
/** public CellStyle getStyleAt(long idx) {
CTXf mainXf = styleXfs.get((int)idx);
CTXf styleXf = null;
if(mainXf.getXfId() > -1) {
styleXf = styleXfs.get((int)mainXf.getXfId());
}
return new XSSFCellStyle(mainXf, styleXf, this);
}
public long putStyle(CellStyle style) {
// TODO
return -1;
}
public XSSFCellBorder getBorderAt(long idx) {
return new XSSFCellBorder(borders.get((int)idx));
}
public long putBorder(XSSFCellBorder border) {
return putBorder(border.getCTBorder());
}
public synchronized long putBorder(CTBorder border) {
if(borders.contains(border)) {
return borders.indexOf(border);
}
borders.add(border);
return borders.size() - 1;
}
/**
* For unit testing only * For unit testing only
*/ */
public int _getNumberFormatSize() { public int _getNumberFormatSize() {
@ -162,6 +204,12 @@ public class StylesTable implements StylesSource, XSSFModel {
public int _getBordersSize() { public int _getBordersSize() {
return borders.size(); return borders.size();
} }
/**
* For unit testing only!
*/
public CTStylesheet _getRawStylesheet() {
return doc.getStyleSheet();
}
/** /**
@ -202,6 +250,9 @@ public class StylesTable implements StylesSource, XSSFModel {
// Borders // Borders
// TODO // TODO
// Xfs
// TODO
// Save // Save
doc.save(out); doc.save(out);
} }

View File

@ -26,6 +26,7 @@ import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Comment; import org.apache.poi.ss.usermodel.Comment;
import org.apache.poi.ss.usermodel.RichTextString; import org.apache.poi.ss.usermodel.RichTextString;
import org.apache.poi.ss.usermodel.SharedStringSource; import org.apache.poi.ss.usermodel.SharedStringSource;
import org.apache.poi.ss.usermodel.StylesSource;
import org.apache.poi.xssf.util.CellReference; import org.apache.poi.xssf.util.CellReference;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellFormula; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellFormula;
@ -40,6 +41,7 @@ public class XSSFCell implements Cell {
private final XSSFRow row; private final XSSFRow row;
private short cellNum; private short cellNum;
private SharedStringSource sharedStringSource; private SharedStringSource sharedStringSource;
private StylesSource stylesSource;
/** /**
* Create a new XSSFCell. This method is protected to be used only by * Create a new XSSFCell. This method is protected to be used only by
@ -56,11 +58,15 @@ public class XSSFCell implements Cell {
this.cellNum = parseCellNum(cell.getR()); this.cellNum = parseCellNum(cell.getR());
} }
this.sharedStringSource = row.getSheet().getWorkbook().getSharedStringSource(); this.sharedStringSource = row.getSheet().getWorkbook().getSharedStringSource();
this.stylesSource = row.getSheet().getWorkbook().getStylesSource();
} }
protected SharedStringSource getSharedStringSource() { protected SharedStringSource getSharedStringSource() {
return this.sharedStringSource; return this.sharedStringSource;
} }
protected StylesSource getStylesSource() {
return this.stylesSource;
}
public boolean getBooleanCellValue() { public boolean getBooleanCellValue() {
if (STCellType.B != cell.getT()) { if (STCellType.B != cell.getT()) {
@ -89,8 +95,10 @@ public class XSSFCell implements Cell {
} }
public CellStyle getCellStyle() { public CellStyle getCellStyle() {
// TODO Auto-generated method stub if(this.cell.getS() > 0) {
return null; return stylesSource.getStyleAt(this.cell.getS());
}
return null;
} }
public int getCellType() { public int getCellType() {

View File

@ -20,27 +20,28 @@ package org.apache.poi.xssf.usermodel;
import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.model.StylesTable;
import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder; import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder;
import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder.BorderSides; import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder.BorderSides;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBorder;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTStylesheet;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTXf; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTXf;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STBorderStyle.Enum; import org.openxmlformats.schemas.spreadsheetml.x2006.main.STBorderStyle.Enum;
public class XSSFCellStyle implements CellStyle { public class XSSFCellStyle implements CellStyle {
private StylesTable stylesTable;
private CTStylesheet stylesheet;
private CTXf cellXf; private CTXf cellXf;
private CTXf cellStyleXf; private CTXf cellStyleXf;
private XSSFCellBorder cellBorder; private XSSFCellBorder cellBorder;
public XSSFCellStyle(CTStylesheet stylesheet, int cellXfsId) { /**
this.stylesheet = stylesheet; * @param cellXf The main XF for the cell
this.cellXf = stylesheet.getCellStyleXfs().getXfArray(cellXfsId); * @param cellStyleXf Optional, style xf
if (cellXf.isSetXfId()) { * @param stylesTable Styles Table to work off
this.cellStyleXf = stylesheet.getCellStyleXfs().getXfArray((int) cellXf.getXfId()); */
} public XSSFCellStyle(CTXf cellXf, CTXf cellStyleXf, StylesTable stylesTable) {
this.stylesTable = stylesTable;
this.cellXf = cellXf;
this.cellStyleXf = cellStyleXf;
} }
public short getAlignment() { public short getAlignment() {
@ -85,8 +86,10 @@ public class XSSFCellStyle implements CellStyle {
} }
public short getDataFormat() { public short getDataFormat() {
// TODO Auto-generated method stub return (short)cellXf.getNumFmtId();
return 0; }
public String getDataFormatString() {
return stylesTable.getNumberFormatAt(getDataFormat());
} }
public short getFillBackgroundColor() { public short getFillBackgroundColor() {
@ -263,8 +266,7 @@ public class XSSFCellStyle implements CellStyle {
private XSSFCellBorder getCellBorder() { private XSSFCellBorder getCellBorder() {
if (cellBorder == null) { if (cellBorder == null) {
CTBorder border = stylesheet.getBorders().getBorderArray(getBorderId()); cellBorder = stylesTable.getBorderAt(getBorderId());
cellBorder = new XSSFCellBorder(border);
} }
return cellBorder; return cellBorder;
} }

View File

@ -23,17 +23,34 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.STBorderStyle.Enum;
public class XSSFCellBorder { public class XSSFCellBorder {
private CTBorder border; private CTBorder border;
/**
* Creates a Cell Border from the supplied XML definition
*/
public XSSFCellBorder(CTBorder border) { public XSSFCellBorder(CTBorder border) {
this.border = border; this.border = border;
} }
/**
* Creates a new, empty Cell Border, on the
* given Styles Table
*/
public XSSFCellBorder() {
border = CTBorder.Factory.newInstance();
}
public static enum BorderSides { public static enum BorderSides {
TOP, RIGHT, BOTTOM, LEFT TOP, RIGHT, BOTTOM, LEFT
} }
/**
* TODO - is this the best way to allow StylesTable
* to record us?
*/
public CTBorder getCTBorder() {
return border;
}
public Enum getBorderStyle(BorderSides side) { public Enum getBorderStyle(BorderSides side) {
return getBorder(side).getStyle(); return getBorder(side).getStyle();
} }
@ -55,5 +72,4 @@ public class XSSFCellBorder {
default: throw new IllegalArgumentException("No suitable side specified for the border"); default: throw new IllegalArgumentException("No suitable side specified for the border");
} }
} }
}
}

View File

@ -283,7 +283,13 @@ public class TestXSSFCell extends TestCase {
} }
public void testCellFormatting() { public void testCellFormatting() {
Workbook workbook = new XSSFWorkbook();
CTSheet ctSheet = CTSheet.Factory.newInstance();
CTWorksheet ctWorksheet = CTWorksheet.Factory.newInstance();
XSSFSheet sheet = new XSSFSheet(ctSheet, ctWorksheet, (XSSFWorkbook) workbook);
Cell cell = sheet.createRow(0).createCell((short)0);
// TODO
} }
private XSSFRow createParentObjects() { private XSSFRow createParentObjects() {

View File

@ -19,6 +19,8 @@ package org.apache.poi.xssf.usermodel;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.apache.poi.xssf.model.StylesTable;
import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBorder; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBorder;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTStylesheet; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTStylesheet;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTXf; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTXf;
@ -27,59 +29,71 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.STBorderStyle;
public class TestXSSFCellStyle extends TestCase { public class TestXSSFCellStyle extends TestCase {
private CTStylesheet ctStylesheet; private StylesTable stylesTable;
private CTBorder ctBorder; private CTBorder ctBorderA;
private CTBorder ctBorderB;
private CTXf cellStyleXf; private CTXf cellStyleXf;
private CTXf cellXf; private CTXf cellXf;
private XSSFCellStyle cellStyle; private XSSFCellStyle cellStyle;
public void setUp() { public void setUp() {
ctStylesheet = CTStylesheet.Factory.newInstance(); stylesTable = new StylesTable();
ctBorder = ctStylesheet.addNewBorders().insertNewBorder(0);
CTStylesheet ctStylesheet = stylesTable._getRawStylesheet();
// Until we do XSSFBorder properly, cheat
ctBorderA = CTBorder.Factory.newInstance();
long borderId = stylesTable.putBorder(ctBorderA);
assertEquals(0, borderId);
XSSFCellBorder borderB = new XSSFCellBorder();
ctBorderB = borderB.getCTBorder();
assertEquals(1, stylesTable.putBorder(borderB));
cellStyleXf = ctStylesheet.addNewCellStyleXfs().addNewXf(); cellStyleXf = ctStylesheet.addNewCellStyleXfs().addNewXf();
cellStyleXf.setBorderId(0); cellStyleXf.setBorderId(0);
cellXf = ctStylesheet.addNewCellXfs().addNewXf(); cellXf = ctStylesheet.addNewCellXfs().addNewXf();
cellXf.setXfId(0); cellXf.setXfId(0);
cellStyle = new XSSFCellStyle(ctStylesheet, 0); cellStyle = new XSSFCellStyle(cellXf, cellStyleXf, stylesTable);
} }
public void testGetBorderBottom() { public void testGetBorderBottom() {
ctBorder.addNewBottom().setStyle(STBorderStyle.THIN); ctBorderA.addNewBottom().setStyle(STBorderStyle.THIN);
assertEquals((short)1, cellStyle.getBorderBottom()); assertEquals((short)1, cellStyle.getBorderBottom());
} }
public void testGetBorderBottomAsString() { public void testGetBorderBottomAsString() {
ctBorder.addNewBottom().setStyle(STBorderStyle.THIN); ctBorderA.addNewBottom().setStyle(STBorderStyle.THIN);
assertEquals("thin", cellStyle.getBorderBottomAsString()); assertEquals("thin", cellStyle.getBorderBottomAsString());
} }
public void testGetBorderRight() { public void testGetBorderRight() {
ctBorder.addNewRight().setStyle(STBorderStyle.MEDIUM); ctBorderA.addNewRight().setStyle(STBorderStyle.MEDIUM);
assertEquals((short)2, cellStyle.getBorderRight()); assertEquals((short)2, cellStyle.getBorderRight());
} }
public void testGetBorderRightAsString() { public void testGetBorderRightAsString() {
ctBorder.addNewRight().setStyle(STBorderStyle.MEDIUM); ctBorderA.addNewRight().setStyle(STBorderStyle.MEDIUM);
assertEquals("medium", cellStyle.getBorderRightAsString()); assertEquals("medium", cellStyle.getBorderRightAsString());
} }
public void testGetBorderLeft() { public void testGetBorderLeft() {
ctBorder.addNewLeft().setStyle(STBorderStyle.DASHED); ctBorderA.addNewLeft().setStyle(STBorderStyle.DASHED);
assertEquals((short)3, cellStyle.getBorderLeft()); assertEquals((short)3, cellStyle.getBorderLeft());
} }
public void testGetBorderLeftAsString() { public void testGetBorderLeftAsString() {
ctBorder.addNewLeft().setStyle(STBorderStyle.DASHED); ctBorderA.addNewLeft().setStyle(STBorderStyle.DASHED);
assertEquals("dashed", cellStyle.getBorderLeftAsString()); assertEquals("dashed", cellStyle.getBorderLeftAsString());
} }
public void testGetBorderTop() { public void testGetBorderTop() {
ctBorder.addNewTop().setStyle(STBorderStyle.HAIR); ctBorderA.addNewTop().setStyle(STBorderStyle.HAIR);
assertEquals((short)7, cellStyle.getBorderTop()); assertEquals((short)7, cellStyle.getBorderTop());
} }
public void testGetTopBottomAsString() { public void testGetTopBottomAsString() {
ctBorder.addNewTop().setStyle(STBorderStyle.HAIR); ctBorderA.addNewTop().setStyle(STBorderStyle.HAIR);
assertEquals("hair", cellStyle.getBorderTopAsString()); assertEquals("hair", cellStyle.getBorderTopAsString());
} }
} }