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

这篇具有很好参考价值的文章主要介绍了利用OpenXML获取Excel单元格背景色。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

最近项目上遇到了关于Excel获取处理的问题,关于Excel单元格背景色的获取,水的文章都大同小异,都没注意到Excel单元格背景色是怎么赋值,这会导致出现有些背景色无法获取的情况。(PS:其实应该叫做前景色)
关于这点我们可以先来看一下,一个Excel文档的内部有关背景色样式代码。

Excel背景色样式解析

  • 这是一个样例Excel,我们给它赋上了一些背景色样式,如下图所示。
    利用OpenXML获取Excel单元格背景色
  • 但是在Excel的style.xml文件中,这些颜色的表现形式不尽相同。
    利用OpenXML获取Excel单元格背景色

-<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;
}

public 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;
}

分享结束,如果这个分享对您有所帮助的话,请点个赞吧!文章来源地址https://www.toymoban.com/news/detail-711481.html

到了这里,关于利用OpenXML获取Excel单元格背景色的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java poi导出excel单元格设置自定义背景颜色(任意颜色)

    一、思考过程(看代码的移步第二点) 现有方法 现有资料多为使用 IndexedColors 设置颜色, 但是IndexedColors能设置的颜色有限 ,而需求中所要颜色都是花里胡哨的,需要真正的自定义; 而颜色的本质是rgb ,所以只要我们能自己设置rgb的值就能获取任意想要的颜色了; 源码分

    2023年04月10日
    浏览(42)
  • vue导入导出excel、设置单元格背景色、文字居中、合并单元格、设置列宽(使用xlsx库和xlsx-style库)

    xlsx 是由 SheetJS 开发的一个处理excel文件的npm库 适用于前端开发者实现导入导出excel文件的经典需求 为了区别于xlsx文件,突出其应用语言,该库通常又被称为 js-xlsx 需要以下步骤: 安装 xlsx 库 你可以使用 npm 包管理器安装 xlsx 库,也可以将 xlsx 下载到本地,然后在 HTML 文件中

    2024年02月16日
    浏览(47)
  • openxml获取sheet所有的数据二维数组

    此代码假定您已经安装了OpenXML SDK,并且您有一个.xlsx文件的路径。nn请注意,续写的代码将获取指定工作表中的所有数据,包括空单元格,并将它们存储在一个二维数组中。如果工作表中有多个行和列,数组的大小将与工作表中的行数和列数相匹配。nn```csharpnusing Documen

    2024年01月17日
    浏览(31)
  • 获取excel中的图片(包含wps中嵌入单元格图片)

    项目中有excel导入功能,并且需要导入excel中的图片;模板如图: 已知office中插入的图片为浮动形式;如图: wps中可以插入浮动图片,也可以插入嵌入单元格图片;如图: 并且在wps嵌入单元格形式的图片可以看到使用的是公式;如图:  问题来了,如何获取图片  并且将图片与单元格进行对

    2024年02月12日
    浏览(36)
  • java poi 获取excel中的图片(包含wps中嵌入单元格图片)

    项目中有excel导入功能,并且需要导入excel中的图片;模板如图: 已知office中插入的图片为浮动形式;如图: wps中可以插入浮动图片,也可以插入嵌入单元格图片;如图: 并且在wps嵌入单元格形式的图片可以看到使用的是公式;如图:  问题来了,如何获取图片  并且将图片与单元格进行对

    2024年02月07日
    浏览(53)
  • wps js宏获取工作簿、工作表、单元格的值、链接转图片、单元格区域数据转二维数组、保存工作簿的常用Excel操作

             首先说明js宏的全称是JavaScript for WPS,JavaScript语言可以简称js,通过名称知道js宏的本质是用JS语言调用WPS提供的Application对象模型,要求必须有js基础,跳过js直接学js宏会走很多弯路!!!         本篇介绍js操作Excel对象模型的常用方法,助你从vba转战js,这

    2024年02月12日
    浏览(55)
  • 开源在线excel展示插件 js excel 在线插件 合并单元格 设置单元格样式 编辑工具

     源码:https://github.com/yufb12/dataexcel.git 在线预览地地址 http://www.dataexcel.cn/dataexceljs.html 1、js 版本 es6  2、绘图引擎 zrender 地址  ZRender 文档 (ecomfe.github.io)  3、 文件保存格式json  4、创建并初始化  5、文件 新建保存

    2024年02月17日
    浏览(50)
  • excel单元格多行文本的excel 提取 公式

    第一行: =TRIM(MID(SUBSTITUTE(A$1,CHAR(10),REPT(\\\" \\\",160)),ROW(A1)*160-159,160)) 第9行: =TRIM(MID(SUBSTITUTE(A$1,CHAR(10),REPT(\\\" \\\",160)),ROW(A9)*160-159,160)) Excel如何提取某一单元格的多行内容中的某一行。? - 知乎

    2024年02月07日
    浏览(36)
  • elementui中table表格单元格背景、文字颜色修改(包含鼠标移入移出)

    一、改变背景颜色 1、在el-table表头中添加属性::cell-style=“addClass” (设置表头背景颜色:header-cell-style=“{ background: ‘#999999’, color: ‘#000’ }”) 2、data模拟假数据: 3、在methods中: 二、鼠标移入改变背景、文字颜色 1、在el-table表头中添加属性:@cell-mouse-enter=“cellMouseEn

    2024年02月03日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包