2016-03-23 2 views
2

Я использую epplus для создания excel в моей программе! Мне нужна вставка диаграммы столбцов. Это мой код: Эппл вставки диаграммы ColumnStacked3D switch row/column

//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

После того как я создал первенствовать файл из программы , Я его открываю и меняю диаграмму: Щелкните правой кнопкой мыши в диаграмме/Выбрать данные/Переключить строку/столбец. Как переключить строку/столбец в моем коде? Или как вставить диаграмму, как показано на рисунке ниже?

Извините за не очень хорошо на английском языке

Большое спасибо!

ответ

2

Эта кнопка в excel просто переключает данные и восстанавливает диаграмму. Вместо этого попробуйте подражать ему лучше построить диаграмму с самого начала.

То, что я имею в виду исходный график обработки данных, как серии данных, но то, что вы действительно хотите серии.

Единственная проблема заключается в значениях по оси 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

+0

Спасибо @Ernie Как авто число по оси x Я хочу изменить: 1 до «открытия», от 2 до «закрытия» Большое спасибо! –

+0

@MinhGiang Для этого требуется немного больше работы, но не страшно. См. Мои правки выше. – Ernie

+0

Спасибо большое :) –

Смежные вопросы