利用OpenXML获取Excel单元格背景色

最近项目上遇到了关于Excel获取处理的问题,关于Excel单元格背景色的获取,水的文章都大同小异,都没注意到Excel单元格背景色是怎么赋值,这会导致出现有些背景色无法获取的情况。(PS:其实应该叫做前景色)

关于这点我们可以先来看一下,一个Excel文档的内部有关背景色样式代码。

Excel背景色样式解析

  • 这是一个样例Excel,我们给它赋上了一些背景色样式,如下图所示。

  • 但是在Excel的style.xml文件中,这些颜色的表现形式不尽相同。


-<fill> <patternFill patternType="none"/> </fill> -<fill> <patternFill patternType="gray125"/> </fill>

这两种为excel自带的默认填充样式

  • 因此我们可以发现,前三种背景色,Excel中是直接赋予了RGB的色值。然而最后一种颜色却是使用了theme(主题色)和tint(插值)来表示。

    通过以上分析,我们可以得出Excel单元格背景色的两种表现方式:rgbtheme + tint。(PS:关于有的颜色为什么可以直接用rgb,有的颜色用theme加tint的方式表示,本人在微软官方下面提问了,但是没人鸟窝。)

代码实现

  • OK分析完了,上代码。
public string GetCellBackgroundColor(WorkbookPart workbookPart, Cell cell)
{
if (cell == null || cell.StyleIndex == null) return null;
CellFormat cellFormat = (CellFormat)workbookPart.WorkbookStylesPart.Stylesheet.CellFormats.ElementAt((int)cell.StyleIndex.Value);
Fill fill = (Fill)workbookPart.WorkbookStylesPart.Stylesheet.Fills.ElementAt((int)cellFormat.FillId.Value);
PatternFill patternFill = (PatternFill)fill.PatternFill;
ThemePart themePart = workbookPart.ThemePart;
Theme theme = themePart?.Theme;
if (patternFill != null && patternFill.PatternType != null && patternFill.PatternType.Value == PatternValues.Solid)
{
if (patternFill.ForegroundColor != null)
{
if (patternFill.ForegroundColor.Rgb != null)
{
return "#" + patternFill.ForegroundColor.Rgb.Value;
}
else if (patternFill.ForegroundColor.Theme != null)
{
// 主题色获取
string originalColor = ((Color2Type)theme.ThemeElements.ColorScheme.ElementAt((int)patternFill.ForegroundColor.Theme.Value)).RgbColorModelHex.Val;
if (patternFill.ForegroundColor.Tint != null)
{
// 颜色计算
return CalculateTintedColor(originalColor, patternFill.ForegroundColor.Tint);
}
else
{
return "#" + originalColor;
}
}
}
}
return null;
} ublic static string CalculateTintedColor(string originalColor, double tint)
{
// RGB转换
int red = Convert.ToInt32(originalColor.Substring(0, 2), 16);
int green = Convert.ToInt32(originalColor.Substring(2, 2), 16);
int blue = Convert.ToInt32(originalColor.Substring(4, 2), 16);
int interpolatedRed = 0;
int interpolatedGreen = 0;
int interpolatedBlue = 0;
// 基于tint正负值的颜色计算
if (tint > 0)
{
// 白色
int white = 255;
// 插值计算
interpolatedRed = (int)Math.Round(red * (1 - tint) + white * tint);
interpolatedGreen = (int)Math.Round(green * (1 - tint) + white * tint);
interpolatedBlue = (int)Math.Round(blue * (1 - tint) + white * tint);
}
else
{
// 黑色
int black = 0;
// 插值计算
interpolatedRed = (int)Math.Round(red * (1 + tint));
interpolatedGreen = (int)Math.Round(green * (1 + tint));
interpolatedBlue = (int)Math.Round(blue * (1 + tint));
// 防止出现计算结果小于0的情况
interpolatedRed = Math.Max(interpolatedRed, black);
interpolatedGreen = Math.Max(interpolatedGreen, black);
interpolatedBlue = Math.Max(interpolatedBlue, black);
}
// 计算结束后转化为16进制颜色
string interpolatedColor = $"#{interpolatedRed:X2}{interpolatedGreen:X2}{interpolatedBlue:X2}";
return interpolatedColor;
}

分享结束,如果这个分享对您有所帮助的话,请点个赞吧!

利用OpenXML获取Excel单元格背景色的更多相关文章

  1. POI获取excel单元格红色字体,淡蓝色前景色的内容

    如果是Microsoft Excel 97-2003 工作表 (.xls) if(31 == cell.getCellStyle().getFillForegroundColor()) //判断单元格 ...

  2. c#怎样获取excel单元格的RGB颜色

    这段时间一直在做office的工作.前2天获取单元格的颜色的问题一直没搞明确. 開始我想用的就是Npoi.主要前一部分的工作都是用Npoi完毕的 row.GetCell(j).CellStyle.Fi ...

  3. POI 设置Excel单元格背景色(setFillForegroundColor)

    背景介绍:使用Java开发信息系统项目,项目中往往会涉及到报表管理部分,而Excel表格首当其冲称为最合适的选择,但是对单元格操作时对于设置单元格的背景颜色却很少提及,本文旨在方便单元格背景颜色设计. ...

  4. 以字符串形式获取excel单元格中的内容

    public static String getCellValue(XSSFCell cell) { if (cell == null) { return ""; } switch ...

  5. 【Excel】Excel根据单元格背景色求和

    例:用公式计算单元格背景色为浅蓝色的数字之和    步骤一: Office 2003 Insert->Name->Define,Names in workbook输入getColor或ge ...

  6. NPOI之Excel——设置单元格背景色

    NPOI Excel 单元格颜色对照表,在引用了 NPOI.dll 后可通过 ICellStyle 接口的 FillForegroundColor 属性实现 Excel 单元格的背景色设置,FillP ...

  7. excel小技巧-用于测试用例的编号栏:“获取当前单元格的上一格的值+1”=INDIRECT(ADDRESS(ROW()-1,COLUMN()))+1

    编写用例的时候使用,经常修改用例的时候会需要增加.删除.修改条目,如果用下拉更新数值的方式会很麻烦. 1.使用ctrl下拉,增删移动用例的时候,需要每次都去拉,万一列表比较长,会很麻烦 2.使用ROW ...

  8. NPOI设置Excel单元格字体、边框、对齐、背景色

    代码: ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; ce ...

  9. C# 对Excel 单元格格式, 及行高、 列宽、 单元格边框线、 冻结设置

    一.对行高,列宽.单元格边框等的设置 这篇简短的文字对单元格的操作总结的比较全面,特此转载过来. private _Workbook _workBook = null; private Workshe ...

  10. 利用POI获取Excel中图片和图片位置

    利用POI获取Excel中图片和图片位置(支持excel2003or2007多sheet) 转自:http://blog.csdn.net/delongcpp/article/details/8833 ...

随机推荐

  1. PostgreSQL 12 文档: 前言

    前言 目录 1. 何为PostgreSQL? 2. PostgreSQL简史 2.1. 伯克利的POSTGRES项目 2.2. Postgres95 2.3. PostgreSQL 3. 约定 4. ...

  2. 【C#/.NET】探究Task中ConfigureAwait方法

    ​  目录 引言 ConfigureAwait方法的作用和原理 ConfigureAwait方法的使用场景 非UI线程场景 避免上下文切换 避免死锁 ConfigureAwait方法的注意事项 在UI ...

  3. TCP/IP协议发明人G-Cerf

    如果你是一个IT人,你可以不知道Vinton G. Cerf博士,但你不可能不知道TCP/IP; 如果你不是一个IT人,你可以不知道TCP/IP,但你不可能不知道互联网; 如果从1973年起,Vint ...

  4. 即构发布 LCEP 产品「RoomKit」 ,实现房间内0代码接入

    2021年2月5日,即构科技正式发布全新形态「低代码互动平台」(Low-code Engagement Platform,简称LCEP)产品「RoomKit」. RoomKit定位为低代码互动平台(L ...

  5. Unity UGUI的CanvasScaler(画布缩放器)组件的介绍及使用

    Unity UGUI的CanvasScaler(画布缩放器)组件的介绍及使用 1. 什么是CanvasScaler组件? CanvasScaler是Unity中UGUI系统中的一个组件,用于控制画布的 ...

  6. 树形DP + 换根DP

    树形DP--基础 P1352 没有上司的舞会 设 \(f[i][0/1]\) 表示第 \(i\) 个人不去或者去. 如果第 \(i\) 个人没去,那么下属可去可不去,所以 \(f[i][0] = \s ...

  7. javascript报错: TypeError: (0 , _api_music.default) is not a function

    报错截图 错误原因 从其他文件引入变量时,未添加花括号 错误写法 解决方案 效果图 至此问题解决

  8. 整理不错的opencv博客

    https://me.csdn.net/column/u013095718 更全的博客: https://blog.csdn.net/zhmxy555/column/info/opencv-tutor ...

  9. 内网渗透大杀器fscan

    fscan简介 一款内网综合扫描工具,方便一键自动化.全方位漏扫扫描.支持主机存活探测.端口扫描.常见服务的爆破.ms17010.redis批量写公钥.计划任务反弹shell.读取win网卡信息.we ...

  10. nodejs中事件循环机制与面试题详解

    nodejs中架构如下图所示,通过v8引擎来执行js代码,通过中间层 libuv 来读写文件系统.网络等做一些操作.     nodejs中提供阻塞和非阻塞的调用方式,比如fs模块中读取文件,可以根据 ...