2014-05-11 76 views
9

我的系统使用Java的Apache POI生成大量不同的Excel报告。在Apache POI中创建CellStyle库

很多这些报告共享相同的样式。

我创建了一个CellStyle库供所有报告使用。我想知道是否有更好的方法。

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

} 

,然后调用它

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


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

似乎够好 –

回答

7

我认为,鉴于它的简单性这个解决方案是好的。

不幸的是在POI CellStyle需要从Workbook创建,所以你不能真正避免通过wb作为参数以某种方式。

除了你实现你可以尝试在CellStyles揭露了一堆static方法以wb作为参数和返回的风格,让你不必到处传递cs对象在你的代码。虽然我不会说这是值得的,但要做到这一点,您需要维护Map[Workbook, CellStyles]映射的静态缓存,这将用于返回样式。

风格

延迟初始化工作也很好,并允许您以避免创建重复的样式,虽然这将是更好地保持风格的私人即private CellStyle headingCellStyle = null;,以确保没有任何东西可以改变类和空值headerCellStyle外的风格分配不会被误用。

4

我有一个将HTML/CSS转换为各种格式(包括Excel和ODF)的项目。如果它有任何用处,我会做以下几点,其中Style是一个持有从CSS中提取的各种属性的类。

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

谢谢。这段代码肯定有助于在创建样式库时避免重复的代码。 – gordon613