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

发布于 2024-08-06 10:53:24 字数 693 浏览 4 评论 0原文

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

I have an existing excel spreadsheet, which I am accesssing and reading values from, I am using Apache POI HSSF.

It is initialised like this:

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

I am iterating over all the cells that exist in the sheet, which makes a cell object:

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

Please can someone familiar with the framework explain how to create an (HSSFColor) object to represent the backround color of each cell in the sheet.

Many thanks

EDIT, UPDATE

To be clear what I want to know is: how do I create/get an HSSFColor object for the background color of an existing cell?

cell.getCellStyle().getFillBackgroundColor(); 

This code only returns a short number, not an HSSFColor object.
Thanks for the answers so far.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

屋檐 2024-08-13 10:53:24

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

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

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

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

There are static color classes provided by the HSSFCell class, listed here:

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

If you want to create your own custom colors, you will need to create and modify a custom palette. Apache provides a very clear guide to this as well:

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

洋洋洒洒 2024-08-13 10:53:24

获取颜色:
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);

问候

纪尧姆

To get the color :
The short value returned by the getFillBackgroundColor is the Excel index of the color.
You can get the color corresponding to the index in the HSSFColor HashTable, using the last code RMorrisey indicated.

To set a color :
You create a custom palette, and change the color at a given index. Then, you apply the color to the style.

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

Regards

Guillaume

瞄了个咪的 2024-08-13 10:53:24

XSSFCellStyle的backgroundcolor信息可以从该方法中获取:

XSSFCellStyle.getFillForegroundXSSFColor().getCTColor()

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

The backgroundcolor information of XSSFCellStyle can get from the method:

XSSFCellStyle.getFillForegroundXSSFColor().getCTColor()

You can print it out and you will see it's structure.

紫瑟鸿黎 2024-08-13 10:53:24

您会这​​样做:

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

myCell.setCellStyle(myStyle);

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

[编辑:抱歉,这将是设置单元格的颜色。要获取颜色,请使用类似:

myCell.getCellStyle().getFillBackgroundColor();

]

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

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

]

You would do something like:

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

myCell.setCellStyle(myStyle);

I believe there is a limited number of styles for a given workbook; you will want to reuse the same style object where possible.

[Edit: Sorry, that would be to set the color on a cell. To get the color, use like:

myCell.getCellStyle().getFillBackgroundColor();

]

[Edit 2: Looking at the custom color information craig posted, maybe you can try:

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

]

你在我安 2024-08-13 10:53:24

要获取十六进制中特定单元格的背景颜色,请使用以下命令:

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

注意单词 Color 使用了两次

To get the background color of the specific cell in HEX, use this:

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

Notice the word Color is used twice

风和你 2024-08-13 10:53:24
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 [email protected] 
 *
 */

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 文件的屏幕截图

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 [email protected] 
 *
 */

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

Screen shot from the Excel_File.xls file

萤火眠眠 2024-08-13 10:53:24

以下内容适用于 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))

The following is for XSSF and is in Scala but it does show exactly how to get the colour from the object model. I wanted to instantiate a java.awt.Color object from the actual rgb values (which is useful partly because my debugger displays for me the actual colour of the object when I stop at breakpoints, and partly because this is for export to systems that have nothing to do with Excel). I'm ignoring the colour's alpha value and my Scala may be a bit naive. I'd suggest that if this doesn't work for you, you should set a break-point and examine the result of closely related method calls such as 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))
佼人 2024-08-13 10:53:24

对于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.

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

输入图片此处描述

For XSSF reading xlsx file (tried the HSSF as well) ,after struggle for a while, i just found getFillBackgroundXSSFColor() method actually returned the "Pattern Color" in the Fill tab of "Format Cells" in Excel, not the so-called "Background" color in that tab. I am not sure if this expected.

See my below screenshot. The returned RGB is actually FF0000 ,i.e. RED.

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

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

So right now, I do not have a way for this case and just request user to fill the "Pattern Color" as well.

enter image description here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文