谁能解释一下 OpenXml 中的样式索引是如何工作的?我有一个业务需求,我需要将背景颜色应用于 Excel 工作表中的某些单元格。并且某些样式已应用于其他单元格。所以我需要决定我需要应用哪种风格索引。
1 回答
当您第一次看到 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
样式部分(又名工作簿的样式表)包含以下部分:
- 编号格式
- 字体
- 填充
- 边框
- 单元格样式格式
- 单元格格式 <== 单元格样式索引是指其中之一
- 单元格样式
- 差分格式
- 表格样式
- 颜色
- 样式表扩展列表
现在在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
)添加到Fills
包含新颜色的样式表部分(上面的第三个项目符号)。如果颜色已经存在,您需要找到并记住该Fill
颜色的现有索引。无论哪种方式,对于此示例,假设Fill
您需要的索引是25
.
步骤 2. 创建一个新的CellFormat
,它是CellFormat
at index的副本10
。您将把它添加CellFormat
到本节的末尾CellFormat
。假设新的索引CellFormat
将是53
。
第 3 步。您更新CellFormat
at 索引53
并使其Fill
索引属性为25
(从第 1 步开始)。
最后一步:更新有问题的单元格B3
,以获得新StyleIndex
的53
注意:此答案适用于 Excel 中的非表格单元格样式 - 如果您想要表格单元格的样式信息,请回复并尝试更新或添加答案。
这个答案主要来自我的经验以及对免费电子书第 73-79 页的解释:Open XML - The markup Explained - Wouter van Vugt。它是所有 OpenXml 的一个很好的参考。