jXLS 2.3 – 添加侦听器根据单元格内容更新单元格样式?

有一个jXLS 1.xdynamic单元格样式的例子,但我找不到比这个例子更接近AreaListener。

我有一个XLS生成非常基本的模板,并且处理代码就像

context.putVar("headers", columns); context.putVar("data", cells); context.getConfig().setCellStyleMap(); JxlsHelper.getInstance().processTemplate(is, result, context); 

我怎样才能添加一些侦听器,这将允许我修改某些单元格的样式(比如为文本添加超过N个字符的单词换行,或者如果值是特定模式则更改背景颜色)?

你可以这样做

主要方法:

  try(InputStream is = HighlightDemo.class.getResourceAsStream("highlight_template.xls")) { try (OutputStream os = new FileOutputStream("target/highlight_output.xls")) { PoiTransformer transformer = PoiTransformer.createTransformer(is, os); AreaBuilder areaBuilder = new XlsCommentAreaBuilder(transformer, false); List<Area> xlsAreaList = areaBuilder.build(); Area mainArea = xlsAreaList.get(0); Area loopArea = xlsAreaList.get(0).getCommandDataList().get(0).getCommand().getAreaList().get(0); loopArea.addAreaListener(new HighlightCellAreaListener(transformer)); Context context = new Context(); context.putVar("employees", employees); mainArea.applyAt(new CellRef("Result!A1"), context); mainArea.processFormulas(); transformer.write(); } } 

本示例中使用的模板与“ 对象集合演示”示例中的相同。 最棘手的部分是find你想要应用AreaListener的区域。 在这种情况下,我只是从根区域走到了每个区域,在那里我想用超过2000的支付来突出员工。

AreaListener实现类似于AreaListener示例中的实现

 public class HighlightCellAreaListener implements AreaListener { private final CellRef paymentCell = new CellRef("Template!C4") ... public void afterTransformCell(CellRef srcCell, CellRef targetCell, Context context) { System.out.println("Source: " + srcCell.getCellName() + ", Target: " + targetCell.getCellName()); if(paymentCell.equals(srcCell)){ // we are at employee payment cell Employee employee = (Employee) context.getVar("employee"); if( employee.getPayment().doubleValue() > 2000 ){ // highlight payment when >= $2000 logger.info("highlighting payment for employee " + employee.getName()); highlightCell(targetCell); } } } private void highlightCell(CellRef cellRef) { Workbook workbook = transformer.getWorkbook(); Sheet sheet = workbook.getSheet(cellRef.getSheetName()); Cell cell = sheet.getRow(cellRef.getRow()).getCell(cellRef.getCol()); CellStyle cellStyle = cell.getCellStyle(); CellStyle newCellStyle = workbook.createCellStyle(); newCellStyle.setDataFormat( cellStyle.getDataFormat() ); newCellStyle.setFont( workbook.getFontAt( cellStyle.getFontIndex() )); newCellStyle.setFillBackgroundColor( cellStyle.getFillBackgroundColor()); newCellStyle.setFillForegroundColor(IndexedColors.ORANGE.getIndex()); newCellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); cell.setCellStyle(newCellStyle); }