C# EPPlus自定义XYScatterLines图表轴格式VB.Net
厄尼在这个问题上的帖子内容非常丰富,几乎让我达到了我的目的,那就是独立于数据源范围的格式,为XYScatterLines图形定制X和Y图表轴格式 我发现有两个值轴(valAx)节点,每个节点都用ID childnodes唯一标识,如下所示:axId val=“1”和axId val=“2” 根据Ernie之前回答的一个问题(有没有一种方法可以使用C#/EPPlus为Excel图形设置网格线选项),我认为获取每个valAx节点、找到相应的numFmt节点并通过执行类似操作(VB.net)将“sourceLinked=0”属性添加到其中会很容易: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
但它不起作用。按预期返回两个节点,并为每个节点将属性添加到子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();
}