2016-06-06 11 views
0

Ich baue eine Excel-Datei mit der Apache POI-Bibliothek in Java. Ich möchte mehrere Zellen mit verschiedenen Farben haben, also habe ich eine Methode entwickelt, um die Stile zu erstellen, die ich brauche. Dann rufe ich diese Methode auf, um die Stile so anzuwenden, wie ich sie brauche.Java POI letzte CellStyle überschreiben vorherige CellStyles

Leider wird die letzte Vordergrundfarbe auf alle vorherigen Zellen angewendet, auf die ein Stil mit einer Vordergrundfarbe angewendet wurde. Also, die gelbe Zelle, die ich in Spalte A erstelle, kommt grau hervor, wenn ich die graue Zelle in Spalte C erstelle. [Editiert]

Kann mir jemand sagen, was ich hier falsch mache?

Hier ist das Verfahren (sorry für seine inelegance) [bearbeitet]:

private CellStyle getCellStyle(boolean isHeader, boolean isShaded, String color){ 
    CellStyle style = workbook.createCellStyle(); 
    Font font = workbook.createFont(); 

    if (isHeader) { 
     style.setBorderBottom(CellStyle.BORDER_MEDIUM); 
     style.setBorderLeft(CellStyle.BORDER_MEDIUM); 
     style.setBorderRight(CellStyle.BORDER_MEDIUM); 
     style.setBorderTop(CellStyle.BORDER_MEDIUM); 

     style.setAlignment(CellStyle.ALIGN_CENTER); 

     font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 
     font.setFontHeightInPoints((short) 14); 
    } 

    if (isShaded) { 
     style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 
     if (color.equalsIgnoreCase("yellow")) 
      style.setFillForegroundColor(HSSFColor.YELLOW.index); 
     else if (color.equalsIgnoreCase("light grey")); 
      style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index); 
    } 

    style.setFont(font); 

    return style; 

} 

Und hier ist ein Abschnitt, in dem ich die Methode aufrufen [editiert].

private void createHeaderRow(Row row, String year, String tableName) { 
    int rowNum = row.getRowNum(); 
    int colNum = 0; 
    boolean isHeader = true; 

    CellStyle boldStyle = getCellStyle(isHeader, false, ""); 
    CellStyle yellowStyle = getCellStyle(isHeader, true, "yellow"); 
    CellStyle lightGreyStyle = getCellStyle(isHeader, true, "light grey"); 

    Cell cell = row.createCell(colNum++); 
    cell.setCellValue(year); 
    cell.setCellStyle(yellowStyle); 

    cell = row.createCell(colNum++); 
    cell.setCellValue("Company"); 
    cell.setCellStyle(boldStyle); 

    cell = row.createCell(colNum++); 
    cell.setCellValue("Total"); 
    cell.setCellStyle(lightGreyStyle); 
} 
+0

gut zu funktionieren, versuchen Sie, Ihren Code zu vereinfachen, so dass einfach mit jedem Wert nur schafft 3 oder 4 Zellen ist, Ich frage mich, ob es einen Codierungsfehler mit den Loops oder 'mergedRegions' etc. gibt. –

+1

Bitte geben Sie auch an, welche POI-Version Sie verwenden und versuchen Sie es mit der neuesten, um auszuschließen, dass dies bereits behoben wurde. – centic

+0

Hallo, beide, danke. Ich habe die Schleifen und Zusammenführungen entfernt. Ich bin mir nicht sicher, welche Version von POI ich verwende ... wie kann ich das feststellen? – Jamie

Antwort

1

Problem ist in Poi nicht, siehe hier:

else if (color.equalsIgnoreCase("light grey")); // <--- HERE 
     style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index); 

Ihr else if nichts tut, und style.setFillForegroundColor(..GREY..) wird jedes Mal aufgerufen.

Die Verwendung von Klammern für den Zustand ist eine gute Übung, auch wenn sie nicht notwendig ist.

FIFY:

if (isShaded) { 
    style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 
    if (color.equalsIgnoreCase("yellow")){ 
     style.setFillForegroundColor(HSSFColor.YELLOW.index); 
    } 
    else if (color.equalsIgnoreCase("light grey")){ 
     style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index); 
    } 
} 

einfach diesen Code getestet, scheint für einen Test für mich

+0

Vielen Dank! Ich kann nicht glauben, dass ich das vermisst habe. – Jamie

Verwandte Themen