How to display percentages with decimals in an Epplus Pie chart?

前端 未结 1 1244
南旧
南旧 2021-01-23 16:13

In a EPPLUS Pie chart, the percentages are rounded automatically by default, how can I display them with 2 decimals programatically (10.75 instead of 11) ?

I only provid

1条回答
  •  迷失自我
    2021-01-23 16:37

    Dont really see an option in EPPlus to set it - would have to be on the Serie.DataLabel object.

    Looks like it has to be done via XML. Here is an example of how to do it (might have to be tweaked for different chart types):

    [TestMethod]
    public void PieChartDataLabelPercent()
    {
        //http://stackoverflow.com/questions/42393711/how-to-display-percentages-with-decimals-in-an-epplus-pie-chart
        var file = new FileInfo(@"c:\temp\PieChartDataLabelPercent.xlsx");
        if (file.Exists)
            file.Delete();
    
        var pck = new ExcelPackage(file);
        var workbook = pck.Workbook;
        var worksheet = workbook.Worksheets.Add("newsheet");
    
        var rand = new Random();
        var data = new List>();
        for (var i = 0; i < 10; i++)
            data.Add(new KeyValuePair($"Group {i}", rand.Next(10, 100)));
    
        //Fill the table
        var startCell = worksheet.Cells[1, 1];
        startCell.Offset(0, 0).Value = "Group Name";
        startCell.Offset(0, 1).Value = "Group Value";
        startCell.Offset(1, 0).LoadFromCollection(data);
    
        //Add the chart to the sheet
        var pieChart = worksheet.Drawings.AddChart("Chart1", eChartType.Pie);
        pieChart.SetPosition(data.Count + 1, 0, 0, 0);
        pieChart.SetSize(500, 400);
        pieChart.Title.Text = "Test Chart";
    
        //Set the data range
        var series = pieChart.Series.Add(worksheet.Cells[2, 2, data.Count + 1, 2], worksheet.Cells[2, 1, data.Count + 1, 1]);
        var pieSeries = (ExcelPieChartSerie)series;
        pieSeries.Explosion = 5;
    
        //Format the labels
        pieSeries.DataLabel.ShowValue = true;
        pieSeries.DataLabel.ShowPercent = true;
        pieSeries.DataLabel.ShowLeaderLines = true;
        pieSeries.DataLabel.Separator = ";  ";
        pieSeries.DataLabel.Position = eLabelPosition.BestFit;
    
        var xdoc = pieChart.ChartXml;
        var nsuri = xdoc.DocumentElement.NamespaceURI;
        var nsm = new XmlNamespaceManager(xdoc.NameTable);
        nsm.AddNamespace("c", nsuri);
    
        //Added the number format node via XML
        var numFmtNode = xdoc.CreateElement("c:numFmt", nsuri);
    
        var formatCodeAtt = xdoc.CreateAttribute("formatCode", nsuri);
        formatCodeAtt.Value = "0.00%";
        numFmtNode.Attributes.Append(formatCodeAtt);
    
        var sourceLinkedAtt = xdoc.CreateAttribute("sourceLinked", nsuri);
        sourceLinkedAtt.Value = "0";
        numFmtNode.Attributes.Append(sourceLinkedAtt);
    
        var dLblsNode = xdoc.SelectSingleNode("c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser/c:dLbls", nsm);
        dLblsNode.AppendChild(numFmtNode);
    
    
        //Format the legend
        pieChart.Legend.Add();
        pieChart.Legend.Position = eLegendPosition.Right;
    
        pck.Save();
    
    }
    

    Which gives this in the output:

    0 讨论(0)
提交回复
热议问题