Как установить положение легенды на графике вверху слева в Excel в epplus - PullRequest
1 голос
/ 13 января 2020

Мне нужно установить положение легенды на графике в верхнем левом углу. Но невозможно установить, так как в eLegendPosition такого свойства не существует.

        var myChart = myWorksheet.Drawings.AddChart("Chart2", eChartType.ColumnClustered) as                  ExcelBarChart;
            **Adding an series to chart**
                  var serie2a = myChart.Series.Add(myWorksheet.Cells[2, 2, dataRow, 2], myWorksheet.Cells[2, 1,                 dataRow, 1]);
                    //serie2a.Header = myWorksheet.Cells[1, 2].Value.ToString();
                    serie2a.Header = "Plan";

                myChart.YAxis.Title.Text = "Daily MH %";
                    myChart.YAxis.Title.Font.Size = 8;

                    chart2b.UseSecondaryAxis = true; //Flip the axes

                    chart5e.UseSecondaryAxis = true; //Flip the axes

                    chart2b.YAxis.Title.Text = "Cumul Daily MH %";
                    chart2b.YAxis.Title.Font.Size = 8;
             **Here I am Facing an issue while setting it to TopLeft**
                    myChart.Legend.Position = eLegendPosition.Bottom;
                    myChart.Border.Fill.Color = System.Drawing.Color.Green;
                    myChart.Title.Text = "OVERALL S CURVE";
                    myChart.Title.Font.Size = 10;
                    myChart.SetSize(800, 400);

                    // Add to 7th row and to the 7th column
                    myChart.SetPosition(7, 0, 7, 0);

1 Ответ

0 голосов
/ 15 января 2020

Перечисление, которое имеет Epplus, соответствует excel, поэтому одни настройки не будут делать то, что вам нужно. Но вы можете вручную установить его в XML, используя узел ManualLayout:

https://docs.microsoft.com/en-us/dotnet/api/documentformat.openxml.drawing.charts.manuallayout?view=openxml-2.8.1

Аналогично тому, как это было сделано в Как добавить в текстовую метку для диаграмм Excel, использующих Open xml или EPPLUS .

Вот вспомогательный метод, который сделает его более лаконичным:

/// <summary>
/// Sets the chart's layout node <c>c:chartSpace/c:chart/c:legend/c:layout</c> for the
/// passed <see cref="ExcelBarChart"/>.
/// </summary>
/// <param name="chart">Chart to set </param>
/// <param name="x">Position X Value (percentage).</param>
/// <param name="y">Position Y Value (percentage).</param>
/// <param name="culture">Culture to use when converting the doubles to string based on excel settings.</param>
public static void SetChartManualLayout(this ExcelBarChart chart, double x, double y, CultureInfo culture)
{
    //Set layout via xml
    var chartXml = chart.ChartXml;
    var nsm = new XmlNamespaceManager(chartXml.NameTable);

    var nsuri = chartXml.DocumentElement.NamespaceURI;
    nsm.AddNamespace("c", nsuri);
    nsm.AddNamespace("a", "http://schemas.openxmlformats.org/drawingml/2006/main");

    //Get the title layout and add the manual section
    var layoutNode = chartXml.SelectSingleNode("c:chartSpace/c:chart/c:legend/c:layout", nsm);
    var manualLayoutNode = chartXml.CreateElement("c:manualLayout", nsuri);
    layoutNode.AppendChild(manualLayoutNode);

    //Add coordinates
    var xModeNode = chartXml.CreateElement("c:xMode", nsuri);
    var attrib = chartXml.CreateAttribute("val");
    attrib.Value = "edge";
    xModeNode.Attributes.Append(attrib);
    manualLayoutNode.AppendChild(xModeNode);

    var yModeNode = chartXml.CreateElement("c:yMode", nsuri);
    attrib = chartXml.CreateAttribute("val");
    attrib.Value = "edge";
    yModeNode.Attributes.Append(attrib);
    manualLayoutNode.AppendChild(yModeNode);

    var xNode = chartXml.CreateElement("c:x", nsuri);
    attrib = chartXml.CreateAttribute("val");
    attrib.Value = x.ToString(culture);
    xNode.Attributes.Append(attrib);
    manualLayoutNode.AppendChild(xNode);

    var yNode = chartXml.CreateElement("c:y", nsuri);
    attrib = chartXml.CreateAttribute("val");
    attrib.Value = x.ToString(culture);
    yNode.Attributes.Append(attrib);
    manualLayoutNode.AppendChild(yNode);
}

И использовать его в своем коде просто сделайте это:

// Add to 7th row and to the 7th column
myChart.SetPosition(7, 0, 7, 0);
myChart.Legend.Position = eLegendPosition.Left;
myChart.SetChartManualLayout(0.015, 0.015, CultureInfo.CurrentCulture);

Укажите X и Y в процентах. 0,0 поместит его в верхний левый угол, а 1,1 - в нижний правый. Кроме того, обязательно учитывайте Culture, если Excel настроен не так, как ваше приложение.

...