2014-05-11 13 views
9

Sistemim, Java'dan Apache POI kullanarak çok sayıda farklı Excel raporu üretir.Apache'de bir CellStyle kitaplığı oluşturma POI

Bu raporların çoğu aynı stilleri paylaşır.

Tüm raporlarda kullanılmak üzere bir CellStyle kitaplığı oluşturdum. Daha iyi bir yol olup olmadığını merak ettim.

import org.apache.poi.hssf.util.HSSFColor; 
import org.apache.poi.ss.usermodel.CellStyle; 
import org.apache.poi.ss.usermodel.Workbook; 

public class CellStyles { 
    CellStyle headingCellStyle = null; 
    Workbook wb; 

    public CellStyles(Workbook wb) { 
     this.wb = wb; 
    } 

    public CellStyle getHeadingCellStyle() { 
     if (headingCellStyle == null) { 
      headingCellStyle = wb.createCellStyle(); 
      headingCellStyle.setFillForegroundColor(HSSFColor.YELLOW.index); 
      headingCellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); 
     } 
     return headingCellStyle; 
    } 

} 

ve sonra o

Workbook wb = new XSSFWorkbook(inputStream); // XSSF for .xlsm 
CellStyles cs = new CellStyles(wb); 


CellUtil.getCell(myRow, 2).setCellStyle(cs.getHeadingCellStyle()); 
+1

Yeterli görünüyor –

cevap

7

Ben sadeliği o iyidir bu çözümü verilen düşünüyorum çağıran.

Maalesef, POI CellStyleWorkbook adresinden yaratılması gerekiyor, bu nedenle wb parametresini bir şekilde parametre olarak iletmekten gerçekten alamıyorsunuz.

uygulamanıza ek olarak CellStyles parametre olarak wb alıp kodunuzda etrafında cs nesne geçmesine gerek yoktur, böylece stil dönen static yöntemlerin bir demet ortaya çıkarmak için deneyebilirsiniz. Düzgün yapmak için buna değdiğini söylememe rağmen, stili döndürmek için kullanılacak Map[Workbook, CellStyles] eşlemelerinin statik önbelleğini tutmanız gerekiyor.

Stillerin temsili olarak başlatılması çok işe yarar ve yinelenen stiller oluşturmamanıza izin verir, ancak sınıfın dışındaki stil atamalarını değiştiremediğinden emin olmak için stilleri özel olarak private CellStyle headingCellStyle = null; tutmak daha iyi olur ve null-değerli headerCellStyle olmaz kaza ile kullanılabilir.

4

HTML/CSS'yi Excel ve ODF dahil olmak üzere çeşitli biçimlere dönüştüren bir projem var. Herhangi bir kullanım varsa, Stil'in CSS'den çıkarılan çeşitli özellikleri barındıran bir sınıf olduğu aşağıdakileri yaparım.

public class ExcelStyleGenerator { 
    private Map<Style, XSSFCellStyle> styles; 

    public ExcelStyleGenerator() { 
     styles = new HashMap<Style, XSSFCellStyle>(); 
    } 

    public CellStyle getStyle(Cell cell, Style style) { 
     XSSFCellStyle cellStyle; 

     if (styles.containsKey(style)) { 
      cellStyle = styles.get(style); 
     } else { 
      cellStyle = (XSSFCellStyle) cell.getSheet().getWorkbook().createCellStyle(); 

      applyBackground(style, cellStyle); 
      applyBorders(style, cellStyle); 
      applyFont(cell, style, cellStyle); 
      applyHorizontalAlignment(style, cellStyle); 
      applyverticalAlignment(style, cellStyle); 
      applyWidth(cell, style); 

      styles.put(style, cellStyle); 
     } 

     return cellStyle; 
    } 

    protected void applyBackground(Style style, XSSFCellStyle cellStyle) { 
     if (style.isBackgroundSet()) { 
      cellStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND); 
      cellStyle.setFillForegroundColor(new XSSFColor(style.getProperty(CssColorProperty.BACKGROUND))); 
     } 
    } 

    protected void applyBorders(Style style, XSSFCellStyle cellStyle) { 
     if (style.isBorderWidthSet()) { 
      short width = (short) style.getProperty(CssIntegerProperty.BORDER_WIDTH); 

      Color color = style.getProperty(CssColorProperty.BORDER_COLOR) != null ? style 
        .getProperty(CssColorProperty.BORDER_COLOR) : Color.BLACK; 

      cellStyle.setBorderBottom(BorderStyle.THIN); 
      cellStyle.setBorderBottom(width); 
      cellStyle.setBottomBorderColor(new XSSFColor(color)); 

      cellStyle.setBorderTop(BorderStyle.THIN); 
      cellStyle.setBorderTop(width); 
      cellStyle.setTopBorderColor(new XSSFColor(color)); 

      cellStyle.setBorderLeft(BorderStyle.THIN); 
      cellStyle.setBorderLeft(width); 
      cellStyle.setLeftBorderColor(new XSSFColor(color)); 

      cellStyle.setBorderRight(BorderStyle.THIN); 
      cellStyle.setBorderRight(width); 
      cellStyle.setRightBorderColor(new XSSFColor(color)); 
     } 
    } 

    protected void applyFont(Cell cell, Style style, XSSFCellStyle cellStyle) { 
     Font font = createFont(cell.getSheet().getWorkbook(), style); 
     cellStyle.setFont(font); 
    } 

    protected void applyHorizontalAlignment(Style style, XSSFCellStyle cellStyle) { 
     if (style.isHorizontallyAlignedLeft()) { 
      cellStyle.setAlignment(HorizontalAlignment.LEFT); 
     } else if (style.isHorizontallyAlignedRight()) { 
      cellStyle.setAlignment(HorizontalAlignment.RIGHT); 
     } else if (style.isHorizontallyAlignedCenter()) { 
      cellStyle.setAlignment(HorizontalAlignment.CENTER); 
     } 
    } 

    protected void applyverticalAlignment(Style style, XSSFCellStyle cellStyle) { 
     if (style.isVerticallyAlignedTop()) { 
      cellStyle.setVerticalAlignment(VerticalAlignment.TOP); 
     } else if (style.isVerticallyAlignedBottom()) { 
      cellStyle.setVerticalAlignment(VerticalAlignment.BOTTOM); 
     } else if (style.isVerticallyAlignedMiddle()) { 
      cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); 
     } 
    } 

    protected void applyWidth(Cell cell, Style style) { 
     if (style.getProperty(CssIntegerProperty.WIDTH) > 0) { 
      cell.getSheet().setColumnWidth(cell.getColumnIndex(), style.getProperty(CssIntegerProperty.WIDTH) * 50); 
     } 
    } 

    public Font createFont(Workbook workbook, Style style) { 
     Font font = workbook.createFont(); 

     if (style.isFontNameSet()) { 
      font.setFontName(style.getProperty(CssStringProperty.FONT_FAMILY)); 
     } 

     if (style.isFontSizeSet()) { 
      font.setFontHeightInPoints((short) style.getProperty(CssIntegerProperty.FONT_SIZE)); 
     } 

     if (style.isColorSet()) { 
      Color color = style.getProperty(CssColorProperty.COLOR); 

      // if(! color.equals(Color.WHITE)) // POI Bug 
      // { 
      ((XSSFFont) font).setColor(new XSSFColor(color)); 
      // } 
     } 

     if (style.isFontBold()) { 
      font.setBoldweight(Font.BOLDWEIGHT_BOLD); 
     } 

     font.setItalic(style.isFontItalic()); 

     if (style.isTextUnderlined()) { 
      font.setUnderline(Font.U_SINGLE); 
     } 

     return font; 
    } 
} 
+0

Teşekkür ederim. Bu kod, stil kütüphanesini oluştururken tekrarlayan kodlardan kaçınmaya kesinlikle yardımcı olur. – gordon613

İlgili konular