我正在使用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打开时获得负值的图像。
答案 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的人有所帮助。
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);