2016-04-09 78 views
3

我在想如果有手動設置圖例輸入顏色的方法。使用EPPlus創建的Excel圖表中圖例顏色不正確

我將系列顏色更改爲自定義顏色,但圖例顏色未更新。見圖片:

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

RESPONSE將註釋

對於線系列這將是一個有點不同:

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

相關問題