This section contains samples demonstrating how to dynamically change style of some cells during export
This sample demonstrates how to use custom RowProcessor to higlight rows for all employees
with payment greater than 2000.
See also Customizing jXLS output reference section for details on writing custom RowProcessor.
In this sample we have StyleRowProcessor class implementing RowProcessor interface
public class StyleRowProcessor implements RowProcessor {
String collectionName;
String styleCellLabel = "customRow";
public StyleRowProcessor(String collectionName) {
this.collectionName = collectionName;
}
public void processRow(Row row, Map namedCells) {
// check if processed row has a parent row
if( row.getParentRow()!=null ){
// Processed row has parent row. It means we are processing some collection item
RowCollection rowCollection = row.getParentRow().getRowCollectionByCollectionName( collectionName );
if( rowCollection.getIterateObject() instanceof Employee){
Employee employee = (Employee) rowCollection.getIterateObject();
if( employee.getPayment().doubleValue() >= 2000 ){
if( namedCells.containsKey( styleCellLabel ) ){
Cell customCell = (Cell) namedCells.get( styleCellLabel );
for (int i = 0; i < row.getCells().size(); i++) {
Cell cell = (Cell) row.getCells().get(i);
HSSFCell hssfCell = cell.getHssfCell();
if( hssfCell!=null ){
copyStyle( row.getHssfWorkbook(), customCell.getHssfCell(), hssfCell );
}
}
}
}
}
}
}
private void copyStyle(HSSFWorkbook workbook, HSSFCell fromCell, HSSFCell toCell){
HSSFCellStyle toStyle = toCell.getCellStyle();
HSSFCellStyle fromStyle = fromCell.getCellStyle();
if( fromStyle.getDataFormat() == toStyle.getDataFormat() ){
toCell.setCellStyle( fromStyle );
}else{
HSSFCellStyle newStyle = workbook.createCellStyle();
newStyle.setAlignment( toStyle.getAlignment() );
newStyle.setBorderBottom( toStyle.getBorderBottom() );
newStyle.setBorderLeft( toStyle.getBorderLeft() );
newStyle.setBorderRight( toStyle.getBorderRight() );
newStyle.setBorderTop( toStyle.getBorderTop() );
newStyle.setBottomBorderColor( toStyle.getBottomBorderColor() );
newStyle.setDataFormat( toStyle.getDataFormat() );
newStyle.setFillBackgroundColor( fromStyle.getFillBackgroundColor() );
newStyle.setFillForegroundColor( fromStyle.getFillForegroundColor() );
newStyle.setFillPattern( fromStyle.getFillPattern() );
newStyle.setFont( workbook.getFontAt( fromStyle.getFontIndex() ) );
newStyle.setHidden( toStyle.getHidden() );
newStyle.setIndention( toStyle.getIndention() );
newStyle.setLeftBorderColor( toStyle.getLeftBorderColor() );
newStyle.setLocked( toStyle.getLocked() );
newStyle.setRightBorderColor( toStyle.getRightBorderColor() );
newStyle.setTopBorderColor( toStyle.getTopBorderColor() );
newStyle.setVerticalAlignment( toStyle.getVerticalAlignment() );
newStyle.setWrapText( toStyle.getWrapText() );
toCell.setCellStyle( newStyle );
}
}
}
In StyleRowSample class we create StyleRowProcessor object and register it with XLSTransformer.
Map beans = new HashMap();
beans.put("department", department);
XLSTransformer transformer = new XLSTransformer();
transformer.registerRowProcessor(new StyleRowProcessor("department.staff"));
transformer.transformXLS(templateFileName, beans, destFileName);
The first row in XLS template is hidden. And its first cell contains custom style to use for highligting.
Take a look at screenshot of template

See excel version rowstyle.xls
Sample output screenshot is

Excel version is rowstyle_output.xls