【问题标题】:EPPlus Custom XYScatterLines Chart Axes Formats VB.NetEPPlus 自定义 XYScatterLines 图表轴格式 VB.Net
【发布时间】:2016-01-11 10:42:40
【问题描述】:

Ernie 在这个问题C# Change Excel Chart Axis Format using EPPLUS 中的帖子提供了很多信息,几乎让我到达了我想要的位置,即为 XYScatterLines 图形自定义 X 和 Y 图表轴格式,独立于数据源范围的格式。

我发现有两个值轴 (valAx) 节点,每个节点都用 ID 子节点唯一标识,如下 axId val="1" 和 axId val="2"

基于 Ernie 也回答的较早的问题(Is there a way to set gridline options for Excel graphs using C# / EPPlus)我认为获取每个 valAx 节点、找到相应的 numFmt 节点并添加 ' sourceLinked=0' 属性通过做这样的事情(VB.net):

        Dim att = xdoc.CreateAttribute("sourceLinked")
        att.Value = "0"
        Dim valAxisNodes = xdoc.SelectNodes("/c:chartSpace/c:chart/c:plotArea/c:valAx", nsm)
        If valAxisNodes IsNot Nothing AndAlso valAxisNodes.Count > 0 Then
            For Each valAxisNode As System.Xml.XmlNode In valAxisNodes
                If valAxisNode.SelectSingleNode("c:numFmt", nsm) IsNot Nothing Then
                    valAxisNode.SelectSingleNode("c:numFmt", nsm).Attributes.Append(att)
                End If
            Next
        End If

但它不起作用。两个节点按预期返回,并为每个节点添加属性到子 numFmt 节点。但是在保存的 XML 中,只有一个 valAx 节点发生了变化。另一个固执地保持不变。我尝试了无数种不同的方法,但没有任何效果。谁能告诉我为什么?

【问题讨论】:

    标签: c# vb.net excel epplus


    【解决方案1】:

    有两件事要做。 1 - 确保您明确设置两个轴的格式,否则您将丢失实际的 numFmt 节点,因此您测试 not null 将失败。 2 - 您不能两次使用相同的 att 实例,因此您需要为 for 循环内的每个轴制作一个副本。

    我对 VB 很生疏,所以这里是 C#:

    using (var pck = new ExcelPackage(fi))
    {
        var workbook = pck.Workbook;
        var worksheet = workbook.Worksheets.Add("Sheet1");
        worksheet.Cells.LoadFromDataTable(datatable, true);
    
        worksheet.Cells["A2:A11"].Style.Numberformat.Format = "m/d/yyyy";
        var chart = worksheet.Drawings.AddChart("chart ", eChartType.XYScatterLines);
        var series = chart.Series.Add(worksheet.Cells["B2:B11"], worksheet.Cells["A2:A11"]);
    
        //MUST BE EXPICIT otherwise the numFmt will not be generated by EPPLUS
        chart.XAxis.Format = "yyyy-mm-dd";
        chart.YAxis.Format = "General";
    
        var xdoc = chart.ChartXml;
        var nsm = new XmlNamespaceManager(xdoc.NameTable);
        nsm.AddNamespace("c", xdoc.DocumentElement.NamespaceURI);
    
        var valAxisNodes = xdoc.SelectNodes("/c:chartSpace/c:chart/c:plotArea/c:valAx", nsm);
        if (valAxisNodes != null && valAxisNodes.Count > 0)
            foreach (XmlNode valAxisNode in valAxisNodes)
            {
                //MUST create an attribute copy for each axis
                var att = xdoc.CreateAttribute("sourceLinked");
                att.Value = "0";
                if (valAxisNode.SelectSingleNode("c:numFmt", nsm) != null)
                    valAxisNode.SelectSingleNode("c:numFmt", nsm).Attributes.Append(att);
            }
    
        pck.Save();
    }
    

    【讨论】:

    • 感谢 Ernie 做得很好。这是我缺少的每个轴的属性的创建。这意味着我不再需要电子表格中的两组数据列,第二组与第一组相同,除了格式化以便图表轴正确绘制。 (ps是一个新手,看来我不能投票给你的答案:(
    • 没问题@Willie。欢迎来到堆栈溢出。确保将问题标记为已回答,以便将其关闭。此外,总是很高兴使用投票按钮标记任何其他对您有帮助的帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多