<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>
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;
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.
package org.apache.poi.ss.usermodel;
-import java.lang.Iterable;
import java.util.Iterator;
/**
*/
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!
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.
SXSSFSheet _sheet;
SXSSFCell[] _cells;
int _maxColumn=-1;
+ short _style=-1;
short _height=-1;
boolean _zHeight = false;
{
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
_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;
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;
}
+ /**
+ * 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.
*
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());
+ }
}