EPPlusでチャートのマーカーや線の色を変える

ググってもEPPlusが対応してないとか、xml直弄りしなきゃいけないとか出てきたので、対策のためのメモ。結論から言えばEPPlusだけで出来る。

何故すんなり出来ないのか

チャートに系列を追加する場合、Series.Addメソッドから追加してExcelChartSerieのインスタンスを得る。

var pkg = new ExcelPackage();
var ws = pkg.Workbook.Worksheets.Add("New Sheet");

var chart = ws.Drawings.AddChart("New Chart"), Drawing.Chart.eChartType.XYScatter);
var serie = chart.Series.Add(ws.Cells(2, 3, ws.Dimension.End.Row, 3), ws.Cells(2, 1, ws.Dimension.End.Row, 1);
serie.Header = "New Serie";
serie.MarkerColor = Color.Red;

こんな感じ1。んで追加した系列のプロパティをいじりたいのだけれど、このままだとMarkerColorプロパティがIntelli Senseに出なくて あるぇー?(・3・) ってなる。

Series.Addメソッドが罠

このメソッドはExcelChartSerieクラスのインスタンスを返すのだけれど、このクラスにはMarkerColorプロパティが実装されていない。なのでIntelli Senseには出なくて当然。

Githubで検索掛ければわかるけれど、LineChartとかScatterChartにはちゃんとこのプロパティが設定されている。そしてこれはExcelChartSerieを継承したExcelLineChartSerieおよびExcelScatterChartSerieクラス。つまり上記の場合だとserieをvarで宣言してAddメソッドの戻り値を受けてしまうと、ExcelChartSerieとして扱われて非常に不都合。なんてことを…2

そんなわけで、系列用の変数はvarで宣言せずに、チャートの形式に合わせて宣言してやる。

var pkg = new ExcelPackage();
var ws = pkg.Workbook.Worksheets.Add("New Sheet");

var chart = ws.Drawings.AddChart("New Chart"), Drawing.Chart.eChartType.XYScatter);
ExcelScatterChartSerie serie = chart.Series.Add(ws.Cells(2, 3, ws.Dimension.End.Row, 3), ws.Cells(2, 1, ws.Dimension.End.Row, 1);
serie.Header = "New Serie";
serie.MarkerColor = Color.Red;

これでマーカーの色 (MarkerColor) だけじゃなくて形 (Marker)、サイズ (MarkerSize)、枠線の色 (MarkerLineColor)、ラインの色 (LineColor)、太さ (LineWidth) など色々見た目を弄れるようになる。やったぜ。

キャストでも行けるような気がするけどお好みで。

愚痴

EPPlusって開発も比較的精力的に行われてて良いのだけれど、ドキュメントが弱すぎる3のが玉に瑕。自分みたいな道楽プログラマでは使うのがしんどい。

今回のもNuGet GalleryのChangelogに

4.0.5 Fixes
* Added LineColor, MarkerSize, LineWidth and MarkerLineColor properties to line charts

ってあったから、てっきりLineChartにしか実装してないものだと思ってしまった。実際にはScatterChartにも実装されているのでご心配なく。実験結果とかのグラフって大体散布図だもんね。XYScatterChartが使えないと困る。

愚痴おかわり

最近他人の研究の手伝いでVB .NETを触ることが多いのだけれど、久々にC#触るとセミコロン忘れが頻発して辛いでござる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です