在Apache POI中创build一个CellStyle库

我的系统使用Java的Apache POI生成许多不同的Excel报告。

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

我已经创build了一个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()); 

我认为,鉴于其简单的解决scheme,这是很好的。

不幸的是,在POI中, CellStyle需要从Workbook创build,因此您无法避免以某种方式将wb作为parameter passing。

除了你的实现,你可能会尝试在CellStyles公开CellStyleswb作为参数并返回样式的static方法,这样就不需要在代码中传递cs对象。 虽然我不会说这样做是值得的,但是需要维护Map[Workbook, CellStyles]映射的静态caching,这将用于返回样式。

样式的延迟初始化工作得很好,并且可以避免创build重复的样式,但是最好保留样式私有的,即private CellStyle headingCellStyle = null; 确保没有任何东西可以改变类外的样式赋值,而且不会意外地使用null值的headerCellStyle。

我有一个项目,将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; } }