EPPlus

2016-04-09 13 views
3

kullanılarak oluşturulan excel çizelgesindeki gösterge rengi yanlış efsane giriş renklerini manüel olarak ayarlamanın bir yolu olup olmadığını merak ediyorum.EPPlus

Seri renkleri özel bir renge değiştirdim, ancak lejant rengi güncellenmiyor. Görüntüyü bakınız:

İşte

Incorrect legend color

+0

kullandığınız Posta koduna isteyebilirsiniz. – Ernie

+0

Bu yazıdan kodu kullanıyorum, sadece yazarın efsane rengini açıklamadığı görülüyor. http://stackoverflow.com/questions/34356874/epplus-columnstacked-chart-data-point-colors – user1854458

cevap

4

OP yorumlarda bağlantılı kod geliştirilmiş bir versiyonudur. Eğer renkli geçmesi Bu sürüm SetChartPointsColor için (sadece rastgele olanları kullanarak yerine bunu) ve aynı tüm nokta renklerini ayarlamak yanı sıra oluşturmak ve gösterge için giriş olacaktır istiyorum:

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); 
} 

gibi kullanın Bu:

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(); 
} 

çıktıda bu verir:

Example Output

RESPONSE'u Bir çizgi serisi için YORUMLAR

İÇİN biraz farklı olurdu:

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

Teşekkürler, bu harika! Takip eden soru: Bu bir çizgi grafiği için nasıl çalışır? "C: barChart /" öğesini seçmek için xml'i güncelledim ancak varsayılan renkleri değiştirmeyecek. – user1854458

+0

@ user1854458 Yukarıdaki düzenlemelerime bakın. – Ernie

İlgili konular