【问题标题】:Changing cell color using apache poi使用 apache poi 更改单元格颜色
【发布时间】:2012-07-16 18:57:52
【问题描述】:

我正在使用 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;
    }
}

【问题讨论】:

  • 确定 checkPartNumber 的输出?
  • checkPartNumber 的返回值是一个布尔值,并且该值被正确返回。
  • 如果我这样做,而不是获取单元格样式: CellStyle myStyle = partList.createCellStyle();我得到了正确的颜色,但我失去了现有的单元格格式。

标签: java excel apache-poi


【解决方案1】:

对于 apache POI 3.9,您可以使用以下代码:

HSSFCellStyle style = workbook.createCellStyle()
style.setFillForegroundColor(HSSFColor.YELLOW.index)
style.setFillPattern((short) FillPatternType.SOLID_FOREGROUND.ordinal())

3.9版本的方法接受short,请注意输入。

【讨论】:

    【解决方案2】:

    我相信这是因为cell.getCellStyle 最初会返回默认的单元格样式,然后您会更改它。

    创建这样的样式并将它们应用到单元格:

    cellStyle = (XSSFCellStyle) cell.getSheet().getWorkbook().createCellStyle();
    

    尽管正如之前的海报所指出的,尝试创建样式并重用它们。

    XSSF 库中还有一些实用程序类可以避免我提供的代码并自动尝试和重用样式。不记得 0ff 班的手了。

    【讨论】:

      【解决方案3】:

      在此处查看示例

      http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/ss/examples/BusinessPlan.java

      style.setFillForegroundColor(IndexedColors.LIGHT_CORNFLOWER_BLUE.getIndex());
      

      【讨论】:

        【解决方案4】:

        要创建您的单元格样式,请参阅: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);
        

        【讨论】:

          【解决方案5】:

          短版:只创建一次样式,随处使用。

          长版:使用方法创建你需要的样式(注意样式数量的限制)。

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

          您还可以在创建样式 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") );
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-02-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-03-19
            相关资源
            最近更新 更多