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

我在C#中使用EPPlus for Excel包的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图表(这不是我提供的示例数据的图表)

看来EPPlus不支持数据系列的“invertIfNegative”标签。 您可能需要联系作者以获得帮助,或者自己添加该function。 Open XML规范指出:

这个元素指定父元素如果值为负,则应该反转它的颜色。

也:

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

由于EPPlus不呈现此标记,因此使用默认值,即“true”。 这种情况下的“父元素”是数据系列XML元素。 所以这意味着如果单元格值为负值,颜色将被倒置。 因此,你看到的透明色。

我发现不同版本的Excel服从Open XML规范略有不同。 Excel 2013似乎更严格地遵守Open XML规范,这就是为什么你得到一个透明的颜色。 Excel 2007可能忽略了不存在的“invertIfNegative”标签(意思是如果不存在,你不想与反转颜色等有关,所以Excel将只显示颜色)。 从这个意义上说,Excel 2007更加宽容的错误,这可能会或可能不是一件好事。

手动添加<c:invertIfNegative val="0"/>到XML似乎适用于我:

 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);