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

Ernie的post在这个问题上C#更改Excel图表使用EPPLUS的轴格式非常丰富,几乎让我到我想要的位置,即为XYScatterLinesgraphics自定义X和Y图表轴格式独立于数据源范围的格式。

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

基于以前的问题也回答了厄尼(是否有一种方法来设置网格线选项的Excelgraphics使用C#/ EPPlus)我认为这将是很容易得到每个valAx节点,find各自的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节点发生了变化。 另一个固执地保持不变。 我已经尝试了几十种不同的方法,但没有任何作用。 任何人都可以启发我为什么?

两件事情要做。 1 – 确保你明确地设置两个轴的格式,否则你会错过实际的numFmt节点,所以你testing不为空将失败。 2 – 你不能两次使用同一个att实例,所以你需要为你的for循环中的每个轴创build一个副本。

我在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(); }