Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EPPlus自定义XYScatterLines图表轴格式VB.Net_C#_Vb.net_Excel_Epplus - Fatal编程技术网

C# EPPlus自定义XYScatterLines图表轴格式VB.Net

C# EPPlus自定义XYScatterLines图表轴格式VB.Net,c#,vb.net,excel,epplus,C#,Vb.net,Excel,Epplus,厄尼在这个问题上的帖子内容非常丰富,几乎让我达到了我的目的,那就是独立于数据源范围的格式,为XYScatterLines图形定制X和Y图表轴格式 我发现有两个值轴(valAx)节点,每个节点都用ID childnodes唯一标识,如下所示:axId val=“1”和axId val=“2” 根据Ernie之前回答的一个问题(有没有一种方法可以使用C#/EPPlus为Excel图形设置网格线选项),我认为获取每个valAx节点、找到相应的numFmt节点并通过执行类似操作(VB.net)将“sou

厄尼在这个问题上的帖子内容非常丰富,几乎让我达到了我的目的,那就是独立于数据源范围的格式,为XYScatterLines图形定制X和Y图表轴格式

我发现有两个值轴(valAx)节点,每个节点都用ID childnodes唯一标识,如下所示:axId val=“1”和axId val=“2”

根据Ernie之前回答的一个问题(有没有一种方法可以使用C#/EPPlus为Excel图形设置网格线选项),我认为获取每个valAx节点、找到相应的numFmt节点并通过执行类似操作(VB.net)将“sourceLinked=0”属性添加到其中会很容易:


但它不起作用。按预期返回两个节点,并为每个节点将属性添加到子numFmt节点。但在保存的XML中,只有一个valAx节点被更改。另一个顽固地保持不变。我尝试过无数种不同的方法,但都不管用。有人能告诉我为什么吗?

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

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


谢谢你,厄尼,效果很好。我缺少的是为每个轴创建属性。这意味着我不再需要电子表格中的两组数据列,第二组数据列与第一组数据列相同,只是格式不同,以便正确绘制图表轴。(ps)作为一个新手,我似乎无法为你的答案投票:(没问题@Willie。欢迎来到stack overflow。确保你标记了所回答的问题以结束它。另外,使用投票按钮标记任何其他对你有帮助的帖子总是很好的。
        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
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();
}