有没有办法使用C#/ EPPlus为Excel图形设置网格线选项

时间:2015-12-16 18:44:08

标签: c# xml excel graph epplus

我正在尝试使用EPPlus和C#创建一个excel Graph。我可以成功创建以下图表: Graph Created 但是,我希望程序在运行时在两个方向上创建主要和次要网格线;这样图表看起来像这样: Graph Desired

我知道我可以在Excel中调整这些设置,但我希望能够使用我的代码设置默认网格线。我在EPPlus中找不到可以处理此设置的设置(如果有,请让我知道)。我试图弄清楚如何直接自定义XML,但我也遇到了麻烦。

有没有办法可以做到这一点?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

有点奇怪没有添加,因为它很容易打开。下面是如何使用XML(如果你想设置颜色和大小,你需要更多地进入XML操作,但这将让你开始):

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.XYScatter);
    var series = chart.Series.Add(worksheet.Cells["B2:B11"], worksheet.Cells["A2:A11"]);

    //Get reference to the worksheet xml for proper namespace
    var chartXml = chart.ChartXml;
    var nsuri = chartXml.DocumentElement.NamespaceURI;
    var nsm = new XmlNamespaceManager(chartXml.NameTable);
    nsm.AddNamespace("c", nsuri);

    //XY Scatter plots have 2 value axis and no category
    var valAxisNodes = chartXml.SelectNodes("c:chartSpace/c:chart/c:plotArea/c:valAx", nsm);
    if (valAxisNodes != null && valAxisNodes.Count > 0)
        foreach (XmlNode valAxisNode in valAxisNodes)
        {
            if (valAxisNode.SelectSingleNode("c:majorGridlines", nsm) == null)
                valAxisNode.AppendChild(chartXml.CreateNode(XmlNodeType.Element, "c:majorGridlines", nsuri));
            if (valAxisNode.SelectSingleNode("c:minorGridlines", nsm) == null)
                valAxisNode.AppendChild(chartXml.CreateNode(XmlNodeType.Element, "c:minorGridlines", nsuri));
        }

    //Other charts can have a category axis
    var catAxisNodes = chartXml.SelectNodes("c:chartSpace/c:chart/c:plotArea/c:catAx", nsm);
    if (catAxisNodes != null && catAxisNodes.Count > 0)
        foreach (XmlNode catAxisNode in catAxisNodes)
        {
            if (catAxisNode.SelectSingleNode("c:majorGridlines", nsm) == null)
                catAxisNode.AppendChild(chartXml.CreateNode(XmlNodeType.Element, "c:majorGridlines", nsuri));
            if (catAxisNode.SelectSingleNode("c:minorGridlines", nsm) == null)
                catAxisNode.AppendChild(chartXml.CreateNode(XmlNodeType.Element, "c:minorGridlines", nsuri));
        }

    pck.Save();
}