2014-09-02 19 views
5

Cách thay đổi màu mặc định của Biểu đồ hình tròn Excel bằng EPPlus theo chương trình.EPPlus cách thay đổi màu của Biểu đồ PIE trong EXCEL

dưới đây là mã của tôi

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; 

Tôi muốn thay đổi màu sắc mặc định cho một số màu sắc tươi sáng.

Đề xuất và ném một số ánh sáng về điều này.

Trả lời

3

Chỉ nghĩ rằng tôi sẽ trả lại một chút khi tôi gặp phải vấn đề tương tự. Câu trả lời ngắn gọn là EEPlus không hỗ trợ khả năng thay đổi màu sắc của các slice riêng lẻ vì vậy tôi phải dựa vào thao tác xml. Không đẹp và đòi hỏi kiến ​​thức tốt về dữ liệu bạn xuất ra - bạn cần phải biết số lượng lát bạn mong đợi. Nhưng nó hoạt động và điều này nên được áp dụng cho các loại biểu đồ hình tròn khác ngoài 3D.

Đây là phương pháp thử nghiệm minh họa. Đã làm điều này chống lại EPP 4.0.1 nhưng nên làm việc cũng như với các phiên bản trước:

[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

Lấy cảm hứng từ câu trả lời Ernie của, đây là một phương pháp mở rộng mà làm việc để thiết lập màu sắc và độ dày của một loạt biểu đồ đường thẳng, và một không thử nghiệm phiên bản để thiết lập màu sắc của một điểm biểu đồ hình tròn dữ liệu:

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

Cách sử dụng:

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

một lời nhận xét cuối năm nhưng có một lỗi đánh máy cho t anh ta xml cho PieChart. Nên là 'c: pieChart' thay vì' c: lineChart' nhưng phần mở rộng tuyệt vời. – Steven

+0

Cảm ơn @Steven, tôi đã sửa lỗi này. –

Các vấn đề liên quan