【问题标题】:EPPlus Barchart bars not showing colors for negative value in Excel 2013, but works fine in Excel 2007EPPlus 条形图条在 Excel 2013 中不显示负值颜色,但在 Excel 2007 中工作正常
【发布时间】:2013-07-01 12:15:17
【问题描述】:

我在 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 excel-2007 excel-2010 epplus excel-2013


    【解决方案1】:

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

    该元素指定父元素在值为负数时反转其颜色。

    还有:

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

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

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

    【讨论】:

    • 谢谢文森特。我想我必须同意你的解释。
    【解决方案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);
    

    【讨论】:

      【解决方案3】:

      添加到这个旧帖子,我在 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 的人有所帮助。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-16
        • 2020-05-16
        • 2012-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多