aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/documentation/content/xdocs/status.xml1
-rw-r--r--src/java/org/apache/poi/hssf/usermodel/HSSFRow.java7
-rw-r--r--src/java/org/apache/poi/ss/usermodel/Row.java20
-rw-r--r--src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java40
-rw-r--r--src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java4
-rw-r--r--src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRow.java49
-rw-r--r--src/testcases/org/apache/poi/ss/usermodel/BaseTestRow.java38
7 files changed, 155 insertions, 4 deletions
diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml
index f3d998c964..4e9eb37899 100644
--- a/src/documentation/content/xdocs/status.xml
+++ b/src/documentation/content/xdocs/status.xml
@@ -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>
diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java b/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java
index 4d8102867f..2397129bf2 100644
--- a/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java
+++ b/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java
@@ -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.
diff --git a/src/java/org/apache/poi/ss/usermodel/Row.java b/src/java/org/apache/poi/ss/usermodel/Row.java
index a1db2fb367..5d93f6492c 100644
--- a/src/java/org/apache/poi/ss/usermodel/Row.java
+++ b/src/java/org/apache/poi/ss/usermodel/Row.java
@@ -17,7 +17,6 @@
package org.apache.poi.ss.usermodel;
-import java.lang.Iterable;
import java.util.Iterator;
/**
@@ -178,6 +177,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!
*/
diff --git a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java
index ad7383661c..52735db7fe 100644
--- a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java
+++ b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java
@@ -17,12 +17,14 @@
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
diff --git a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
index bb5d8ac810..d19770a918 100644
--- a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
+++ b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
@@ -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;
diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRow.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRow.java
index 2fbcd19f17..9ed76da098 100644
--- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRow.java
+++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRow.java
@@ -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;
@@ -356,6 +358,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.
*
* @param cell the cell to remove
diff --git a/src/testcases/org/apache/poi/ss/usermodel/BaseTestRow.java b/src/testcases/org/apache/poi/ss/usermodel/BaseTestRow.java
index 51f8db91b2..da40cd076b 100644
--- a/src/testcases/org/apache/poi/ss/usermodel/BaseTestRow.java
+++ b/src/testcases/org/apache/poi/ss/usermodel/BaseTestRow.java
@@ -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());
+ }
}