EPPlus条形图条在Excel 2013中不显示负值的颜色,但在Excel 2007中工作正常

时间:2013-07-01 12:15:17

标签: excel excel-2007 excel-2010 epplus excel-2013

我正在使用C#中使用EPPlus for Excel Package的BarClustered图表。我可以根据需要生成条形图。我遇到的唯一问题是,当我有一个负值时,条形图不会显示任何颜色。它就像一个只有边框的透明条。

我在使用Excel 2013时遇到了这个问题。但是这在Excel 2007中运行良好。

ExcelWorksheet wsDataSource = xlPackage.Workbook.Worksheets.Add("DataSource");
wsDataSource.Hidden = eWorkSheetHidden.VeryHidden;
var namedStyle = xlPackage.Workbook.Styles.CreateNamedStyle("HyperLink");   
namedStyle.Style.Font.UnderLine = true;
namedStyle.Style.Font.Color.SetColor(Color.Blue);

//Here I iterate through an array and populate the wsDataSource values as below starting from 3rd row:
Feb     2000    5000
March   -2000   2770
April   4000    4643

var chart = worksheet.Drawings.AddChart("Chart", OfficeOpenXml.Drawing.Chart.eChartType.BarClustered);
//row is the offset int variable
chart.SetPosition(row + 2, 0, 0, 10);
chart.SetSize(750, 30);
chart.Title.Text = "Data Graph";
chart.Legend.Position = eLegendPosition.Top;
var barChart = chart as ExcelBarChart;
barChart.DataLabel.ShowValue = true;

var mySeries = chart.Series.Add(wsDataSource.Cells[3, 2, intDataRow - 1, 2], wsDataSource.Cells[3, 1, intDataRow - 1, 1]);
mySeries.Header = "Current Year";

//isPreviousYearDataAvailable is a boolean which indicates if previous year data for the user is available.
if (isPreviousYearDataAvailable)
{
    var mySeries2 = chart.Series.Add(wsDataSource.Cells[3, 3, intDataRow, 3], wsDataSource.Cells[3, 1, intDataRow - 1, 1]);
    mySeries2.Header = "Previous Year"
}

下面是使用Excel 2013打开时获得负值的图像。

Excel 2013 graph(This is not the graph for the sample data I provided)

3 个答案:

答案 0 :(得分:2)

似乎EPPlus不支持数据系列的“invertIfNegative”标签。您可能需要联系作者寻求帮助,或者自己添加功能。 Open XML规范声明:

  

此元素指定如果值为负,则父元素应反转其颜色。

此外:

  

值on,1或true指定应用该属性。这是此属性的默认值,当父元素存在时隐含,但省略此属性。

由于EPPlus不呈现此标记,因此使用默认值,即“true”。在这种情况下,“父元素”是数据系列XML元素。因此,如果单元格值为负,则表示颜色将被反转。因此,你看到透明的颜色。

我发现不同版本的Excel遵循Open XML规范略有不同。 Excel 2013似乎更严格遵守Open XML规范,这就是您获得透明颜色的原因。 Excel 2007可能忽略了缺少的“invertIfNegative”标签(意思是如果没有,你不想与反转颜色等有任何关系,因此Excel将只渲染颜色)。从这个意义上讲,Excel 2007更容易出错,这可能是也可能不是好事。

答案 1 :(得分:2)

手动向XML添加<c:invertIfNegative val="0"/>似乎对我有用:

System.Xml.XmlNode invertIfNegativeNode = chart.ChartXml.CreateElement(
    "c", "invertIfNegative", "http://schemas.openxmlformats.org/drawingml/2006/chart");
System.Xml.XmlAttribute invertIfNegativeAttribute = chart.ChartXml.CreateAttribute("val");
invertIfNegativeAttribute.Value = "0";
invertIfNegativeNode.Attributes.Append(invertIfNegativeAttribute);
chart.ChartXml.DocumentElement["c:chart"]["c:plotArea"]["c:barChart"]["ser"].AppendChild(invertIfNegativeNode);

答案 2 :(得分:0)

添加到此旧帖子中,我在Excel 2016中遇到了相同的问题,但无法直接通过@Saxon Druce答案解决。当我检查Excel后面的chart1.xml时,只有ser包含invertIfNegative,并将其val属性设置为0不适用于任何条形(仍然保持反转/透明)。当我在Excel中打开文件并取消选中 Series Option / Invert if negative 选项并重新打开chart1.xml时,我发现每个dPt柱都被注入invertIfNegative节点。

因此,我修改了@Saxon Druce的答案,将invertIfNegative节点创建并附加到每个小节的dPt(第二个箭头),而不是附加到父节点ser(第一个箭头)。然后,ExcelBarChart可以正常显示所有条形(未反转)。

我用力敲了几个小时,所以希望这对使用Excel 2016的人有所帮助。

ExcelXml

var nsuri = chartXml.DocumentElement.NamespaceURI;
var dPt = chartXml.CreateNode(XmlNodeType.Element, "dPt", nsuri);
var invertIfNegative = chartXml.CreateNode(XmlNodeType.Element, "invertIfNegative", nsuri);
var att = chartXml.CreateAttribute("val", nsuri);
att.Value = "0";
invertIfNegative.Attributes.Append(att);
dPt.AppendChild(invertIfNegative);

// Other xml changes
var idx = chartXml.CreateNode(XmlNodeType.Element, "idx", nsuri);
att = chartXml.CreateAttribute("val", nsuri);
att.Value = i.ToString();
idx.Attributes.Append(att);
dPt.AppendChild(idx);

ExcelBarChartSample