首页 > 解决方案 > 如何获取单元格字体颜色

问题描述

我正在准备验证 Excel 工作表内容的代码。某些条件下的某些字段用红色字体填充,因此我需要此信息以进行验证。

我试过了cell.getCellStyle().getFontIndex()。我看到对于用黑色填充的字段,它返回 1 值,对于用红色填充的字段,它返回 3,但是当我尝试时workbook.getFontAt(1).getColor(),在这两种情况下我都收到 0。

标签: javaapache-poi

解决方案


Font.getColor返回索引颜色的索引。这可以使用旧的二进制 Excel 文件格式*.xls( HSSF),因为所有颜色只能从调色板中获取。但新的 Office Open XML 文件格式*.xlsx( XSSF) 还提供直接存储为RGB而非来自调色板的颜色。那些颜色将没有索引。所以Font.getColor返回0

我发现最兼容的方法是从索引中获取 aorg.apache.poi.ss.usermodel.ColorFont不是索引。不幸的是,这只能在HSSF和中使用不同的方式来实现XSSF。所以我们需要区分HSSFFontXSSFFont。然后我们可以得到HSSFColorXSSFColor

完整的示例显示了HSSFXSSF

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.xssf.usermodel.*;

public class ExcelGetFontColor {
    
 //method to get current font from cell
 //gets only font of whole cell not font of possible rich text content
 private static Font getFont(Cell cell) {
  Workbook workbook = cell.getSheet().getWorkbook();
  CellStyle style = cell.getCellStyle();
  return workbook.getFontAt(style.getFontIndex());
 }

 private static Color getFontColor(Font font, Workbook workbook) {
  Color color = null;
  if (font instanceof XSSFFont) {
   XSSFFont xssfFont = (XSSFFont) font;
   color = xssfFont.getXSSFColor();
  } else if (font instanceof HSSFFont) {
   HSSFFont hssfFont = (HSSFFont) font;
   color = hssfFont.getHSSFColor((HSSFWorkbook)workbook);
  }
  return color;
 }
 
 private static String getHexString(Color color) {
  String result = null;
  if (color instanceof XSSFColor) {
   byte[] rgb = ((XSSFColor)color).getRGB();
   result = toHexString(rgb); 
  } else if (color instanceof HSSFColor) {
   short[] triplet = ((HSSFColor)color).getTriplet();
   result = toHexString(triplet);
  }
  return result;
 }

 private static String toHexString(Object arrayOfNumbers) {
  String hex = "";
  if (arrayOfNumbers instanceof byte[]) {
   for (byte b : (byte[])arrayOfNumbers) {
    hex += String.format("%02X", b);
   }
  } else if (arrayOfNumbers instanceof short[]){
   for (short s : (short[])arrayOfNumbers) {
    hex += String.format("%02X", s);
   }      
  }
  return hex;
 }
    
 public static void main(String[] args) throws Exception {

  String inFilePath = "./ExcelExampleIn.xlsx"; String outFilePath = "./ExcelExampleOut.xlsx";
  //String inFilePath = "./ExcelExampleIn.xls"; String outFilePath = "./ExcelExampleOut.xls";
  
  try (Workbook workbook = WorkbookFactory.create(new FileInputStream(inFilePath));
       FileOutputStream out = new FileOutputStream(outFilePath ) ) {

   for (Sheet sheet : workbook) {
    for (Row row : sheet) {
     for (Cell cell : row) {
      System.out.print("Cell: " + cell.getAddress());
      Font font = getFont(cell);
      //System.out.print(", Font:" + font);
      System.out.print(", Font:" + font.getFontName());
      System.out.print(", FontColorIndex: " + font.getColor());
      Color color = getFontColor(font, workbook);    
      //System.out.print(", FontColor: " + color);
      System.out.println(", FontColorHEX: " + getHexString(color));
     }
    }
   }
   
   workbook.write(out);
  }
 }
}

推荐阅读