diff --git a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/StylesSource.java b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/StylesSource.java index 45a11a46a..fbb10fab0 100644 --- a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/StylesSource.java +++ b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/StylesSource.java @@ -22,4 +22,7 @@ public interface StylesSource { public Font getFontAt(long idx); public long putFont(Font font); + + public CellStyle getStyleAt(long idx); + public long putStyle(CellStyle style); } diff --git a/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java b/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java index c5227c1c1..3e8c0f54d 100644 --- a/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java +++ b/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java @@ -25,8 +25,11 @@ import java.util.Hashtable; 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; @@ -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.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;; @@ -48,6 +53,8 @@ public class StylesTable implements StylesSource, XSSFModel { private final LinkedList fonts = new LinkedList(); private final LinkedList fills = new LinkedList(); private final LinkedList borders = new LinkedList(); + private final LinkedList styleXfs = new LinkedList(); + private final LinkedList xfs = new LinkedList(); /** * The first style id available for use as a custom style @@ -71,6 +78,7 @@ public class StylesTable implements StylesSource, XSSFModel { */ public StylesTable() { doc = StyleSheetDocument.Factory.newInstance(); + doc.addNewStyleSheet(); } /** @@ -96,6 +104,12 @@ public class StylesTable implements StylesSource, XSSFModel { 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()); } @@ -138,7 +152,35 @@ public class StylesTable implements StylesSource, XSSFModel { 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() { @@ -162,6 +204,12 @@ public class StylesTable implements StylesSource, XSSFModel { public int _getBordersSize() { return borders.size(); } + /** + * For unit testing only! + */ + public CTStylesheet _getRawStylesheet() { + return doc.getStyleSheet(); + } /** @@ -202,6 +250,9 @@ public class StylesTable implements StylesSource, XSSFModel { // Borders // TODO + // Xfs + // TODO + // Save doc.save(out); } diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java index 70cdb3bea..ab20476a8 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java @@ -26,6 +26,7 @@ import org.apache.poi.ss.usermodel.CellStyle; 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; @@ -40,6 +41,7 @@ public class XSSFCell implements Cell { 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 @@ -56,11 +58,15 @@ public class XSSFCell implements Cell { 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()) { @@ -89,8 +95,10 @@ public class XSSFCell implements Cell { } 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() { diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java index e5a5630ed..90931ad67 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java @@ -20,27 +20,28 @@ package org.apache.poi.xssf.usermodel; 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() { @@ -85,8 +86,10 @@ public class XSSFCellStyle implements CellStyle { } public short getDataFormat() { - // TODO Auto-generated method stub - return 0; + return (short)cellXf.getNumFmtId(); + } + public String getDataFormatString() { + return stylesTable.getNumberFormatAt(getDataFormat()); } public short getFillBackgroundColor() { @@ -263,8 +266,7 @@ public class XSSFCellStyle implements CellStyle { private XSSFCellBorder getCellBorder() { if (cellBorder == null) { - CTBorder border = stylesheet.getBorders().getBorderArray(getBorderId()); - cellBorder = new XSSFCellBorder(border); + cellBorder = stylesTable.getBorderAt(getBorderId()); } return cellBorder; } diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellBorder.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellBorder.java index f65cc85b8..cf281b806 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellBorder.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellBorder.java @@ -23,17 +23,34 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.STBorderStyle.Enum; 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(); } @@ -55,5 +72,4 @@ public class XSSFCellBorder { default: throw new IllegalArgumentException("No suitable side specified for the border"); } } - -} +} \ No newline at end of file diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java index 56b1b170b..92d709d20 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java @@ -283,7 +283,13 @@ public class TestXSSFCell extends TestCase { } 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() { diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java index fc762e066..9f18dd6b9 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java @@ -19,6 +19,8 @@ package org.apache.poi.xssf.usermodel; 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; @@ -27,59 +29,71 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.STBorderStyle; 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()); } }