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>
|
<changes>
|
||||||
<release version="3.8-beta4" date="2011-??-??">
|
<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="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="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>
|
<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.ExtendedFormatRecord;
|
||||||
import org.apache.poi.hssf.record.RowRecord;
|
import org.apache.poi.hssf.record.RowRecord;
|
||||||
import org.apache.poi.ss.usermodel.Cell;
|
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.Row;
|
||||||
import org.apache.poi.ss.SpreadsheetVersion;
|
import org.apache.poi.ss.SpreadsheetVersion;
|
||||||
|
|
||||||
@ -593,6 +594,12 @@ public final class HSSFRow implements Row {
|
|||||||
row.setFormatted(true);
|
row.setFormatted(true);
|
||||||
row.setXFIndex(style.getIndex());
|
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.
|
* @return cell iterator of the physically defined cells.
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.apache.poi.ss.usermodel;
|
package org.apache.poi.ss.usermodel;
|
||||||
|
|
||||||
import java.lang.Iterable;
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -177,6 +176,25 @@ public interface Row extends Iterable<Cell> {
|
|||||||
*/
|
*/
|
||||||
float getHeightInPoints();
|
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
|
* @return Cell iterator of the physically defined cells. Note element 4 may
|
||||||
* actually be row cell depending on how many are defined!
|
* actually be row cell depending on how many are defined!
|
||||||
|
@ -17,13 +17,15 @@
|
|||||||
|
|
||||||
package org.apache.poi.xssf.streaming;
|
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.Iterator;
|
||||||
import java.util.NoSuchElementException;
|
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.
|
* Streaming version of XSSFRow implementing the "BigGridDemo" strategy.
|
||||||
*
|
*
|
||||||
@ -34,6 +36,7 @@ public class SXSSFRow implements Row
|
|||||||
SXSSFSheet _sheet;
|
SXSSFSheet _sheet;
|
||||||
SXSSFCell[] _cells;
|
SXSSFCell[] _cells;
|
||||||
int _maxColumn=-1;
|
int _maxColumn=-1;
|
||||||
|
short _style=-1;
|
||||||
short _height=-1;
|
short _height=-1;
|
||||||
boolean _zHeight = false;
|
boolean _zHeight = false;
|
||||||
|
|
||||||
@ -331,6 +334,37 @@ public class SXSSFRow implements Row
|
|||||||
return (float)(_height==-1?getSheet().getDefaultRowHeightInPoints():(float)_height/20.0);
|
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
|
* @return Cell iterator of the physically defined cells. Note element 4 may
|
||||||
* actually be row cell depending on how many are defined!
|
* 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()+"\"");
|
_out.write(" customHeight=\"true\" ht=\""+row.getHeightInPoints()+"\"");
|
||||||
if(row.getZeroHeight())
|
if(row.getZeroHeight())
|
||||||
_out.write(" hidden=\"true\"");
|
_out.write(" hidden=\"true\"");
|
||||||
|
if(row.isFormatted()) {
|
||||||
|
_out.write(" s=\"" + row._style + "\"");
|
||||||
|
_out.write(" customFormat=\"1\"");
|
||||||
|
}
|
||||||
_out.write(">\n");
|
_out.write(">\n");
|
||||||
this._rownum = rownum;
|
this._rownum = rownum;
|
||||||
_rowContainedNullCells=false;
|
_rowContainedNullCells=false;
|
||||||
|
@ -22,12 +22,14 @@ import java.util.TreeMap;
|
|||||||
|
|
||||||
import org.apache.poi.ss.SpreadsheetVersion;
|
import org.apache.poi.ss.SpreadsheetVersion;
|
||||||
import org.apache.poi.ss.usermodel.Cell;
|
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.Row;
|
||||||
import org.apache.poi.ss.util.CellReference;
|
import org.apache.poi.ss.util.CellReference;
|
||||||
import org.apache.poi.util.Internal;
|
import org.apache.poi.util.Internal;
|
||||||
import org.apache.poi.util.POILogFactory;
|
import org.apache.poi.util.POILogFactory;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
import org.apache.poi.xssf.model.CalculationChain;
|
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.CTCell;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow;
|
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.
|
* Remove the Cell from this row.
|
||||||
*
|
*
|
||||||
|
@ -386,4 +386,42 @@ public abstract class BaseTestRow extends TestCase {
|
|||||||
assertTrue(cell2 == it.next());
|
assertTrue(cell2 == it.next());
|
||||||
assertEquals(Cell.CELL_TYPE_STRING, cell5.getCellType());
|
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