2016-04-09 3 views
3

Мне интересно, есть ли способ вручную установить цвета записи легенды.Цвет легенды неправильный в диаграмме Excel, созданной с использованием EPPlus

Я изменил цвета серии на собственный цвет, но цвет легенды не обновляется. Смотрите изображение:

Incorrect legend color

+0

Может хотите разместить код, который вы использовали. – Ernie

+0

Я использую код этого сообщения, кажется, что автор не учитывал цвет легенды. http://stackoverflow.com/questions/34356874/epplus-columnstacked-chart-data-point-colors – user1854458

ответ

4

Вот улучшенная версия кода, что ОП связан в комментариях. Эта версия вы передаете в цвет вы хотите (вместо этого просто используя случайные из них), чтобы SetChartPointsColor и он установит все цвета указывают на то же самое, а также создавать и запись для легенды:

public static void SetChartPointsColor(this ExcelChart chart, int serieNumber, Color color) 
{ 
    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 serieNode = chart.ChartXml.SelectSingleNode(@"c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[c:idx[@val='" + serieNumber + "']]", nsm); 
    var serie = chart.Series[serieNumber]; 
    var points = serie.Series.Length; 

    //Add reference to the color for the legend and data points 
    var srgbClr = chartXml.CreateNode(XmlNodeType.Element, "srgbClr", nsa); 
    var att = chartXml.CreateAttribute("val"); 
    att.Value = $"{color.R:X2}{color.G:X2}{color.B:X2}"; 
    srgbClr.Attributes.Append(att); 

    var solidFill = chartXml.CreateNode(XmlNodeType.Element, "solidFill", nsa); 
    solidFill.AppendChild(srgbClr); 

    var spPr = chartXml.CreateNode(XmlNodeType.Element, "spPr", nsuri); 
    spPr.AppendChild(solidFill); 

    serieNode.AppendChild(spPr); 
} 

использовать его как это:

using (var pck = new ExcelPackage(fileInfo)) 
{ 
    var workbook = pck.Workbook; 
    var worksheet = workbook.Worksheets.Add("Sheet1"); 
    worksheet.Cells.LoadFromDataTable(datatable, true); 

    var chart = worksheet.Drawings.AddChart("chart test", eChartType.ColumnStacked); 
    chart.Series.Add(worksheet.Cells["B2:B11"], worksheet.Cells["A2:A11"]); 
    chart.Series.Add(worksheet.Cells["C2:C11"], worksheet.Cells["A2:A11"]); 

    var rand = new Random(); 
    var color = Color.FromArgb(rand.Next(256), rand.Next(256), rand.Next(256)); 

    chart.SetChartPointsColor(0, color); 
    color = Color.FromArgb(rand.Next(256), rand.Next(256), rand.Next(256)); 
    chart.SetChartPointsColor(1, color); 

    pck.Save(); 
} 

дает это на выходе:

Example Output

ОТВЕТА К КОММЕНТАРИЯМ

Для серии линии было бы немного по-другому:

public static void SetLineChartColor(this ExcelChart chart, int serieNumber, Color color) 
{ 
    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 serieNode = chart.ChartXml.SelectSingleNode([email protected]"c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser[c:idx[@val='{serieNumber}']]", nsm); 
    var serie = chart.Series[serieNumber]; 
    var points = serie.Series.Length; 

    //Add reference to the color for the legend 
    var srgbClr = chartXml.CreateNode(XmlNodeType.Element, "srgbClr", nsa); 
    var att = chartXml.CreateAttribute("val"); 
    att.Value = $"{color.R:X2}{color.G:X2}{color.B:X2}"; 
    srgbClr.Attributes.Append(att); 

    var solidFill = chartXml.CreateNode(XmlNodeType.Element, "solidFill", nsa); 
    solidFill.AppendChild(srgbClr); 

    var ln = chartXml.CreateNode(XmlNodeType.Element, "ln", nsa); 
    ln.AppendChild(solidFill); 

    var spPr = chartXml.CreateNode(XmlNodeType.Element, "spPr", nsuri); 
    spPr.AppendChild(ln); 

    serieNode.AppendChild(spPr); 
} 
+0

Спасибо, это здорово! Последующий вопрос: как это работает для линейного графика? Я обновил xml, чтобы выбрать «c: barChart /», но он не изменит цвета по умолчанию. – user1854458

+0

@ user1854458 Смотрите мои правки выше. – Ernie