Fix bug #51469 - XSSF support for row styles, to match existing HSSF functionality
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1144348 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
026ef97694
commit
ee866292d9
@ -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>
|
||||
|
@ -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.
|
||||
|
@ -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!
|
||||
|
@ -17,13 +17,15 @@
|
||||
|
||||
package org.apache.poi.xssf.streaming;
|
||||
|
||||
import org.apache.poi.ss.usermodel.Cell;
|
||||
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.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 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;
|
||||
|
||||
@ -331,6 +334,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
|
||||
* actually be row cell depending on how many are defined!
|
||||
|
@ -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;
|
||||
|
@ -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.
|
||||
*
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user