Search code examples
c#epplus

How to remove a single DataLabel from a Chart made with EPPlus and C#


enter image description hereIs it possible in any way to remove a single DataLabel from a Chart made with EPPlus and C#?

I just want to remove a single one, not the setting for the hole Chart... How can the collection of DataLabels be accessed (dLbls > dLbl)?

var chart = (ExcelBarChart)worksheet.Drawings.AddChart("Chart", eChartType.ColumnStacked);

Also made use of coloring a individual point of Chart with this: Legend color is incorrect in excel chart created using EPPlus

(The red point at the upper right)

Now I want to remove a specific label of a point, with generally applied DataLabels...

chart.DataLabel.ShowValue = true;

Any hint appreciated.


Solution

  • I figured out a solution. This Extension method is doing the trick...

    public static void RemoveDataLabel(this ExcelBarChart chart, int serieNumber, int objectNumber)
    {
        var chartXml = chart.ChartXml;
    
        var nsa = chart.WorkSheet.Drawings.NameSpaceManager.LookupNamespace("a");
        var nsuri = chartXml.DocumentElement.NamespaceURI;
    
        var nsm = new XmlNamespaceManager(chartXml.NameTable);
        nsm.AddNamespace("a", nsa);
        nsm.AddNamespace("c", nsuri);
    
        var dLbls = chart.ChartXml.SelectSingleNode(@"c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[c:idx[@val='" + serieNumber + "']]/c:dLbls", nsm);
    
        var dLbl = chartXml.CreateNode(XmlNodeType.Element, "dLbl", nsuri);
    
        var idx = chartXml.CreateNode(XmlNodeType.Element, "idx", nsuri);
        var valueIdx = chartXml.CreateAttribute("val", nsuri);
        valueIdx.Value = objectNumber.ToString();
        idx.Attributes.Append(valueIdx);
        dLbl.AppendChild(idx);
    
        var delete = chartXml.CreateNode(XmlNodeType.Element, "delete", nsuri);
        var valueDelete = chartXml.CreateAttribute("val", nsuri);
        valueDelete.Value = "1";
        delete.Attributes.Append(valueDelete);
        dLbl.AppendChild(delete);
    
        dLbls.AppendChild(dLbl);
    }