public Font getFontAt(long idx);
public long putFont(Font font);
+
+ public CellStyle getStyleAt(long idx);
+ public long putStyle(CellStyle style);
}
import java.util.LinkedList;
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.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.XmlOptions;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBorder;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFonts;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTNumFmt;
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;;
private final LinkedList<CTFont> fonts = new LinkedList<CTFont>();
private final LinkedList<CTFill> fills = new LinkedList<CTFill>();
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
*/
public StylesTable() {
doc = StyleSheetDocument.Factory.newInstance();
+ doc.addNewStyleSheet();
}
/**
for (CTBorder border : doc.getStyleSheet().getBorders().getBorderArray()) {
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) {
throw new IOException(e.getLocalizedMessage());
}
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
*/
public int _getNumberFormatSize() {
public int _getBordersSize() {
return borders.size();
}
+ /**
+ * For unit testing only!
+ */
+ public CTStylesheet _getRawStylesheet() {
+ return doc.getStyleSheet();
+ }
/**
// Borders
// TODO
+ // Xfs
+ // TODO
+
// Save
doc.save(out);
}
import org.apache.poi.ss.usermodel.Comment;
import org.apache.poi.ss.usermodel.RichTextString;
import org.apache.poi.ss.usermodel.SharedStringSource;
+import org.apache.poi.ss.usermodel.StylesSource;
import org.apache.poi.xssf.util.CellReference;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellFormula;
private final XSSFRow row;
private short cellNum;
private SharedStringSource sharedStringSource;
+ private StylesSource stylesSource;
/**
* Create a new XSSFCell. This method is protected to be used only by
this.cellNum = parseCellNum(cell.getR());
}
this.sharedStringSource = row.getSheet().getWorkbook().getSharedStringSource();
+ this.stylesSource = row.getSheet().getWorkbook().getStylesSource();
}
protected SharedStringSource getSharedStringSource() {
return this.sharedStringSource;
}
+ protected StylesSource getStylesSource() {
+ return this.stylesSource;
+ }
public boolean getBooleanCellValue() {
if (STCellType.B != cell.getT()) {
}
public CellStyle getCellStyle() {
- // TODO Auto-generated method stub
- return null;
+ if(this.cell.getS() > 0) {
+ return stylesSource.getStyleAt(this.cell.getS());
+ }
+ return null;
}
public int getCellType() {
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
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.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.STBorderStyle.Enum;
public class XSSFCellStyle implements CellStyle {
-
- private CTStylesheet stylesheet;
+ private StylesTable stylesTable;
private CTXf cellXf;
private CTXf cellStyleXf;
private XSSFCellBorder cellBorder;
- public XSSFCellStyle(CTStylesheet stylesheet, int cellXfsId) {
- this.stylesheet = stylesheet;
- this.cellXf = stylesheet.getCellStyleXfs().getXfArray(cellXfsId);
- if (cellXf.isSetXfId()) {
- this.cellStyleXf = stylesheet.getCellStyleXfs().getXfArray((int) cellXf.getXfId());
- }
+ /**
+ * @param cellXf The main XF for the cell
+ * @param cellStyleXf Optional, style xf
+ * @param stylesTable Styles Table to work off
+ */
+ public XSSFCellStyle(CTXf cellXf, CTXf cellStyleXf, StylesTable stylesTable) {
+ this.stylesTable = stylesTable;
+ this.cellXf = cellXf;
+ this.cellStyleXf = cellStyleXf;
}
public short getAlignment() {
}
public short getDataFormat() {
- // TODO Auto-generated method stub
- return 0;
+ return (short)cellXf.getNumFmtId();
+ }
+ public String getDataFormatString() {
+ return stylesTable.getNumberFormatAt(getDataFormat());
}
public short getFillBackgroundColor() {
private XSSFCellBorder getCellBorder() {
if (cellBorder == null) {
- CTBorder border = stylesheet.getBorders().getBorderArray(getBorderId());
- cellBorder = new XSSFCellBorder(border);
+ cellBorder = stylesTable.getBorderAt(getBorderId());
}
return cellBorder;
}
public class XSSFCellBorder {
-
private CTBorder border;
+ /**
+ * Creates a Cell Border from the supplied XML definition
+ */
public XSSFCellBorder(CTBorder 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 {
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) {
return getBorder(side).getStyle();
}
default: throw new IllegalArgumentException("No suitable side specified for the border");
}
}
-
-}
+}
\ No newline at end of file
}
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() {
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.CTStylesheet;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTXf;
public class TestXSSFCellStyle extends TestCase {
- private CTStylesheet ctStylesheet;
- private CTBorder ctBorder;
+ private StylesTable stylesTable;
+ private CTBorder ctBorderA;
+ private CTBorder ctBorderB;
private CTXf cellStyleXf;
private CTXf cellXf;
private XSSFCellStyle cellStyle;
public void setUp() {
- ctStylesheet = CTStylesheet.Factory.newInstance();
- ctBorder = ctStylesheet.addNewBorders().insertNewBorder(0);
+ stylesTable = new StylesTable();
+
+ 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.setBorderId(0);
cellXf = ctStylesheet.addNewCellXfs().addNewXf();
cellXf.setXfId(0);
- cellStyle = new XSSFCellStyle(ctStylesheet, 0);
+ cellStyle = new XSSFCellStyle(cellXf, cellStyleXf, stylesTable);
}
public void testGetBorderBottom() {
- ctBorder.addNewBottom().setStyle(STBorderStyle.THIN);
+ ctBorderA.addNewBottom().setStyle(STBorderStyle.THIN);
assertEquals((short)1, cellStyle.getBorderBottom());
}
public void testGetBorderBottomAsString() {
- ctBorder.addNewBottom().setStyle(STBorderStyle.THIN);
+ ctBorderA.addNewBottom().setStyle(STBorderStyle.THIN);
assertEquals("thin", cellStyle.getBorderBottomAsString());
}
public void testGetBorderRight() {
- ctBorder.addNewRight().setStyle(STBorderStyle.MEDIUM);
+ ctBorderA.addNewRight().setStyle(STBorderStyle.MEDIUM);
assertEquals((short)2, cellStyle.getBorderRight());
}
public void testGetBorderRightAsString() {
- ctBorder.addNewRight().setStyle(STBorderStyle.MEDIUM);
+ ctBorderA.addNewRight().setStyle(STBorderStyle.MEDIUM);
assertEquals("medium", cellStyle.getBorderRightAsString());
}
public void testGetBorderLeft() {
- ctBorder.addNewLeft().setStyle(STBorderStyle.DASHED);
+ ctBorderA.addNewLeft().setStyle(STBorderStyle.DASHED);
assertEquals((short)3, cellStyle.getBorderLeft());
}
public void testGetBorderLeftAsString() {
- ctBorder.addNewLeft().setStyle(STBorderStyle.DASHED);
+ ctBorderA.addNewLeft().setStyle(STBorderStyle.DASHED);
assertEquals("dashed", cellStyle.getBorderLeftAsString());
}
public void testGetBorderTop() {
- ctBorder.addNewTop().setStyle(STBorderStyle.HAIR);
+ ctBorderA.addNewTop().setStyle(STBorderStyle.HAIR);
assertEquals((short)7, cellStyle.getBorderTop());
}
public void testGetTopBottomAsString() {
- ctBorder.addNewTop().setStyle(STBorderStyle.HAIR);
+ ctBorderA.addNewTop().setStyle(STBorderStyle.HAIR);
assertEquals("hair", cellStyle.getBorderTopAsString());
}
}