2016-04-09 64 views
3

凡例の項目の色を手動で設定する方法があるかどうかは疑問です。EPPlusを使用して作成されたエクセルチャートで、伝説の色が正しくない

シリーズの色をカスタム色に変更しましたが、凡例の色は更新されません。画像を参照してください:

ここ

Incorrect legend color

+0

あなたが使用したコードを投稿することができます。 – Ernie

+0

私はこの記事のコードを使用していますが、作者は凡例の色を考慮していないようです。 http://stackoverflow.com/questions/34356874/epplus-columnstacked-chart-data-point-colors – user1854458

答えて

4

はOPはコメントでにリンクされたコードの改良版です。あなたは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

関連する問題