2014-09-02 45 views
5

如何使用EPPlus以編程方式更改Excel餅圖的默認顏色。下面EPPlus如何更改EXCEL中的PIE圖表顏色

是我的代碼

var pieChart = worksheet.Drawings.AddChart("piechart", eChartType.Pie3D) as ExcelPieChart; 
      //Set top left corner to row 1 column 2 
      pieChart.SetPosition(18, 0, 0, 0); 
      pieChart.SetSize(350, 300); 
      pieChart.Series.Add(ExcelRange.GetAddress(12, 2, 15, 2),ExcelRange.GetAddress(12, 1, 15, 1)); 
      pieChart.Legend.Position = eLegendPosition.Bottom; 
      pieChart.Legend.Border.Fill.Color = Color.Green; 
      pieChart.Legend.Border.LineStyle = eLineStyle.Solid;    
      pieChart.Legend.Border.Fill.Style = eFillStyle.SolidFill; 
      pieChart.Title.Text = "Current Status";    
      pieChart.DataLabel.ShowCategory = false; 
      pieChart.DataLabel.ShowPercent = true; 

我想改變默認的顏色到一些明亮的色彩。

建議並在此點亮一些。

回答

3

想到我遇到類似的問題時會回覆一點。簡短的回答是EEPlus不支持改變單個切片顏色的能力,所以我不得不依靠xml操作。不漂亮,需要對輸出的數據有很好的瞭解 - 您需要知道您期望的切片數量。但它的工作原理,這應該適用於除3D以外的其他餅圖類型。

這是一個測試方法,演示。這樣做對EPP 4.0.1但應與之前的版本一樣好:

[TestMethod] 
public void Change_3DPieChart_Color() 
{ 
    const string PIE_PATH = "c:chartSpace/c:chart/c:plotArea/c:pie3DChart/c:ser"; 

    var existingFile = new FileInfo(@"c:\temp\temp.xlsx"); 
    if (existingFile.Exists) 
     existingFile.Delete(); 

    using (var package = new ExcelPackage(existingFile)) 
    { 
     var workbook = package.Workbook; 
     var worksheet = workbook.Worksheets.Add("newsheet"); 

     //Some data 
     worksheet.Cells["A12"].Value = "wer"; 
     worksheet.Cells["A13"].Value = "sdf"; 
     worksheet.Cells["A14"].Value = "wer"; 
     worksheet.Cells["A15"].Value = "ghgh"; 

     worksheet.Cells["B12"].Value = 53; 
     worksheet.Cells["B13"].Value = 36; 
     worksheet.Cells["B14"].Value = 43; 
     worksheet.Cells["B15"].Value = 86; 

     //Create the pie 
     var pieChart = (ExcelPieChart) worksheet.Drawings.AddChart("piechart", eChartType.Pie3D); 

     //Set top left corner to row 1 column 2 
     pieChart.SetPosition(18, 0, 0, 0); 
     pieChart.SetSize(350, 300); 
     pieChart.Series.Add(ExcelCellBase.GetAddress(12, 2, 15, 2), ExcelCellBase.GetAddress(12, 1, 15, 1)); 
     pieChart.Legend.Position = eLegendPosition.Bottom; 
     pieChart.Legend.Border.Fill.Color = Color.Green; 
     pieChart.Legend.Border.LineStyle = eLineStyle.Solid; 
     pieChart.Legend.Border.Fill.Style = eFillStyle.SolidFill; 
     pieChart.Title.Text = "Current Status"; 
     pieChart.DataLabel.ShowCategory = false; 
     pieChart.DataLabel.ShowPercent = true; 

     //Get the nodes 
     var ws = pieChart.WorkSheet; 
     var nsm = ws.Drawings.NameSpaceManager; 
     var nschart = nsm.LookupNamespace("c"); 
     var nsa = nsm.LookupNamespace("a"); 
     var node = pieChart.ChartXml.SelectSingleNode(PIE_PATH, nsm); 
     var doc = pieChart.ChartXml; 

     //Add the node 
     var rand = new Random(); 
     for (var i = 0; i < 4; i++) 
     { 
      //Create the data point node 
      var dPt = doc.CreateElement("dPt", nschart); 

      var idx = dPt.AppendChild(doc.CreateElement("idx", nschart)); 
      var valattrib = idx.Attributes.Append(doc.CreateAttribute("val")); 
      valattrib.Value = i.ToString(CultureInfo.InvariantCulture); 
      node.AppendChild(dPt); 

      //Add the solid fill node 
      var spPr = doc.CreateElement("spPr", nschart); 
      var solidFill = spPr.AppendChild(doc.CreateElement("solidFill", nsa)); 
      var srgbClr = solidFill.AppendChild(doc.CreateElement("srgbClr", nsa)); 
      valattrib = srgbClr.Attributes.Append(doc.CreateAttribute("val")); 

      //Set the color 
      var color = Color.FromArgb(rand.Next(256), rand.Next(256), rand.Next(256)); 
      valattrib.Value = ColorTranslator.ToHtml(color).Replace("#", String.Empty); 
      dPt.AppendChild(spPr); 
     } 

     package.Save(); 

    } 
} 
8

由厄尼的答案啓發,這裏是一個擴展方法,用於設置折線圖系列顏色和厚度的作品,和非測試版本設置餅圖數據點的顏色:

public static void SetSeriesStyle(this ExcelLineChart chart, ExcelChartSerie series, Color color, decimal? thickness = null) { 
    if (thickness < 0) throw new ArgumentOutOfRangeException("thickness"); 
    var i = 0; 
    var found = false; 
    foreach (var s in chart.Series) { 
     if (s == series) { 
      found = true; 
      break; 
     } 
     ++i; 
    } 
    if (!found) throw new InvalidOperationException("series not found."); 
    //Get the nodes 
    var nsm = chart.WorkSheet.Drawings.NameSpaceManager; 
    var nschart = nsm.LookupNamespace("c"); 
    var nsa = nsm.LookupNamespace("a"); 
    var node = chart.ChartXml.SelectSingleNode(@"c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser[c:idx[@val='" + i.ToString(CultureInfo.InvariantCulture) + "']]", nsm); 
    var doc = chart.ChartXml; 

    //Add the solid fill node 
    var spPr = doc.CreateElement("c:spPr", nschart); 
    var ln = spPr.AppendChild(doc.CreateElement("a:ln", nsa)); 
    if (thickness.HasValue) { 
     var w = ln.Attributes.Append(doc.CreateAttribute("w")); 
     w.Value = Math.Round(thickness.Value * 12700).ToString(CultureInfo.InvariantCulture); 
     var cap = ln.Attributes.Append(doc.CreateAttribute("cap")); 
     cap.Value = "rnd"; 
    } 
    var solidFill = ln.AppendChild(doc.CreateElement("a:solidFill", nsa)); 
    var srgbClr = solidFill.AppendChild(doc.CreateElement("a:srgbClr", nsa)); 
    var valattrib = srgbClr.Attributes.Append(doc.CreateAttribute("val")); 

    //Set the color 
    valattrib.Value = color.ToHex().Substring(1); 
    node.AppendChild(spPr); 
} 

public static void SetDataPointStyle(this ExcelPieChart chart, int dataPointIndex, Color color) { 
    //Get the nodes 
    var nsm = chart.WorkSheet.Drawings.NameSpaceManager; 
    var nschart = nsm.LookupNamespace("c"); 
    var nsa = nsm.LookupNamespace("a"); 
    var node = chart.ChartXml.SelectSingleNode("c:chartSpace/c:chart/c:plotArea/c:pieChart/c:ser", nsm); 
    var doc = chart.ChartXml; 
    //Add the node 
    //Create the data point node 
    var dPt = doc.CreateElement("c:dPt", nschart); 

    var idx = dPt.AppendChild(doc.CreateElement("c:idx", nschart)); 
    var valattrib = idx.Attributes.Append(doc.CreateAttribute("val")); 
    valattrib.Value = dataPointIndex.ToString(CultureInfo.InvariantCulture); 
    node.AppendChild(dPt); 

    //Add the solid fill node 
    var spPr = doc.CreateElement("c:spPr", nschart); 
    var solidFill = spPr.AppendChild(doc.CreateElement("a:solidFill", nsa)); 
    var srgbClr = solidFill.AppendChild(doc.CreateElement("a:srgbClr", nsa)); 
    valattrib = srgbClr.Attributes.Append(doc.CreateAttribute("val")); 

    //Set the color 
    valattrib.Value = color.ToHex().Substring(1); 
    dPt.AppendChild(spPr); 
} 

public static String ToHex(this Color c) { 
    return "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2"); 
} 

用法:

lineChart.SetSeriesStyle(s, color: Color.FromArgb(0, 0, 0), thickness: 6m); 
pieChart.SetDataPointStyle(dataPointIndex: 0, color: Color.FromArgb(0, 0, 0)); 
+0

晚發表評論,但有一個錯字在t他爲PieChart的XML。應該是'c:pieChart'而不是'c:lineChart',但是很好的擴展。 – Steven 2018-02-19 20:38:14

+0

謝謝@Steven,我已經解決了這個問題。 – 2018-02-20 15:09:53