繁体   English   中英

如何获取给定单元格的(Java Apache POI HSSF)背景颜色?

[英]How do I get the (Java Apache POI HSSF) Background Color for a given cell?

我有一个现有的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对象。 谢谢你到目前为止的答案。

HSSFCell类提供了静态颜色类,如下所示:

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

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

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

获取颜色: getFillBackgroundColor返回的short值是颜色的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);

问候

纪尧姆

XSSFCellStyle的backgroundcolor信息可以从以下方法获得:

XSSFCellStyle.getFillForegroundXSSFColor().getCTColor()

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

你会做的事情如下:

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

myCell.setCellStyle(myStyle);

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

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

myCell.getCellStyle().getFillBackgroundColor();

]

[编辑2:查看发布的自定义颜色信息craig,也许您可​​以尝试:

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

]

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 
*/

从Excel_File.xls文件截取的屏幕截图

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

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

注意单词Color使用了两次

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

    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))

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

请参阅下面的截图。 返回的RGB实际上是FF0000,即RED。

        XSSFColor backgroundColor = cell.getCellStyle().
            getFillBackgroundXSSFColor();
    System.out.println("backgroundColor is "+backgroundColor.getARGBHex());

    Output: FFFF0000 //the first FF should be ignored.

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

在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM