2017-02-18 3 views
1

Es gibt eine example des dynamischen Zellenstylings für jXLS 1.x, aber ich kann nichts näher als this example für AreaListener finden.jXLS 2.3 - den Listener hinzufügen, um einen Zellenstil abhängig vom Zelleninhalt zu aktualisieren?

Ich habe eine sehr grundlegende Vorlage für die XLS-Generierung und die Verarbeitung Code so einfach wie

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

Wie kann ich einige Zuhörer hinzufügen, die mir den Stil für bestimmte Zellen ändern können (wie hinzufügen Zeilenumbruch für den Text länger als N Zeichen, oder die Hintergrundfarbe ändern, wenn der Wert ein bestimmtes Muster hat)?

Antwort

2

Sie können es wie folgt

Im Hauptverfahren erreichen:

 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(); 
     } 
    } 

Die in diesem Beispiel verwendete Vorlage ist die gleiche wie in Object Collection Demo Probe. Der schwierigste Teil besteht darin, den Bereich zu finden, in dem Sie den AreaListener anwenden möchten. In diesem Fall habe ich aus dem Wurzelbereich auf den Bereich EachCommand nur durchlaufen, wo ich möchte 2000 Mitarbeiter mit Zahlung markieren über

Die AreaListener Implementierung ist ähnlich dem in AreaListener example

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); 
} 
Verwandte Themen