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

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

解决方法

第一眼看它时,Open XML样式可能会让人感到困惑. 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 Formats< == cell styleindex指的是其中之一
>细胞样式
>差异格式
>表格样式
>颜色
>样式表扩展名单

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

>编号格式(上面的第一个子弹)
>字体(上面的第二个子弹)
>填充(上面的第三个子弹)
>边境(上面的第四个子弹)

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

// 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的StyleIndex已经为10.

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

步骤1.如果这是电子表格的新背景颜色,请将背景(也称为填充)添加到包含新颜色的样式表(上面的第三个项目符号)的“填充”部分.如果颜色已存在,则需要查找并记住该颜色的现有填充的索引.无论哪种方式,对于这个例子,我们可以说你需要的Fill指数是25.

步骤2.创建一个新的CellFormat,它是索引10处的CellFormat的副本.您将把这个新的CellFormat添加到CellFormat部分的末尾.让我们说新的CellFormat的索引将是53.

步骤3.更新索引53处的CellFormat并使其Fill index属性为25(从步骤1开始).

最后一步:更新问题B3中的单元格,使新的StyleIndex为53

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

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

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString(&quot;x2&quot;));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable&lt;Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include &quot;WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...