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

时间:2015-11-05 10:17:26

标签: c# excel conditional-formatting epplus

我正在尝试在EPPlus 4.0.4中创建实体数据库,并遇到两个问题。

  • 首先,我还没有弄清楚如何创建纯色填充色。
  • 其次,至少对于较小的值,条形图并没有显示出我期望的方式。

下面的屏幕截图说明了这两个问题。在这两种情况下,期望的结果是我在Excel中手动添加的数据库:

enter image description here

这是我目前正在使用的代码:

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中,正确设置了高值和低值,我发现没有值可以将它们更改为可以使它们的外观与手动创建的条形相匹配。

1 个答案:

答案 0 :(得分:2)

这是一个扩展名单问题。在进入更复杂的出口时会出现这种情况。有条件的格式化可能是其中之一,因为它有很多细微差别,而且这些年来它已经发生了很大变化。

扩展名列表(xml中的extLst标签)是OpenOfficeXml标准可用于添加新功能和格式的一种捕获桶。在您的情况下,Excel填充扩展名列表部分以允许扩展的最小/最大限制。 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"",它会将颜色条设置为实心而不是渐变,以及最小/最大设置,以获得您要查找的点差。

更“正确”的方法是按节点和属性按属性重新创建xml对象,这需要一段时间,但只需要执行一次。