使用 Openxml 2.0 在 Excel 中获取单元格背景颜色

2023-11-24

我正在尝试获取 Excel 电子表格中单元格的背景颜色。我正在使用 Open XML 2.0 SDK,我可以打开 *.xlsx 文件并获取单元格值。我获取背景颜色的代码如下:

   public BackgroundColor GetCellBackColor(Cell theCell, SpreadsheetDocument document)
    {
        BackgroundColor backGroundColor = null;
        WorkbookStylesPart styles = SpreadsheetReader.GetWorkbookStyles(document);
        int cellStyleIndex = (int)theCell.StyleIndex.Value;
        CellFormat cellFormat = (CellFormat)styles.Stylesheet.CellFormats.ChildElements[cellStyleIndex];
        Fill fill = (Fill)styles.Stylesheet.Fills.ChildElements[(int)cellFormat.FillId.Value];
        backGroundColor = fill.PatternFill.BackgroundColor;

        return backGroundColor;
    }

我的问题是,PatternFill.BackgroundColor仅返回一个自然数,我认为它是样式的 id。我的问题是,代码行

DocumentFormat.OpenXml.Spreadsheet.Color c = (DocumentFormat.OpenXml.Spreadsheet.Color)styles.Stylesheet.Colors.ChildElements[Int32.Parse(backGroundColor.InnerText)];

返回错误,因为Stylesheet.Colors is null... ...也许是因为我在Excel中使用了“内置”颜色-而不是自定义颜色?!

有什么想法可以如何从“backGroundColor-Value”“计算”真实的颜色数?


Excel电子表格中单元格的填充模式是 由两种颜色组成:背景色和前景色。 术语“前景色”在这里有点误导。它不是 字体的颜色,但图案填充的前景色。

例如,如果您用纯色填充单元格的背景 这ForegroundColor相关财产PatternFill细胞的对象 设置为所选的纯色值,而BackgroundColor目的 设置为系统前景色。这PatternType的财产PatternFill对象设置为PatternValues.Solid.

因此,要获取单元格背景(实心填充)的颜色值,您必须分析 这ForegroundColor相关财产PatternFill目的。你必须 确定实例代表的“颜色类型”:

  1. 自动颜色和系统相关颜色
  2. 索引颜色。
  3. ARGB 颜色(阿尔法、红色、绿色和蓝色)
  4. 基于主题的颜色。
  5. 应用于颜色的色调值。

有关不同“颜色类型”的更多信息,请参阅以下内容link.

请注意以下的含义InnerText的财产ForegroundColor and BackgroundColor类别取决于颜色类型。例如,如果是基于主题的颜色InnerText财产 被设置为索引ColorScheme收藏。

以下示例打印电子表格文档中所有单元格的所有背景颜色信息:

public static PatternFill GetCellPatternFill(Cell theCell, SpreadsheetDocument document)
{ 
  WorkbookStylesPart styles = SpreadsheetReader.GetWorkbookStyles(document);

  int cellStyleIndex;
  if (theCell.StyleIndex == null) // I think (from testing) if the StyleIndex is null
  {                               // then this means use cell style index 0.
    cellStyleIndex = 0;           // However I did not found it in the open xml 
  }                               // specification.
  else
  {
    cellStyleIndex = (int)theCell.StyleIndex.Value;
  }      

  CellFormat cellFormat = (CellFormat)styles.Stylesheet.CellFormats.ChildElements[cellStyleIndex];

  Fill fill = (Fill)styles.Stylesheet.Fills.ChildElements[(int)cellFormat.FillId.Value];
  return fill.PatternFill;  
}

private static void PrintColorType(SpreadsheetDocument sd, DocumentFormat.OpenXml.Spreadsheet.ColorType ct)
{
  if (ct.Auto != null)
  {
    Console.Out.WriteLine("System auto color");
  }

  if (ct.Rgb != null)
  {
    Console.Out.WriteLine("RGB value -> {0}", ct.Rgb.Value);
  }

  if (ct.Indexed != null)
  {
    Console.Out.WriteLine("Indexed color -> {0}", ct.Indexed.Value);

    //IndexedColors ic = (IndexedColors)styles.Stylesheet.Colors.IndexedColors.ChildElements[(int)bgc.Indexed.Value];         
  }

  if (ct.Theme != null)
  {
    Console.Out.WriteLine("Theme -> {0}", ct.Theme.Value);

    Color2Type c2t = (Color2Type)sd.WorkbookPart.ThemePart.Theme.ThemeElements.ColorScheme.ChildElements[(int)ct.Theme.Value];

    Console.Out.WriteLine("RGB color model hex -> {0}", c2t.RgbColorModelHex.Val);
  }

  if (ct.Tint != null)
  {
    Console.Out.WriteLine("Tint value -> {0}", ct.Tint.Value);
  }
}

static void ReadAllBackgroundColors()
{
  using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open("c:\\temp\\bgcolor.xlsx", false))
  {
    WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
    foreach(WorksheetPart worksheetPart in workbookPart.WorksheetParts)
    {
      SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();

      foreach (Row r in sheetData.Elements<Row>())
      {
        foreach (Cell c in r.Elements<Cell>())
        {            
          Console.Out.WriteLine("----------------");
          PatternFill pf = GetCellPatternFill(c, spreadsheetDocument);        

          Console.Out.WriteLine("Pattern fill type -> {0}", pf.PatternType.Value);

          if (pf.PatternType == PatternValues.None)
          {
            Console.Out.WriteLine("No fill color specified");
            continue;
          }

          Console.Out.WriteLine("Summary foreground color:");
          PrintColorType(spreadsheetDocument, pf.ForegroundColor);
          Console.Out.WriteLine("Summary background color:");
          PrintColorType(spreadsheetDocument, pf.BackgroundColor);                          
        }
      }     
    }
  }
}

static void Main(string[] args)
{ 
  ReadAllBackgroundColors();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Openxml 2.0 在 Excel 中获取单元格背景颜色 的相关文章

  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器

随机推荐

  • SAS proc导出到CSV:如何添加双引号

    刚接触这个 所以很抱歉 我有一个 SAS 文件 需要将其导出为 CSV 并且需要向所有字段添加双引号 我怎样才能做到这一点 提前致谢 从 SAS 创建 CSV 文件的方法有多种 使用proc export不会将每个字段都用双引号括起来 因此
  • 如何在 ruby​​ 中从外部访问类变量?

    我正在尝试从类外部的方法访问类变量 这是我的课 class Book bookCount 0 allBooks def self allBooks allBooks end def self bookCount bookCount end
  • 如何休眠线程直到收到异步函数的回调?

    我有一个函数 仅当从异步函数接收到回调时才需要执行 Like 我调用异步函数Stop 不久之后我调用异步函数Start 收到 Stop CallBack 之前的问题Start 被调用 因此我遇到了问题 我也无法分开调用两个函数 就像我不能这
  • 学习 HTML 语义的最佳网站是什么? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我应该在哪里指导别人学习 HTML CSS 基础知识 我个人是从HTML 好东西回到过去 虽然我感谢肯 伯恩斯让我继续前进 但我现在不愿意派人去那个网站 因为我认为它已经过时了 显然 有很
  • Emacs 在 python 模式下禁用自动完成

    我正在使用 Emacs 24 并且想在 python 模式下禁用自动完成模式 这样它就不会与 jedi 冲突 我该如何去做这个 遗憾的是我不知道 Emacs Lisp 以下是我当前在 init el 中有关自动完成的设置 auto comp
  • jsp中的数字格式

    如何格式化 int 值123456789 as 123 456 789 使用 JSTL fmt formatNumber http download oracle com docs cd E17802 01 products product
  • ColdFusion 的 DecimalFormat() 函数中这是怎么回事?我怎样才能得到正确的结果?

  • d3 将 csv 文件导入数组[重复]

    这个问题在这里已经有答案了 我正在尝试使用 d3 csv 方法导入 csv 文件 这是我的代码 d3 csv data csv function data console log data 我认为我会得到一个包含对象的数组 每个对象代表 c
  • Java中String的内存使用

    我有一个 Java 对象 其中包含一个字符串 我很好奇字符串的内存使用情况是如何工作的 我正在尝试优化程序的内存使用情况 应用程序将有大约 10000 个这样的对象 对于诸如 Hello World 之类的字符串 内存使用量是多少 Java
  • 如何在word中使用VBA(宏)使用/启用(RegExp对象)正则表达式

    我做了很多谷歌搜索以获得关于如何在 VBA 中使用或开始使用正则表达式的正确答案 终于明白了 所以我想和大家分享我的知识 如果我错了 请纠正我 默认情况下 Word 2007 中禁用正则表达式选项 要启用该选项 请执行以下步骤 1 Go t
  • 在 Python 方法中使用 self 作为临时变量有什么区别吗?

    有时我需要在方法定义中使用不在方法外部使用的临时变量 使用之间的行为有什么区别吗self MyVariable and MyVariable在下面的类定义中 哪种方法更好 为什么 示例1 self MyVariable class MyCl
  • Pycharm不显示绘图

    Pycharm 不显示以下代码的绘图 import pandas as pd import numpy as np import matplotlib as plt ts pd Series np random randn 1000 ind
  • Python-查找内存中的当前对象

    有没有办法找到当前内存中的对象 包括它们的名称 它们所在的位置和模块名称等 任务管理器中 main 方法之前的进程 Python exe 的内存占用为 15MB main方法完成第一次迭代后 进程Python exe内存大小为250MB 我
  • node.nextSibling 和 ChildNode.nextElementSibling 之间有什么区别?

    div Here is div 01 div div Here is div 02 div 它们不是同一件事吗 两者都返回紧随其后的节点 我读了很多文章 但在我看来都喜欢同样的东西 但不知道在哪里使用其中一个与另一个 nextElement
  • Bootstrap 方法返回 null - Android 在启动时立即崩溃

    React Native 和 React native navigation 的新手 应用程序在 iOS 上运行正常 但在启动时很快抛出以下异常 E AndroidRuntime FATAL EXCEPTION main Process c
  • Apache 反向代理到节点 - 连接被拒绝:AH00957

    我正在尝试让一个全新的基于云的服务器与默认版本的 20 04 服务器 ubuntu 一起使用 apache 和节点 节点服务器似乎正在运行 没有报告 4006 端口已打开的问题 但我相信我的 apache 配置不是 该请求将挂起很长一段时间
  • Flash Builder 中的输出文件名

    我是第一次尝试 Flash Builder 但我陷入了一个简单的任务 如何更改输出文件名 默认情况下 Flash Builder 为 SWF 提供与入口点类相同的名称 但我找不到任何地方可以更改它 Anybody 只需在编译和构建时更改主应
  • 在 Java 线程中模拟竞争条件的代码

    我是 Java 多线程新手 我正在学习竞争条件的概念 基于Oracle文档 http docs oracle com javase tutorial essential concurrency interfere html 我创建了一个示例
  • 使用 mapstruct 将 null 设置为 target

    我正在使用 mapstruct 我想知道是否有任何方法可以为某些目标属性设置 null 值 例如 public class MySource private String prop1 private String prop2 public
  • 使用 Openxml 2.0 在 Excel 中获取单元格背景颜色

    我正在尝试获取 Excel 电子表格中单元格的背景颜色 我正在使用 Open XML 2 0 SDK 我可以打开 xlsx 文件并获取单元格值 我获取背景颜色的代码如下 public BackgroundColor GetCellBackC