Epplus插入图表ColumnStacked3D切换行/列

我正在使用epplus在我的程序中创buildexcel! 我需要插入一个柱状图。 这是我的代码:

//Add the chart to the sheet var chart = sheet.Drawings.AddChart(chartTitle, eChartType.ColumnStacked3D); chart.SetPosition(positionRow, 2, positionCol, 2); chart.Title.Text = chartTitle; chart.Title.Font.Bold = true; chart.Title.Font.Size = 18; chart.SetSize(width, height); //Set the data range chart.Series.Add("D17:D22", "B17:B22"); chart.Series.Add("P17:P22", "B17:B22"); 

我得到的结果是:

在这里输入图像说明

但是我想要的结果是:

在这里输入图像说明

从程序创buildexcel文件后,我打开它并更改图表:右键单击图表/select数据/切换行/列。 如何在我的代码中切换行/列? 或者如何像下面的图片插入图表?

对不起英文不好

非常感谢你!

在Excel中的那个button只是切换数据并重build图表。 而不是试图模仿它从一开始就以正确的方式build立图表。

我的意思是你原来的图表是把数据当作2个数据系列,但是你真正想要的是6个系列。

唯一的问题是x轴上的值 – Epplus没有直接的方式,它似乎到达了系列的类别(水平)轴标签。 所以你必须通过下面的XML操作来完成。

所以改变你的代码:

 //Set the data range //chart.Series.Add("D17:D22", "B17:B22"); //chart.Series.Add("P17:P22", "B17:B22"); for (var i = 0; i < opt.Count; i++) { var datarange = sheet.Cells[$"Bar!D{17 + i},Bar!P{17 + i}"]; var ser = chart.Series.Add(datarange.Address, $"B{17 + i}:B{17 + i}"); ser.HeaderAddress = sheet.Cells[$"$B{17 + i}"]; } //have to remove cat nodes from each series so excel autonums 1 and 2 in xaxis var chartXml = chart.ChartXml; var nsm = new XmlNamespaceManager(chartXml.NameTable); var nsuri = chartXml.DocumentElement.NamespaceURI; nsm.AddNamespace("c", nsuri); //Get the Series ref and its cat var serNodes = chartXml.SelectNodes("c:chartSpace/c:chart/c:plotArea/c:bar3DChart/c:ser", nsm); foreach (XmlNode serNode in serNodes) { //Cell any cell reference and replace it with a string literal list var catNode = serNode.SelectSingleNode("c:cat", nsm); catNode.RemoveAll(); //Create the string list elements var ptCountNode = chartXml.CreateElement("c:ptCount", nsuri); ptCountNode.Attributes.Append(chartXml.CreateAttribute("val", nsuri)); ptCountNode.Attributes[0].Value = "2"; var v0Node = chartXml.CreateElement("c:v", nsuri); v0Node.InnerText = "opening"; var pt0Node = chartXml.CreateElement("c:pt", nsuri); pt0Node.AppendChild(v0Node); pt0Node.Attributes.Append(chartXml.CreateAttribute("idx", nsuri)); pt0Node.Attributes[0].Value = "0"; var v1Node = chartXml.CreateElement("c:v", nsuri); v1Node.InnerText = "closing"; var pt1Node = chartXml.CreateElement("c:pt", nsuri); pt1Node.AppendChild(v1Node); pt1Node.Attributes.Append(chartXml.CreateAttribute("idx", nsuri)); pt1Node.Attributes[0].Value = "1"; //Create the string list node var strLitNode = chartXml.CreateElement("c:strLit", nsuri); strLitNode.AppendChild(ptCountNode); strLitNode.AppendChild(pt0Node); strLitNode.AppendChild(pt1Node); catNode.AppendChild(strLitNode); } pck.Save(); 

这就是我的unit testing(由数字组成)的输出:

在这里输入图像说明