如何在Open xml中使用样式索引?

12

请问有人能够解释一下OpenXml中的样式索引是如何工作的吗?我有一个业务需求需要在Excel表格中将某些单元格的背景颜色设为不同的颜色。但是其他单元格已经应用了某些样式,因此我需要决定要应用哪种样式索引。

1个回答

26
OpenXML样式在第一次看时可能会让人感到困惑。Excel文档的样式属于“SpreadsheetML”标记语言,与Word和PowerPoint不同。
对于Excel中的典型单元格,唯一需要的样式信息是StyleIndex(正如您所指出的)。
Cell cell16 = new Cell(){ CellReference = "HU1", StyleIndex = (UInt32Value)1U, DataType = CellValues.SharedString };

这对应于XML中的s属性:
      <x:c r="HU1" s="1" t="s">
        <x:v>0</x:v>
      </x:c>

StyleIndex 是样式表部分中 CellFormat 记录的从零开始的索引。

样式表部分(也称工作簿的样式表)包含以下几个部分:

  • 编号格式
  • 字体
  • 填充
  • 边框
  • 单元格样式格式
  • 单元格格式<== cell styleindex是指其中之一
  • 单元格样式
  • 差异格式
  • 表样式
  • 颜色
  • 样式表扩展列表

现在,在CellFormat记录中,有引用返回到样式表中每个部分的如下引用:

  1. 编号格式(第一个符号)
  2. 字体(第二个项目上述)
  3. 填充(第三个项目上述)
  4. 边框(第四个项目上述)

代码中的示例单元格格式如下:

// this line is important to your question
CellFormat cellFormat5 = new CellFormat(){ NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)11U, 
//the rest of the CellFormat definition is not so important to your question
FormatId = (UInt32Value)0U, ApplyFill = true, ApplyBorder = true, ApplyAlignment = true };

回答您的问题:

将某些单元格应用特定的背景颜色。

例如,我们想要更新您电子表格中的单元格B3,并且B3已经具有StyleIndex10

您需要按照以下步骤进行操作:

第一步。如果这是电子表格中的新背景颜色,请将该背景(也称为Fill)添加到包含新颜色的样式表(上面的第三个项目)的Fills部分。如果颜色已经存在,则需要找到并记住该颜色对应的现有Fill的索引。无论哪种方式,对于此示例,假设您需要的Fill索引为25

第二步。创建一个新的CellFormat,它是索引为10CellFormat的副本。您将把此新的CellFormat添加到CellFormat部分的末尾。假设新的CellFormat的索引将为53

步骤 3:您需要更新索引为 53 的 CellFormat 并将其 Fill 索引属性设置为来自步骤 1 的 25
最后一步:更新问题单元格 B3,使其具有新的 StyleIndex53
注意:此答案适用于 Excel 中非表格单元格的样式设置。如果您需要表格单元格的样式信息,请回复本消息,我将尝试更新或添加一个相应的答案。
这个答案主要基于我的经验,并参考了 Wouter van Vugt 的免费电子书《Open XML - The markup explained》第 73-79 页的解释。这是使用 OpenXml 的好参考资料。

非常感谢,确实很有帮助。 - Raxit J Prajapati
1
@Taterhead,好的,请更新答案并包括一种处理表格数据的方法。谢谢! - Abhi7950
@Abhi7950 -最好您在该网站上提出一个单独的问题,陈述您具体的问题。我和其他人会帮助您快速解决。请在您的帖子中引用此问题,并在下面的评论回复中放置一个指向该问题的链接。 - Taterhead
CellFormat or CellFormats ? I have sample document, which is used two CellFormats and the first one has one CellFormat and the other, three CellFormats inside of it. You wrote CellFormat but then point to > Cell Formats <== cell styleindex is referring to one of these - Hassan Faghihi
CellFormats 是一个 CellFormat xml 实体的集合。因为在你的示例文档中有两个,这可能意味着你的工作簿有多个样式表。 - Taterhead

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接