]> source.dussan.org Git - poi.git/commitdiff
Fix bug #51469 - XSSF support for row styles, to match existing HSSF functionality
authorNick Burch <nick@apache.org>
Fri, 8 Jul 2011 14:58:08 +0000 (14:58 +0000)
committerNick Burch <nick@apache.org>
Fri, 8 Jul 2011 14:58:08 +0000 (14:58 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1144348 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/usermodel/HSSFRow.java
src/java/org/apache/poi/ss/usermodel/Row.java
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRow.java
src/testcases/org/apache/poi/ss/usermodel/BaseTestRow.java

index f3d998c9646c9f2d08ffc2f6df07eb2aef0af16e..4e9eb37899de96278bc066063822b74fd31bfff3 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.8-beta4" date="2011-??-??">
+           <action dev="poi-developers" type="add">51469 - XSSF support for row styles, to match existing HSSF functionality</action>
            <action dev="poi-developers" type="fix">51476 - Correct XSSF cell formatting in HTML export</action>
            <action dev="poi-developers" type="add">51486 - XWPF support for adding new footnotes</action>
            <action dev="poi-developers" type="fix">48065 - Problems with save output of HWPF (losing formatting)</action>
index 4d8102867fbd4bf3f58a96764c56e213c6cc1081..2397129bf232b3d8db86fe0dce640ecde49006a2 100644 (file)
@@ -24,6 +24,7 @@ import org.apache.poi.hssf.record.CellValueRecordInterface;
 import org.apache.poi.hssf.record.ExtendedFormatRecord;
 import org.apache.poi.hssf.record.RowRecord;
 import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.SpreadsheetVersion;
 
@@ -593,6 +594,12 @@ public final class HSSFRow implements Row {
         row.setFormatted(true);
         row.setXFIndex(style.getIndex());
     }
+    /**
+     * Applies a whole-row cell styling to the row.
+     */
+    public void setRowStyle(CellStyle style) {
+        setRowStyle((HSSFCellStyle)style);
+    }
 
     /**
      * @return cell iterator of the physically defined cells.
index a1db2fb3675e5863239030ed6e5a39b49c900b14..5d93f6492c244cd5508dd76e0f0d0c85718ffc3b 100644 (file)
@@ -17,7 +17,6 @@
 
 package org.apache.poi.ss.usermodel;
 
-import java.lang.Iterable;
 import java.util.Iterator;
 
 /**
@@ -177,6 +176,25 @@ public interface Row extends Iterable<Cell> {
      */
     float getHeightInPoints();
 
+    /**
+     * Is this row formatted? Most aren't, but some rows
+     *  do have whole-row styles. For those that do, you
+     *  can get the formatting from {@link #getRowStyle()}
+     */
+    boolean isFormatted();
+    
+    /**
+     * Returns the whole-row cell styles. Most rows won't
+     *  have one of these, so will return null. Call
+     *  {@link #isFormatted()} to check first.
+     */
+    CellStyle getRowStyle();
+    
+    /**
+     * Applies a whole-row cell styling to the row.
+     */
+    void setRowStyle(CellStyle style);
+    
     /**
      * @return Cell iterator of the physically defined cells.  Note element 4 may
      * actually be row cell depending on how many are defined!
index ad7383661c11cd231d398685549b6c9b31f1c511..52735db7fe1fe3b9b1b716bf604005ff068c3fe1 100644 (file)
 
 package org.apache.poi.xssf.streaming;
 
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
 import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
+import org.apache.poi.xssf.usermodel.XSSFCellStyle;
 
 /**
  * Streaming version of XSSFRow implementing the "BigGridDemo" strategy.
@@ -34,6 +36,7 @@ public class SXSSFRow implements Row
     SXSSFSheet _sheet;
     SXSSFCell[] _cells;
     int _maxColumn=-1;
+    short _style=-1;
     short _height=-1;
     boolean _zHeight = false;
 
@@ -330,6 +333,37 @@ public class SXSSFRow implements Row
     {
         return (float)(_height==-1?getSheet().getDefaultRowHeightInPoints():(float)_height/20.0);
     }
+    
+    /**
+     * Is this row formatted? Most aren't, but some rows
+     *  do have whole-row styles. For those that do, you
+     *  can get the formatting from {@link #getRowStyle()}
+     */
+    public boolean isFormatted() {
+        return _style > -1;
+    }
+    /**
+     * Returns the whole-row cell style. Most rows won't
+     *  have one of these, so will return null. Call
+     *  {@link #isFormatted()} to check first.
+     */
+    public CellStyle getRowStyle() {
+       if(!isFormatted()) return null;
+       
+       return getSheet().getWorkbook().getCellStyleAt(_style);
+    }
+    
+    /**
+     * Applies a whole-row cell styling to the row.
+     */
+    public void setRowStyle(CellStyle style) {
+       if(style == null) {
+          _style = -1;
+          return;
+       } else {
+          _style = style.getIndex();
+       }
+    }
 
     /**
      * @return Cell iterator of the physically defined cells.  Note element 4 may
index bb5d8ac8108bd0f21de19af64f7ace50514b5aa8..d19770a91872aa4fd0922b9eb36f80bd80356d9d 100644 (file)
@@ -1317,6 +1317,10 @@ public class SXSSFSheet implements Sheet, Cloneable
                 _out.write(" customHeight=\"true\"  ht=\""+row.getHeightInPoints()+"\"");
             if(row.getZeroHeight())
                 _out.write(" hidden=\"true\"");
+            if(row.isFormatted()) {
+                _out.write(" s=\"" + row._style + "\"");
+                _out.write(" customFormat=\"1\"");
+            }
             _out.write(">\n");
             this._rownum = rownum;
             _rowContainedNullCells=false;
index 2fbcd19f174f893e86cdd42607ba21f50da2354e..9ed76da098f5fc13d4bc2bac8b048f10afc9637c 100644 (file)
@@ -22,12 +22,14 @@ import java.util.TreeMap;
 
 import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.util.CellReference;
 import org.apache.poi.util.Internal;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
 import org.apache.poi.xssf.model.CalculationChain;
+import org.apache.poi.xssf.model.StylesTable;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow;
 
@@ -355,6 +357,53 @@ public class XSSFRow implements Row, Comparable<XSSFRow> {
 
     }
 
+    /**
+     * Is this row formatted? Most aren't, but some rows
+     *  do have whole-row styles. For those that do, you
+     *  can get the formatting from {@link #getRowStyle()}
+     */
+    public boolean isFormatted() {
+        return _row.isSetS();
+    }
+    /**
+     * Returns the whole-row cell style. Most rows won't
+     *  have one of these, so will return null. Call
+     *  {@link #isFormatted()} to check first.
+     */
+    public XSSFCellStyle getRowStyle() {
+       if(!isFormatted()) return null;
+       
+       StylesTable stylesSource = getSheet().getWorkbook().getStylesSource();
+       if(stylesSource.getNumCellStyles() > 0) {
+           return stylesSource.getStyleAt((int)_row.getS());
+       } else {
+          return null;
+       }
+    }
+    
+    /**
+     * Applies a whole-row cell styling to the row.
+     * If the value is null then the style information is removed,
+     *  causing the cell to used the default workbook style.
+     */
+    public void setRowStyle(CellStyle style) {
+        if(style == null) {
+           if(_row.isSetS()) {
+              _row.unsetS();
+              _row.unsetCustomFormat();
+           }
+        } else {
+            StylesTable styleSource = getSheet().getWorkbook().getStylesSource();
+            
+            XSSFCellStyle xStyle = (XSSFCellStyle)style;
+            xStyle.verifyBelongsToStylesSource(styleSource);
+
+            long idx = styleSource.putStyle(xStyle);
+            _row.setS(idx);
+            _row.setCustomFormat(true);
+        }
+    }
+    
     /**
      * Remove the Cell from this row.
      *
index 51f8db91b206b3d88d032f25757aa825f3fb2a02..da40cd076b5b825f325a0f786f03b29702e42d21 100644 (file)
@@ -386,4 +386,42 @@ public abstract class BaseTestRow extends TestCase {
         assertTrue(cell2 == it.next());
         assertEquals(Cell.CELL_TYPE_STRING, cell5.getCellType());
     }
+    
+    public void testRowStyle() {
+       Workbook workbook = _testDataProvider.createWorkbook();
+       Sheet sheet = workbook.createSheet("test");
+       Row row1 = sheet.createRow(0);
+       Row row2 = sheet.createRow(1);
+       
+       // Won't be styled currently
+       assertEquals(false, row1.isFormatted());
+       assertEquals(false, row2.isFormatted());
+       assertEquals(null, row1.getRowStyle());
+       assertEquals(null, row2.getRowStyle());
+       
+       // Style one
+       CellStyle style = workbook.createCellStyle();
+       style.setDataFormat((short)4);
+       row2.setRowStyle(style);
+       
+       // Check
+       assertEquals(false, row1.isFormatted());
+       assertEquals(true, row2.isFormatted());
+       assertEquals(null, row1.getRowStyle());
+       assertEquals(style, row2.getRowStyle());
+       
+       // Save, load and re-check
+       workbook = _testDataProvider.writeOutAndReadBack(workbook);
+       sheet = workbook.getSheetAt(0);
+
+       row1 = sheet.getRow(0);
+       row2 = sheet.getRow(1);
+       style = workbook.getCellStyleAt(style.getIndex());
+       
+       assertEquals(false, row1.isFormatted());
+       assertEquals(true, row2.isFormatted());
+       assertEquals(null, row1.getRowStyle());
+       assertEquals(style, row2.getRowStyle());
+       assertEquals(4, style.getDataFormat());
+    }
 }