【问题标题】:Is there a way to set gridline options for Excel graphs using C# / EPPlus有没有办法使用 C#/EPPlus 为 Excel 图表设置网格线选项
【发布时间】:2015-12-16 18:44:07
【问题描述】:

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

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

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

【问题讨论】:

  • 遗憾的是,我认为您无法使用 epplus 做到这一点。当我使用 OOXML 文档(目前只使用 Word)时,我所做的就是按照您的需要放在网格上,保存它并在文档中搜索元素是如何指定的。如果您下载 Office Open SDK 2.5 (microsoft.com/en-us/download/details.aspx?id=30425),您可以使用工具进行下载。在工具应用程序中,您可以打开所有 ooxml 文档并查看 xml。

标签: c# xml excel graph epplus


【解决方案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();
}

【讨论】:

  • catAxisNode = chartXml.SelectSingleNode("c:chartSpace/c:chart/c:plotArea/c:catAx", nsm); 行无效。这是因为“c:catAx”不存在。取而代之的是第二个“c:valAx”标签。因此,我能够通过将有问题的行替换为:var catAxisNode = valAxisNode.NextSibling; 来纠正错误。通过这个小修正,这段代码完美运行!谢谢,我已经被困了很久了!
  • 啊,我写那条评论时没有看到你的编辑。谢谢!
  • @jnel899 酷。是的,我在发布后意识到这将是一个问题。请小心使用类似NextSibling 的相对节点搜索,因为不能保证它们彼此相邻。很高兴你成功了。
猜你喜欢
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多