2016-03-23 12 views
2

私はepplusを使用してプログラムを作成しています! 縦棒グラフを挿入する必要があります。 これは私のコードです: Epplusの挿入図ColumnStacked3Dスイッチの行/列

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

しかし、私はその結果たい:私はプログラムからExcelファイルを作成した後

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 をどのようにautoに

だからこれにコードを変更x軸の番号 変更したい:1から "opening"、2から "closing" ありがとう! –

+0

@MinhGiangもう少し作業が必要ですが、ひどいことはありません。上記の私の編集を参照してください。 – Ernie

+0

ありがとうございました:) –