3

我在 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 图表(这不是我提供的示例数据的图表)

4

3 回答 3

2

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

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

还:

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

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

我发现不同版本的 Excel 遵循 Open XML 规范略有不同。Excel 2013 似乎更严格地遵守 Open XML 规范,这就是您获得透明颜色的原因。Excel 2007 可能忽略了缺少的“invertIfNegative”标签(这意味着如果不存在,您不希望与反转颜色等有任何关系,因此 Excel 只会呈现颜色)。从这个意义上说,Excel 2007 对错误的容忍度更高,这可能是好事,也可能不是好事。

于 2013-07-04T03:41:52.413 回答
2

手动添加<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);
于 2014-05-30T00:56:56.167 回答
0

添加到这个旧帖子中,我在 Excel 2016 中遇到了同样的问题,但无法通过 @Saxon Druce 直接回答来解决它。当我检查 Excel 后面的 chart1.xml 时,仅ser包含invertIfNegative并将其 val 属性设置为0不适用于任何条形(仍保持倒置/透明)。当我在 Excel 中打开文件并取消选中Series Option/Invert ifnegative 选项并重新打开 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

于 2018-08-15T09:59:46.987 回答