2017-02-22 4 views

답변

1

EPPlus에서 옵션을 실제로 설정하지 마십시오. Serie.DataLabel 개체에 있어야합니다.

XML을 통해 수행되어야하는 것처럼 보입니다. 여기에 그것을 수행하는 방법의 예입니다 (다른 차트 유형 불통해야 할 수도 있습니다) :

enter image description here

: 출력이 있습니다

[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<KeyValuePair<string, int>>(); 
    for (var i = 0; i < 10; i++) 
     data.Add(new KeyValuePair<string, int>($"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(); 

}