使用apache poi更改单元格颜色
我正在使用Apache POI来读取零件编号电子表格中的数据。 我在数据库中查找零件编号,如果我们有一个零件编号单元格绿色的零件的CAD图纸,如果我们不把它颜色为红色。 处理完成后,电子表格被保存。 我遇到的问题是该列中的每个单元格都是绿色的。 我已经通过代码,查找部件号的逻辑工作正常,并确定单元格应该是什么颜色的逻辑,设置颜色和填充似乎也工作。 任何想法我在这里做错了吗?
谢谢。
//Check the parts for(int r=1;r<sheet.getPhysicalNumberOfRows();r++) { String partNumber = null; switch(cell.getCellType()) { case HSSFCell.CELL_TYPE_NUMERIC: long pNum = (long) cell.getNumericCellValue(); partNumber = String.valueOf(pNum); break; case HSSFCell.CELL_TYPE_STRING: partNumber = cell.getStringCellValue(); break; default: logger.info("Part Number at row " + r + " on sheet " + partList.getSheetName(s) + "is of an unsupported type"); } try { List<String> oldMaterialNumbers = getOldMaterialNumbers(partNumber); boolean gotDrawing = checkPartNumber(oldMaterialNumbers, partNumber); //If there's a drawing then color the row green, if not red. short bgColorIndex = gotDrawing ?HSSFColor.LIGHT_GREEN.index //42 :HSSFColor.RED.index; //10 HSSFCell curCell = row.getCell(partNumberColumn); HSSFCellStyle curStyle = curCell.getCellStyle(); curStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); curStyle.setFillForegroundColor(bgColorIndex); curCell.setCellStyle(curStyle); }catch(Exception e) { throw e; } }
短版:只创build一次样式,到处使用它们。
长版本:使用一种方法来创build你需要的样式(注意样式数量的限制)。
private static Map<String, CellStyle> styles; private static Map<String, CellStyle> createStyles(Workbook wb){ Map<String, CellStyle> styles = new HashMap<String, CellStyle>(); DataFormat df = wb.createDataFormat(); CellStyle style; Font headerFont = wb.createFont(); headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD); headerFont.setFontHeightInPoints((short) 12); style = createBorderedStyle(wb); style.setAlignment(CellStyle.ALIGN_CENTER); style.setFont(headerFont); styles.put("style1", style); style = createBorderedStyle(wb); style.setAlignment(CellStyle.ALIGN_CENTER); style.setFillForegroundColor(IndexedColors.LIGHT_CORNFLOWER_BLUE.getIndex()); style.setFillPattern(CellStyle.SOLID_FOREGROUND); style.setFont(headerFont); style.setDataFormat(df.getFormat("d-mmm")); styles.put("date_style", style); ... return styles; }
您还可以使用方法在创build样式hashmap时执行重复的任务
private static CellStyle createBorderedStyle(Workbook wb) { CellStyle style = wb.createCellStyle(); style.setBorderRight(CellStyle.BORDER_THIN); style.setRightBorderColor(IndexedColors.BLACK.getIndex()); style.setBorderBottom(CellStyle.BORDER_THIN); style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); style.setBorderLeft(CellStyle.BORDER_THIN); style.setLeftBorderColor(IndexedColors.BLACK.getIndex()); style.setBorderTop(CellStyle.BORDER_THIN); style.setTopBorderColor(IndexedColors.BLACK.getIndex()); return style; }
然后,在你的“主”代码中,从样式图中设置样式。
Cell cell = xssfCurrentRow.createCell( intCellPosition ); cell.setCellValue( blah ); cell.setCellStyle( (CellStyle) styles.get("style1") );
要创build单元格样式,请参阅: http : //poi.apache.org/spreadsheet/quick-guide.html#CustomColors 。
自定义颜色
HSSF:
HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(); HSSFRow row = sheet.createRow((short) 0); HSSFCell cell = row.createCell((short) 0); cell.setCellValue("Default Palette"); //apply some colors from the standard palette, // as in the previous examples. //we'll use red text on a lime background HSSFCellStyle style = wb.createCellStyle(); style.setFillForegroundColor(HSSFColor.LIME.index); style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); HSSFFont font = wb.createFont(); font.setColor(HSSFColor.RED.index); style.setFont(font); cell.setCellStyle(style); //save with the default palette FileOutputStream out = new FileOutputStream("default_palette.xls"); wb.write(out); out.close(); //now, let's replace RED and LIME in the palette // with a more attractive combination // (lovingly borrowed from freebsd.org) cell.setCellValue("Modified Palette"); //creating a custom palette for the workbook HSSFPalette palette = wb.getCustomPalette(); //replacing the standard red with freebsd.org red palette.setColorAtIndex(HSSFColor.RED.index, (byte) 153, //RGB red (0-255) (byte) 0, //RGB green (byte) 0 //RGB blue ); //replacing lime with freebsd.org gold palette.setColorAtIndex(HSSFColor.LIME.index, (byte) 255, (byte) 204, (byte) 102); //save with the modified palette // note that wherever we have previously used RED or LIME, the // new colors magically appear out = new FileOutputStream("modified_palette.xls"); wb.write(out); out.close();
XSSF:
XSSFWorkbook wb = new XSSFWorkbook(); XSSFSheet sheet = wb.createSheet(); XSSFRow row = sheet.createRow(0); XSSFCell cell = row.createCell( 0); cell.setCellValue("custom XSSF colors"); XSSFCellStyle style1 = wb.createCellStyle(); style1.setFillForegroundColor(new XSSFColor(new java.awt.Color(128, 0, 128))); style1.setFillPattern(CellStyle.SOLID_FOREGROUND);
我相信这是因为cell.getCellStyle
最初返回您然后更改默认的单元格样式。
像这样创build样式并将其应用于单元格:
cellStyle = (XSSFCellStyle) cell.getSheet().getWorkbook().createCellStyle();
虽然正如前面的海报注意到尝试和创造风格,并重用它们。
在XSSF库中还有一些实用程序类,它将避免我提供的代码并自动尝试和重用样式。 不记得class级的手了。
结帐在这里的例子
style.setFillForegroundColor(IndexedColors.LIGHT_CORNFLOWER_BLUE.getIndex());