实体数据栏和数据栏最小值的手动版本和编码版本之间的外观不一致

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

我正在尝试在 EPPlus 4.0.4 中创建实体数据条,但 运行 遇到了两个问题。

下面的屏幕截图说明了这两个问题。在这两种情况下,期望的结果都是我在 Excel:

中手动添加的数据栏

这是我目前使用的代码:

var bars = doc.ConditionalFormatting.AddDatabar(range, Color.FromArgb(99,195,132));

bars.HighValue.Type = eExcelConditionalFormattingValueObjectType.Num;
bars.LowValue.Type = eExcelConditionalFormattingValueObjectType.Num;

bars.HighValue.Value = numResponses; //82
bars.LowValue.Value = 0;

对于纯色,我一直在尝试 bars.Style.Fill 的不同属性的值变化,但无济于事。如果实现了,就是我找不到合适的属性.

我很难理解第二个问题。如果我进入 Excel 中的 "Manage rule",高值和低值设置正确,但我没有发现我可以将它们更改为使它们的外观与手动创建的条形相匹配的值。

这是一个扩展列表问题。当进入更复杂的出口时,这会出现很多。条件格式可能是比较难的格式之一,因为有很多细微差别,而且这些年来它发生了很大变化。

扩展列表(xml 中的 extLst 标签)是 OpenOfficeXml 标准可用于添加新功能和格式的一个包罗万象的桶。在您的情况下,Excel 填充扩展列表部分以允许扩展 min/max 限制。 Epplus 不支持这一点,这就是为什么您会看到差异的原因。

您最简单的选择就是通过 xml/string 操作自己注入它虽然不漂亮,但可以完成工作:

var bars = doc.ConditionalFormatting.AddDatabar(range, Color.FromArgb(99, 195, 132));

bars.HighValue.Type = eExcelConditionalFormattingValueObjectType.Num;
bars.LowValue.Type = eExcelConditionalFormattingValueObjectType.Num;

bars.HighValue.Value = numResponses; //82
bars.LowValue.Value = 0;

//Get reference to the worksheet xml for proper namespace
var xdoc = doc.WorksheetXml;
var nsm = new XmlNamespaceManager(xdoc.NameTable);
nsm.AddNamespace("default", xdoc.DocumentElement.NamespaceURI);

//Create the conditional format extension list entry
var extLstCf = xdoc.CreateNode(XmlNodeType.Element, "extLst", xdoc.DocumentElement.NamespaceURI);
extLstCf.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>";
var cfNode = xdoc.SelectSingleNode("/default:worksheet/default:conditionalFormatting/default:cfRule", nsm);
cfNode.AppendChild(extLstCf);

//Create the extension list content for the worksheet
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>82</xm:f></x14:cfvo><x14:negativeFillColor rgb=""FFFF0000""/><x14:axisColor rgb=""FF000000""/></x14:dataBar></x14:cfRule><xm:sqref>B2:B11</xm:sqref></x14:conditionalFormatting></x14:conditionalFormattings></ext>";
var wsNode = xdoc.SelectSingleNode("/default:worksheet", nsm);
wsNode.AppendChild(extLstWs);

pck.Save();

请注意 gradient=""0"" 会将颜色条设置为纯色而不是渐变以及 min/max 设置以获得您正在寻找的传播。

一种更 "proper" 的方法是逐个节点和逐个属性地重新创建 xml 对象,这需要一段时间,但只需执行一次。