【问题标题】:How do I get the (Java Apache POI HSSF) Background Color for a given cell?如何获取给定单元格的(Java Apache POI HSSF)背景颜色?
【发布时间】:2009-09-30 18:03:54
【问题描述】:

我有一个现有的 Excel 电子表格,我正在从中访问和读取值,我正在使用 Apache POI HSSF。

它是这样初始化的:

HSSFSheet sheet;
FileInputStream fis = new FileInputStream(this.file);
POIFSFileSystem fs = new POIFSFileSystem(fis);
HSSFWorkbook wb = new HSSFWorkbook(fs);
this.sheet = wb.getSheet(exsheet);

我正在遍历工作表中存在的所有单元格,这会生成一个单元格对象:

HSSFCell cell = (HSSFCell) cells.next();

请熟悉框架的人解释一下如何创建一个 (HSSFColor) 对象来表示工作表中每个单元格的背景颜色。

非常感谢

编辑、更新

明确我想知道的是:如何为现有单元格的背景颜色创建/获取 HSSFColor 对象?

cell.getCellStyle().getFillBackgroundColor(); 

此代码只返回一个短数字,而不是一个 HSSFColor 对象。 感谢您到目前为止的回答。

【问题讨论】:

  • 或 cell.getCellStyle().getFillForegroundColor(),我正在阅读的 excel 工作表返回相同的背景颜色颜色,即使单元格是彩色的。

标签: java apache-poi poi-hssf hssf


【解决方案1】:

HSSFCell 类提供了静态颜色类,这里列出:

http://poi.apache.org/apidocs/org/apache/poi/hssf/util/HSSFColor.html

如果您想创建自己的自定义颜色,则需要创建和修改自定义调色板。 Apache 对此也提供了非常清晰的指南:

http://poi.apache.org/spreadsheet/quick-guide.html#CustomColors

【讨论】:

    【解决方案2】:

    获取颜色: getFillBackgroundColor 返回的短值是颜色的 Excel 索引。 您可以使用 RMorrisey 指示的最后一个代码获取与 HSSFColor HashTable 中的索引对应的颜色。

    设置颜色: 您创建一个自定义调色板,并更改给定索引处的颜色。然后,将颜色应用于样式。

    //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
    );
    // or creating a new Color
    HSSFColor myColor = palette.addColor((byte) 153, (byte) 0, (byte) 0); 
    HSSFCellStyle style = wb.createCellStyle();
    
    style.setFillForegroundColor(myColor);
    

    问候

    纪尧姆

    【讨论】:

      【解决方案3】:

      XSSFCellStyle 的背景颜色信息可以从方法中获取:

      XSSFCellStyle.getFillForegroundXSSFColor().getCTColor()
      

      你可以打印出来,你会看到它的结构。

      【讨论】:

        【解决方案4】:

        你会做这样的事情:

        HSSFCell myCell = ...;
        HSSFCellStyle myStyle = workbook.createCellStyle();
        myStyle.setFillBackgroundColor(HSSFColor.BLUE);
        
        myCell.setCellStyle(myStyle);
        

        我相信给定工作簿的样式数量有限;您将希望尽可能重用相同的样式对象。

        [编辑:对不起,那将是在单元格上设置颜色。要获取颜色,请使用如下:

        myCell.getCellStyle().getFillBackgroundColor();
        

        ]

        [编辑2:看craig贴的自定义颜色信息,或许你可以试试:

        HSSFColor.getIndexHash().get(myCell.getCellStyle().getFillBackgroundColor())
        

        ]

        【讨论】:

        • 感谢您到目前为止的分析器,不幸的是它不是一个解决方案,我现在已经重新澄清了这个问题。
        • 在 craig 帖子的帮助下更新了我的答案
        【解决方案5】:

        要在 HEX 中获取特定单元格的背景颜色,请使用以下命令:

        cell.getCellStyle().getFillForegroundColorColor().getARGBHex()
        

        注意Color这个词被使用了两次

        【讨论】:

          【解决方案6】:
          import java.io.File;    
          import java.io.FileInputStream;       
          import java.io.FileNotFoundException;   
          import java.io.FileOutputStream;   
          import java.io.IOException;   
          import java.util.Iterator;    
          import org.apache.poi.hssf.usermodel.HSSFPalette;    
          import org.apache.poi.hssf.usermodel.HSSFSheet;    
          import org.apache.poi.hssf.usermodel.HSSFWorkbook;    
          import org.apache.poi.hssf.util.HSSFColor;    
          import org.apache.poi.ss.usermodel.Cell;    
          import org.apache.poi.ss.usermodel.CellStyle;    
          import org.apache.poi.ss.usermodel.Row;    
          
          /**
           * @author mohdasif_2688@rocketmail.com 
           *
           */
          
          public class ExcelPractice {
          
              /**
               *  Must Read :     
               *  
               *  Code to get the background color from an excel sheet in RGB Format and display on the console    
               *  Save the content of the xls file into another OUTPUT.xls file.    
               *  Using a sample sheet with only first row filled with background color.    
               *  Code uses HSSF which means i am only using xls format.    
               *  Using poi-3.5-FINAL.jar    
               *  Solution with the output provided      
               *  Observation : Some Custom color's are not recognized as they may not be defined    
               *  in the excel color palette thus the code returns the almost similar color code.    
               */
              public static void main(String[] args) {
                  try {
                      FileInputStream fileInputStream=new FileInputStream(new     File("D:\\Excel_File.xls"));
          
                      HSSFWorkbook workbook=new HSSFWorkbook(fileInputStream);
                      HSSFSheet  sheet=workbook.getSheetAt(0);
                      Iterator<Row> rowIterator= sheet.iterator();
                      while (rowIterator.hasNext()) {
                          Row row=rowIterator.next();
          
                          Iterator<Cell> cellIterator=row.cellIterator();
                          while (cellIterator.hasNext()) {
                              Cell cell = (Cell) cellIterator.next();
          
                                  switch (cell.getCellType()) {
                                  case Cell.CELL_TYPE_BOOLEAN:
                                      System.out.println(cell.getBooleanCellValue()+"\t\t");  
                                  System.out.println(cell.getCellStyle().getFillForegroundColor());
                                  break;
                              case Cell.CELL_TYPE_NUMERIC:
                                  System.out.println(cell.getNumericCellValue()+"\t\t");
                                  System.out.println(cell.getCellStyle().getFillForegroundColor());
                                  break;
                              case Cell.CELL_TYPE_STRING:
                                  System.out.println(cell.getStringCellValue()+"\t\t");
                                  //System.out.println(HSSFColor.getIndexHash().get(cell.getCellStyle().getFillBackgroundColor()));   
                                  int num=cell.getColumnIndex();
                                  Cell cell1 = row.getCell(num);
                                  CellStyle cellStyle = cell1.getCellStyle();          
                                  getColorPattern(cellStyle.getFillForegroundColor());
                                  break;
                              default:
                                  break;
                              }
                          }
                          System.out.println();
          
                          fileInputStream.close();
                          FileOutputStream fileOutputStream=new FileOutputStream(new File("D:\\OUTPUT.xls"));
                          workbook.write(fileOutputStream);
                          fileInputStream.close();
                      }
          
          
              } catch (FileNotFoundException e) {
                  // TODO Auto-generated catch block
                  e.toString();
              }
              catch (IOException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
          
          }
          
          //Method to identify the color pattern
          private static short[] getColorPattern(short colorIdx){        
              short[] triplet = null;
              HSSFWorkbook workbook=new HSSFWorkbook();
              HSSFPalette palette = workbook.getCustomPalette();
              HSSFColor color = palette.getColor(colorIdx);
              triplet = color.getTriplet();       
              System.out.println("color : " + triplet[0] +"," + triplet[1] + "," +     triplet[2]);
              return triplet;
          }
          }
          
          /** Output of the above code as executed in my system 
           S.NO.      
          color : 255,255,0
          VTU Number      
          color : 0,128,0
          First Name      
          color : 51,204,204
          Middle Name     
          color : 255,0,0
          Last Name       
          color : 102,102,153
          Branch      
          color : 255,102,0
          E-mail id       
          color : 0,255,0
          Mobile Number       
          color : 255,255,255 
          */
          

          【讨论】:

            【解决方案7】:

            以下内容适用于 XSSF 并且在 Scala 中,但它确实显示了如何从对象模型中获取颜色。我想从实际的 rgb 值实例化一个 java.awt.Color 对象(这很有用,部分原因是当我在断点处停止时,我的调试器会为我显示对象的实际颜色,部分原因是为了导出到具有与 Excel 无关)。我忽略了颜色的 alpha 值,我的 Scala 可能有点幼稚。我建议如果这对您不起作用,您应该设置一个断点并检查密切相关的方法调用的结果,例如 getFillBackgroundColorColor()

                val rgb: Array[Byte] = cell.getCellStyle.getFillForegroundColorColor.getRgb
                def toInt(b: Byte): Int = {
                  if (b<0) 256+b else b
                }
                val rgbInts = rgb.map(toInt)
                val color = new Color(rgbInts(0),rgbInts(1),rgbInts(2))
            

            【讨论】:

              【解决方案8】:

              对于 XSSF 读取 xlsx 文件(也尝试了 HSSF),经过一段时间的努力,我发现getFillBackgroundXSSFColor() 方法实际上在 Excel 的“单元格格式”的“填充”选项卡中返回了“图案颜色”,而不是该选项卡中所谓的“背景”颜色。我不确定这是否符合预期。

              请看我下面的截图。返回的 RGB 实际上是 FF0000 ,即红色的。

                      XSSFColor backgroundColor = cell.getCellStyle().
                          getFillBackgroundXSSFColor();
                  System.out.println("backgroundColor is "+backgroundColor.getARGBHex());
              
                  Output: FFFF0000 //the first FF should be ignored.
              

              所以现在,我没有办法解决这种情况,只是要求用户也填写“图案颜色”。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-02-16
                • 2017-02-01
                相关资源
                最近更新 更多