java - 如何获取单元格字体颜色
问题描述
我正在准备验证 Excel 工作表内容的代码。某些条件下的某些字段用红色字体填充,因此我需要此信息以进行验证。
我试过了cell.getCellStyle().getFontIndex()
。我看到对于用黑色填充的字段,它返回 1 值,对于用红色填充的字段,它返回 3,但是当我尝试时workbook.getFontAt(1).getColor()
,在这两种情况下我都收到 0。
解决方案
Font.getColor
返回索引颜色的索引。这可以使用旧的二进制 Excel 文件格式*.xls
( HSSF
),因为所有颜色只能从调色板中获取。但新的 Office Open XML 文件格式*.xlsx
( XSSF
) 还提供直接存储为RGB
而非来自调色板的颜色。那些颜色将没有索引。所以Font.getColor
返回0
。
我发现最兼容的方法是从索引中获取 aorg.apache.poi.ss.usermodel.Color
而Font
不是索引。不幸的是,这只能在HSSF
和中使用不同的方式来实现XSSF
。所以我们需要区分HSSFFont
和XSSFFont
。然后我们可以得到HSSFColor
或XSSFColor
。
完整的示例显示了HSSF
和XSSF
:
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);
}
}
}
推荐阅读
- c# - SignalR 替代方案,浏览器/Win32 兼容
- git - Git错误更新被拒绝,因为您当前分支的尖端落后
- node.js - ParcelJS v2 少错误:未启用内联 JavaScript。它在您的选项中设置吗?
- github-pages - 是否可以从子文件夹 HTML 文件创建 GitHub 页面?
- node.js - 我如何在子文档数组节点猫鼬中推送多个对象
- r - 我在 R 中安装 pysch 包时遇到问题
- reactjs - React 上的 setState 仅在第二次以上迭代时设置我的状态
- reactjs - 为什么这个png被推到左边?
- javascript - 如何使用 html 格式化 javascript 代码以进行计数?
- unity3d - (统一)显示加入的房间名称?光子双关语