Search code examples
c#excelchartsepplus

How do I modify a chart series using EPPLus?


I want to ask about how to update series value of existing chart in excel using EPPLUS library. I can't find yet how to do it. I have created chart successfully, but still can't to update the series value.

Anyone can provide me some sample code or reference link?


Solution

  • Sorry to answer so late (came accross your post while searching for something else). If the chart has a series which are pointed at cells in a worksheet, why cant you just update the cell values directly? Like this, first create the pie chart:

    public void PieChartCreate()
    {
        var file = new FileInfo(@"c:\temp\temp.xlsx");
        if (file.Exists)
            file.Delete();
    
        var pck = new ExcelPackage(file);
        var workbook = pck.Workbook;
        var worksheet = workbook.Worksheets.Add("newsheet");
    
        var data = new List<KeyValuePair<string, int>>
        {
            new KeyValuePair<string, int>("Group A", 44613),
            new KeyValuePair<string, int>("Group B", 36432),
            new KeyValuePair<string, int>("Group C", 6324),
            new KeyValuePair<string, int>("Group A", 6745),
            new KeyValuePair<string, int>("Group B", 23434),
            new KeyValuePair<string, int>("Group C", 5123),
            new KeyValuePair<string, int>("Group A", 34545),
            new KeyValuePair<string, int>("Group B", 5472),
            new KeyValuePair<string, int>("Group C", 45637),
            new KeyValuePair<string, int>("Group A", 37840),
            new KeyValuePair<string, int>("Group B", 20827),
            new KeyValuePair<string, int>("Group C", 4548),
        };
    
        //Fill the table
        var startCell = worksheet.Cells[1,1];
        startCell.Offset(0, 0).Value = "Group Name";
        startCell.Offset(0, 1).Value = "Value";
    
        for (var i = 0; i < data.Count(); i++)
        {
            startCell.Offset(i + 1, 0).Value = data[i].Key;
            startCell.Offset(i + 1, 1).Value = data[i].Value;
        }
    
        //Add the chart to the sheet
        var pieChart = worksheet.Drawings.AddChart("Chart1", eChartType.Pie);
        pieChart.SetPosition(data.Count + 1, 0, 0, 0);
        pieChart.Title.Text = "Test Chart";
        pieChart.Title.Font.Bold = true;
        pieChart.Title.Font.Size = 12;
    
        //Set the data range
        var series = pieChart.Series.Add(worksheet.Cells[2, 2, data.Count, 2], worksheet.Cells[2, 1, data.Count, 1]);
        var pieSeries = (ExcelPieChartSerie)series;
        pieSeries.Explosion = 5;
    
        //Format the labels
        pieSeries.DataLabel.Font.Bold = true;
        pieSeries.DataLabel.ShowValue = true;
        pieSeries.DataLabel.ShowPercent = true;
        pieSeries.DataLabel.ShowLeaderLines = true;
        pieSeries.DataLabel.Separator = ";";
        pieSeries.DataLabel.Position = eLabelPosition.BestFit;
    
        //Format the legend
        pieChart.Legend.Add();
        pieChart.Legend.Border.Width = 0;
        pieChart.Legend.Font.Size = 12;
        pieChart.Legend.Font.Bold = true;
        pieChart.Legend.Position = eLegendPosition.Right;
    
        pck.Save();
    
    }
    

    Then update the cells:

    public void PieChartUpdate()
    {
        var file = new FileInfo(@"c:\temp\temp.xlsx");
        if (!file.Exists)
            return;
    
        var pck = new ExcelPackage(file);
        var workbook = pck.Workbook;
        var worksheet = workbook.Worksheets["newsheet"];
    
        var startCell = worksheet.Cells[2, 2];
        for (var i = 0; i < 12; i++)
        {
            startCell.Offset(i, 0).Value = ((double)startCell.Offset(i, 0).Value) * 100;
        }
        file.Delete();
        pck.Save();
    }
    

    If you need to change the definition of the series itself, then get it by name:

    public void PieChartUpdateSeries()
    {
        var file = new FileInfo(@"c:\temp\temp.xlsx");
        if (!file.Exists)
            return;
    
        var pck = new ExcelPackage(file);
        var workbook = pck.Workbook;
        var worksheet = workbook.Worksheets["newsheet"];
    
        var piechart = worksheet.Drawings["Chart1"] as ExcelPieChart;
        var series = piechart.Series[0];
        series.XSeries = worksheet.Cells[2, 1, 7, 1].FullAddress;
        series.Series = worksheet.Cells[2, 2, 7, 2].FullAddress;
    
        file.Delete();
        pck.Save();
    }
    

    Hope that helps.