C# EPPlus 数据栏条件格式与纯色填充

标签 c# excel xml epplus conditional-formatting

我正在生成 Excel 报告,其中涉及多个百分比数据列。由于报告用于演示目的,我想通过使用带有实心填充的数据栏格式化百分比数据来使它们看起来不错。不知何故,这被证明是极其困难的,因为 EPPlus 中没有直接设置数据栏的固体填充,但尽管如此,我还是得到了这篇文章中的答案:

Inconsistent appearance between manual and coded versions of solid databar and databar minimum value

但是,无论我多么努力地尝试编辑应用程序的代码,我只有一列最终以实心填充,其余部分为渐变。即使我将问题中的节点更改为节点列表,如下所示:

        var cfNodes = xdoc.SelectNodes("/default:worksheet/default:conditionalFormatting/default:cfRule", nsm);
        foreach(XmlNode cfNode in cfNodes)
        {
            cfNode.AppendChild(extLstCf);
        }

以及工作表元素:

        var wsNodes = xdoc.SelectNodes("/default:worksheet", nsm);
        foreach(XmlElement wsNode in wsNodes)
        {
            wsNode.AppendChild(extLstWs);
        }

我还尝试使用 xml 更改 <sqref>参数,但这仍然没有涵盖我所有的数据栏列。我认为必须在 xml 中更改一些内容才能完成我想要的任务,但我不知道要寻找什么...

最佳答案

好吧,我花了几天时间,但我终于弄清楚了。可能有一种更简单的方法来做到这一点,但到目前为止,这就是我让它为我工作的方法:

工作表 xml 扩展列表节点需要附加到工作表级别节点,其中包括工作表包含的数字数据栏元素,并且每个元素都需要有 gradient = 0对于实体填充 I。例如,我的工作表包含两个数据栏,所以我的工作表看起来像这样:

        var extLstWs = xdoc.CreateNode(XmlNodeType.Element, "extLst", xdoc.DocumentElement.NamespaceURI);
        extLstWs.InnerXml = @"<ext uri=""{78C0D931-6437-407d-A8EE-F0AAD7539E65}"" 
                                        xmlns:x14=""http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"">
                                    <x14:conditionalFormattings>
                                    <x14:conditionalFormatting xmlns:xm=""http://schemas.microsoft.com/office/excel/2006/main"">
                                    <x14:cfRule type=""dataBar"" id=""{3F3F0E19-800E-4C9F-9CAF-1E3CE014ED86}"">
                                        <x14:dataBar minLength=""0"" maxLength=""100"" gradient=""0"">
                                        <x14:cfvo type=""num"">
                                            <xm:f>0</xm:f>
                                        </x14:cfvo>
                                        <x14:cfvo type=""num"">
                                            <xm:f>100</xm:f>
                                        </x14:cfvo>
                                        <x14:negativeFillColor rgb=""FFFF0000""/><x14:axisColor rgb=""FF000000""/>
                                        </x14:dataBar>
                                    </x14:cfRule>
                                    <xm:sqref>A1:A20</xm:sqref>
                                    </x14:conditionalFormatting>
                                    <x14:conditionalFormatting xmlns:xm=""http://schemas.microsoft.com/office/excel/2006/main"">
                                        <x14:cfRule type=""dataBar"" id=""{3F3F0E19-800E-4C9F-9CAF-1E3CE014ED86}"">
                                        <x14:dataBar minLength=""0"" maxLength=""100"" gradient=""0"">
                                            <x14:cfvo type=""num"">
                                            <xm:f>0</xm:f>
                                            </x14:cfvo><x14:cfvo type=""num"">
                                            <xm:f>200</xm:f>
                                            </x14:cfvo><x14:negativeFillColor rgb=""FFFF0000""/>
                                            <x14:axisColor rgb=""FF000000""/>
                                        </x14:dataBar>
                                        </x14:cfRule>
                                        <xm:sqref>B1:B20</xm:sqref>
                                    </x14:conditionalFormatting>
                                    </x14:conditionalFormattings>
                                </ext>";
        var wsNode = xdoc.SelectSingleNode("/default:worksheet", nsm);
        wsNode.AppendChild(extLstWs);

注意我如何获得 <x14:conditionalFormattings> 的两个子节点在那里,每个数据栏一个。

其次,需要在 <cfRule> 下附加条件格式规则节点的另一个扩展列表。节点,每个数据栏也有一个。我能够使用 foreach 循环来查找工作表中的所有数据栏,并将相同的 xml 附加到每个数据栏,如下所示:

        var cfNodes = xdoc.SelectNodes("/default:worksheet/default:conditionalFormatting/default:cfRule", nsm);
        foreach (XmlNode cfnode in cfNodes)
        {
            var extLstCfNormal = xdoc.CreateNode(XmlNodeType.Element, "extLst", xdoc.DocumentElement.NamespaceURI);
            extLstCfNormal.InnerXml = @"<ext uri=""{B025F937-C7B1-47D3-B67F-A62EFF666E3E}"" 
                            xmlns:x14=""http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"">
                            <x14:id>{3F3F0E19-800E-4C9F-9CAF-1E3CE014ED86}</x14:id></ext>";

            cfnode.AppendChild(extLstCfNormal);
        }

完成上述操作后,我终于能够以实心填充显示所有数据栏。

关于C# EPPlus 数据栏条件格式与纯色填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52600936/

相关文章:

java - 使用 Apache POI 将列标签插入数据透视表?

java - 如何在有效的 SOAP 请求 xml 模板中填充值

c# - 如何在 C# 中将字符串解码为 XML 字符串

c# - DateTimePicker:选择日期和时间

Python 中的 C# BitConverter.ToSingle 等价物

c# - Window.FindName 找不到我通过附加属性命名的边框元素

excel vba sql语句返回单个字符串

excel - 如何删除包含少于特定字符数的单元格的 Excel 行?

c# - Xelement.Element(string) 始终返回 null

c# - 创建接受启动参数的windows服务