Epplus插入图表ColumnStacked3D切换行/列

时间:2016-03-23 16:20:20

标签: c# excel charts epplus

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

//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");

我得到了结果:

enter image description here

但我希望结果为:

enter image description here

从程序创建excel文件后,打开它并更改图表: 右键单击图表/选择数据/切换行/列。 如何在代码中切换行/列?或者如何插入图表如下图所示?

抱歉英语不好

非常感谢!

1 个答案:

答案 0 :(得分:2)

excel中的那个按钮只是切换数据并重建图表。而不是试图更好地模仿它,从一开始就以正确的方式构建图表。

我的意思是您的原始图表将数据视为 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();

这是我单位测试中的输出(由数字组成):

enter image description here