Epplus 插入图表 ColumnStacked3D 开关 row/column

Epplus insert chart ColumnStacked3D switch row/column

我正在使用 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");

我得到结果:

但我想要的结果是:

在我从程序创建 excel 文件后,我打开它并更改图表: 在chart/Selectdata/Switchrow/column中右击。 如何在我的代码中切换 row/column?或者如何插入如下图的图表?

抱歉英语不好

非常感谢!

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();

这在我的单元测试中给出了这个输出(由数字组成):