Apache POI Zeilenfarbe

Einen schönen Sonntag euch allen,

ich hänge gerade mal wieder, wahrscheinlich an einer Kleinigkeit und komme nicht auf die Lösung.
Folgender Code, soll die Ausgabe eines JTables in eine Excel steuern.
In der Variablen hRow wird die jeweilige Reihe der Liste gespeichert.
Unter dem Kommentar // Liste werden die einzelnen Reihen erstellt. hRow wird bei jedem Schleifendurchlauf neu referenziert, da immer die nächste Reihe erstellt wird (i+1).
Das füllen der Liste funktioniert auch tadellos.

Bei der Bestimmung der Zeilenfarbe kommt es zum Problem.
Alle Zeilen werden bei der Ausgabe der Excel in der Fabre der letzten Zeile gefärbt.
Ist also der Status der letzten Zeile beispielsweise "Teillieferung", werden alle Zeilen der Tabelle rot eingefärbt.
Die Styles der anderen Zeilen werden also irgendwie überschrieben mit den Informationen aus der letzten Zeile.
Im Switch Statement sind alle break; Anweisungen gesetzt.

Das ist wie die Suche nach der Nadel im Heuhaufen :-(

Evtl. sieht ein erfahrenerer Kollege den Fehler sofort.

vielen Dank für eure Unterstützung

Code:
public static void writer (JTable table) throws  IOException {
  
    JFileChooser save = new JFileChooser();
    save.setDialogTitle("Save as...");
    save.setFileFilter(new FileNameExtensionFilter ("xlsx", "xls", "xlsm"));
    int choose = save.showSaveDialog(null);
  
    if (choose == JFileChooser.APPROVE_OPTION) {
      
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet ("Gartner Lagerliste");
        //try
        TableModel model = table.getModel();
        TableColumnModel column = table.getColumnModel();
        XSSFCellStyle style = workbook.createCellStyle();
      
        //Header
        XSSFRow row = sheet.createRow(0);
        XSSFRow hRow;
      
        for (int c=0; c<model.getColumnCount(); c++) {
            XSSFCell cell = row.createCell(c);
            cell.setCellValue(column.getColumn(c).getHeaderValue().toString());
      
        }
      
        //Liste
        for (int i=0; i<model.getRowCount(); i++) {
            hRow = sheet.createRow(i+1);
      
  
            // Zeile wird mit Daten gefüllt
            for (int j=0; j<model.getColumnCount(); j++) {
                XSSFCell cell = hRow.createCell(j, CellType.STRING);   
                cell.setCellValue(model.getValueAt(i, j).toString());
          
              
          
            }
          
            //Zeilenfarbe wird bestimmt
            String status = workbook.getSheetAt(0).getRow(i+1).getCell(11).toString();
              
            switch (status) {
            case  "Komplettlieferung" :
                style.setFillForegroundColor (IndexedColors.YELLOW.getIndex());
                style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
              
              
              
                break;
            case "Teillieferung" :
                style.setFillForegroundColor (IndexedColors.RED.getIndex());
                style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            
              
                break;
            case "nicht prüfbar" :
                style.setFillForegroundColor (IndexedColors.AQUA.getIndex());
                style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            
                break;
            case "ausgeliefert" :
                style.setFillForegroundColor (IndexedColors.GREEN.getIndex());
                style.setFillPattern(FillPatternType.SOLID_FOREGROUND); 
                break;
              
          
            }
      
          
            for (int c=0; c<model.getColumnCount(); c++) {
                hRow.getCell(c).setCellStyle(style);
          
                }
        }
      
        FileOutputStream FOS = new FileOutputStream (save.getSelectedFile()+".xlsx");
        BufferedOutputStream bos = new BufferedOutputStream (FOS);
      
        workbook.write(bos);
        bos.close();
        FOS.close();
      
      
    }
 
Auf den ersten Blick würde ich sagen, dass Du für alle Zeilen das selbe CellStyle-Objekt verwendest und nur die Attribute veränderst. Am Ende verweisen dann alle Zellen auf das selbe Objekt, das die Attribute der letzten "Zeile" hat.

Kurz: erzeug mal mehrere Stile vorab und weise den passenden zu.
 
Auf den ersten Blick würde ich sagen, dass Du für alle Zeilen das selbe CellStyle-Objekt verwendest und nur die Attribute veränderst. Am Ende verweisen dann alle Zellen auf das selbe Objekt, das die Attribute der letzten "Zeile" hat.

Kurz: erzeug mal mehrere Stile vorab und weise den passenden zu.
Wieder mal kurz, präzise und erfolgreich. Vielen Dank.
An sich völlig logisch. Aber auch hier gilt ...."Manchmal sieht man den Wald ......"
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben