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

时间:2017-06-30 05:57:24

标签: c# openxml-sdk spreadsheetml

任何人都可以解释一下OpenXml中的样式索引是如何工作的吗? 我有业务需求,我需要将背景颜色应用于Excel工作表中的某些单元格。并且某些样式已经应用于其他单元格。所以我需要决定我需要应用哪种风格的索引。

1 个答案:

答案 0 :(得分:12)

首次查看时,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记录的从零开始的索引。

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

  • 编号格式
  • 字体
  • 填充
  • 边界
  • 单元样式格式
  • 单元格格式&lt; ==单元格样式索引指的是其中一种
  • 细胞样式
  • 差异格式
  • 表格样式
  • 颜色
  • 样式表扩展名列表

现在在CellFormat记录中,有一些引用会引用回样式表中的以下每个部分:

  1. 编号格式(上面的第一个项目符号)
  2. 字体(上面的第二个子弹)
  3. 填写(上面的第三个子弹)
  4. 边境(上面的第四个子弹)
  5. 代码中的示例单元格格式如下:

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

    要回答您的问题:将某种背景颜色应用于某些细胞。假设我们要更新电子表格的单元格B3B3StyleIndex10

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

    步骤1.如果这是电子表格的新背景颜色,请将背景(又名Fill)添加到包含新颜色的样式表(上面的第三个项目符号)的Fills部分。如果颜色已存在,则需要查找并记住该颜色的现有Fill的索引。不管怎样,对于这个例子,我们可以说你需要的Fill索引是25

    步骤2.创建一个新的CellFormat,它是索引CellFormat的{​​{1}}的副本。您会将此新10添加到CellFormat部分的末尾。可以说新CellFormat的索引将为CellFormat

    步骤3.更新索引53的{​​{1}}并使其CellFormat索引属性为53(从步骤1开始)。

    最后一步:更新有问题的单元格Fill,以获得25的新B3

    注意:此答案适用于Excel中的非表格单元格样式 - 如果您需要表格单元格的样式信息,请回复并尝试更新或为其添加答案。

    这个答案主要来自我的经验以及免费电子书第73-79页的解释: Open XML - The markup explained - 作者:Wouter van Vugt。它是用于所有OpenXml的一个很好的参考。