]> source.dussan.org Git - poi.git/commitdiff
Start to tie up the XSSF cell styles stuff with the StylesTable code
authorNick Burch <nick@apache.org>
Mon, 17 Mar 2008 00:10:17 +0000 (00:10 +0000)
committerNick Burch <nick@apache.org>
Mon, 17 Mar 2008 00:10:17 +0000 (00:10 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@637692 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/StylesSource.java
src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java
src/ooxml/java/org/apache/poi/xssf/usermodel/extensions/XSSFCellBorder.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCellStyle.java

index 45a11a46a3674d6fb1c7e1ac09c5acf519106f5f..fbb10fab07c22f51475c5f8de493ceb1d0930d16 100644 (file)
@@ -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);
 }
index c5227c1c1cac9a07152a137002e3043373ee699b..3e8c0f54dfab6269a8ef30c8dbbf561f0af7ec25 100644 (file)
@@ -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<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
@@ -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);
     }
index 70cdb3bea858140ef33dcb7de97ead58ba09df0b..ab20476a8e2bf5750ab874c320ad484fb27c1462 100644 (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.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() {
index e5a5630edc75aca16be8208519d400742e8234a1..90931ad677eb6ee48d5f7d05b0188945198986f6 100644 (file)
@@ -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;
        }
index f65cc85b8886f6ab59413e1ccb33f66a9d6cba84..cf281b8065572dc151c14820aad96556de3724ba 100644 (file)
@@ -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
index 56b1b170b48ca46e27b26c98fd8625d7021a715f..92d709d208af1cf3e5fc3928d51d7851b23ced9a 100644 (file)
@@ -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() {
index fc762e0668ccc7ec878441f1ae1d7df434114426..9f18dd6b9a9b5b1bc8d20a26474ad9925ae4b162 100644 (file)
@@ -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());
        }
 }