エクセルのデータを視覚で直観的に理解する為に、グラフを用いる機会は多いことでしょう。グラフはエクセルのスタンダードな機能な1つであり、利用する機会がとても多い機能です。
エクセルでは様々な種類のグラフが作成できます。特に使用頻度が高い棒グラフをC#で作成してみましょう。
この記事ではエクセルのインストールを必要としないライブラリである「SpreadsheetLight」を使って、グラフを追加する方法について具体的に解説します。
棒グラフではなく、折れ線グラフを表示したい方はこちらの記事がお勧めです。
SpreadsheetLightについて
Microsoftが提供するExcel(2007以降)およびLibreOffice Calcと互換性があるオープンソースのライブラリです。無料で利用できるMITライセンスで商用利用も可能です。
Excelに依存せず独自エンジンで動作するので、エクセルがなくても動かすことができます。Officeのインストールが不要というのは大きなメリットの1つでしょう。
このライブラリはNuGetでインストールすることが可能です。インストールの方法や使用方法についてはこちらの記事で紹介しますので、参考にしてみてくださいね。
ここからはライブラリーのインストールが完了していることを前提に進めていきます。
グラフの元データを追加
グラフの元となるデータをエクセルに用意します。今回グラフの元データとして使用するのは、「都道府県別の人口」です。データは総務省統計局からダウンロードしました。(参考URL:2019年人口推計)
このデータをC#のDataTableクラスでレコードを追加していきます。DataTableは表形式のデータ(まさにExcelのような)を扱う時によく使われます。
下記のサンプルではDataTableクラスのインスタンスを生成して、ColumnプロパティのAddメソッドを呼び出してカラム名を追加しています。RowsプロパティのAddメソッドで都道府県とその総人口、男女別の人口を追加するようにしています。
private void SetRecordValue(SLDocument sl)
{
DataTable table = new DataTable("総人口と男女別の人口");
// カラム名の追加
table.Columns.Add("都道府県");
table.Columns.Add("男女合計", Type.GetType("System.Int32"));
table.Columns.Add("男性", Type.GetType("System.Int32"));
table.Columns.Add("女性", Type.GetType("System.Int32"));
// Rows.Addメソッドを使ってデータを追加
table.Rows.Add("北海道", 5250, 2472, 2778);
table.Rows.Add("青森県", 1246, 585, 661);
table.Rows.Add("岩手県", 1227, 592, 635);
table.Rows.Add("宮城県", 2306, 1127, 1179);
table.Rows.Add("秋田県", 966, 454, 512);
table.Rows.Add("山形県", 1078, 520, 558);
table.Rows.Add("福島県", 1846, 914, 931);
table.Rows.Add("茨城県", 2860, 1427, 1433);
table.Rows.Add("栃木県", 1934, 964, 970);
table.Rows.Add("群馬県", 1942, 962, 981);
table.Rows.Add("埼玉県", 7350, 3668, 3682);
table.Rows.Add("千葉県", 6259, 3105, 3155);
table.Rows.Add("東京都", 13921, 6846, 7075);
table.Rows.Add("神奈川県", 9198, 4585, 4613);
table.Rows.Add("新潟県", 2223, 1078, 1145);
table.Rows.Add("富山県", 1044, 506, 537);
table.Rows.Add("石川県", 1138, 553, 585);
table.Rows.Add("福井県", 768, 374, 394);
table.Rows.Add("山梨県", 811, 397, 414);
table.Rows.Add("長野県", 2049, 1000, 1049);
table.Rows.Add("岐阜県", 1987, 964, 1022);
table.Rows.Add("静岡県", 3644, 1797, 1847);
table.Rows.Add("愛知県", 7552, 3780, 3773);
table.Rows.Add("三重県", 1781, 870, 911);
table.Rows.Add("滋賀県", 1414, 699, 715);
table.Rows.Add("京都府", 2583, 1234, 1349);
table.Rows.Add("大阪府", 8809, 4227, 4582);
table.Rows.Add("兵庫県", 5466, 2605, 2861);
table.Rows.Add("奈良県", 1330, 626, 704);
table.Rows.Add("和歌山県", 925, 435, 490);
table.Rows.Add("鳥取県", 556, 266, 290);
table.Rows.Add("島根県", 674, 326, 349);
table.Rows.Add("岡山県", 1890, 909, 980);
table.Rows.Add("広島県", 2804, 1362, 1442);
table.Rows.Add("山口県", 1358, 645, 713);
table.Rows.Add("徳島県", 728, 347, 381);
table.Rows.Add("香川県", 956, 464, 492);
table.Rows.Add("愛媛県", 1339, 634, 705);
table.Rows.Add("高知県", 698, 329, 369);
table.Rows.Add("福岡県", 5104, 2416, 2688);
table.Rows.Add("佐賀県", 815, 386, 429);
table.Rows.Add("長崎県", 1327, 624, 702);
table.Rows.Add("熊本県", 1748, 825, 922);
table.Rows.Add("大分県", 1135, 539, 597);
table.Rows.Add("宮崎県", 1073, 505, 568);
table.Rows.Add("鹿児島県", 1602, 753, 849);
table.Rows.Add("沖縄県", 1453, 715, 738);
// セルのデータ入力
sl.ImportDataTable("B2", table, true);
sl.SetCellValue("E1", "(単位 千人)");
// セルの書式設定
SLStyle style = null;
style = sl.CreateStyle();
sl.SetColumnWidth(2, 5, 12);
style.SetTopBorder(BorderStyleValues.Thin, System.Drawing.Color.Black);
style.SetBottomBorder(BorderStyleValues.Thin, System.Drawing.Color.Black);
style.SetLeftBorder(BorderStyleValues.Thin, System.Drawing.Color.Black);
style.SetRightBorder(BorderStyleValues.Thin, System.Drawing.Color.Black);
sl.SetCellStyle("B2", "E49", style);
style = sl.CreateStyle();
style.SetBottomBorder(BorderStyleValues.Double, System.Drawing.Color.Black);
style.Fill.SetPatternType(PatternValues.Solid);
style.Fill.SetPatternForegroundColor(System.Drawing.Color.FromArgb(215, 228, 242));
sl.SetCellStyle("B2", "E2", style);
}
表データのインポート
DataTableの表データをSpreadsheetLightのSLDocumentにインポートするには、ImportDataTableメソッドを呼び出してインポートを開始するセルやカラム名の有無など必要な情報を渡します。
SLDocument.ImportDataTable(インポートの開始セル, 表データ, カラム名の有無)
sl.ImportDataTable("B2", table, true);
上記のコードでは、セル「B2」を開始位置としてTableDataの表データが作成されます。
正常にインポートできれば下図のような表が完成します。
グラフの追加
先ほど作成した都道府県別の総人口と男女別の人口データをグラフ化してみましょう。SpreadsheetLightでグラフを挿入するコードは簡単ですので、これからエクセルのグラフを作成したいという方は参考にしてみてください。
private void SetBarChart(SLDocument sl)
{
// 元データの範囲選択
SLChart chart = sl.CreateChart("B2", "E49");
// 棒グラフの設定
chart.SetChartType(SLColumnChartType.ClusteredColumn);
// グラフのサイズ設定
chart.SetChartPosition(2, 6, 32, 22);
// オプションの設定
SLDataSeriesOptions seriesOptions = null;
seriesOptions = chart.GetDataSeriesOptions(1); // 総人口グラフの色変更
seriesOptions.Line.SetSolidLine(System.Drawing.Color.Black, 0);
seriesOptions.Fill.SetSolidFill(System.Drawing.Color.Orange, 0);
chart.SetDataSeriesOptions(1, seriesOptions);
seriesOptions = chart.GetDataSeriesOptions(2); // 男性人口グラフの色変更
seriesOptions.Fill.SetSolidFill(System.Drawing.Color.CornflowerBlue, 0);
chart.SetDataSeriesOptions(2, seriesOptions);
seriesOptions = chart.GetDataSeriesOptions(3); // 女性人口グラフの色変更
seriesOptions.Fill.SetSolidFill(System.Drawing.Color.DeepPink, 0);
chart.SetDataSeriesOptions(3, seriesOptions);
// グラフの挿入
sl.InsertChart(chart);
}
グラフの設定
まずは「グラフとなる元データの範囲」と「グラフの種類」を設定します。
「グラフとなる元データの範囲」は、CreateChartメソッドでグラフにしたいデータの範囲と項目名を含めて指定します。
「グラフの種類」は、SetChartTypeメソッドでグラフの種類を指定します。
- SLColumnChartType.ColumnChart:縦棒グラフ
- SLAreaChartType.Area:面グラフ
- SLBubbleChartType.Bubble:バブルチャート
- SLBarChartType.ClusteredBar:棒グラフ
- SLLineChartType.Line:折れ線グラフ
- SLPieChartType.PieOfPie:円グラフ
- SLRadarChartType.Radar:レーダーチャート
- SLScatterChartType.ScatterWithStraightLines:散布図
SLChart chart = SLDocument.CreateChart(範囲選択する左上のセル, 範囲選択する右下のセル)
chart.SetChartType(チャートの種類を選択);
SLChart chart = sl.CreateChart("B2", "E49");
chart.SetChartType(SLColumnChartType.ClusteredColumn);
次に「グラフのサイズ」を設定します。SetChartPositionメソッドにグラフの上下左右(4隅のセル)の位置を指定します。
chart.SetChartPosition(上部の行番号, 左部の列番号, 下部の行番号, 右部の列番号);
chart.SetChartPosition(2, 6, 32, 22);
上記の例だと、「G3」~「V32」の範囲にグラフができることになります。
オプションの設定
棒グラフの色を変更する為に、SLDataSeriesOptionsでカスタマイズをします。変更をしたい要素のインデックスをGetDataSeriesOptionsメソッドの引数として渡します。
あとはFillプロパティを呼び出してSetSoidFillメソッドで好みの色を指定することで変更が可能です。
グラフの追加
グラフの設定とオプションの設定が完了したら、「グラフを追加」しましょう。追加は簡単でInsertChartメソッドに設定した情報を引数で渡すだけです。
SLDocument.InsertChart(設定済みのグラフオブジェクト);
sl.InsertChart(chart);
これでグラフを表示する準備が整いました。
グラフを追加したエクセルファイルの出力
上記で記載したサンプルコードを使って、グラフを挿入したエクセルファイルを出力してみましょう。
public partial class MainWindow : Window
{
private readonly string filepath = @"C:\Sample.xlsx";
public MainWindow()
{
InitializeComponent();
Loaded += (Sender, e) =>
{
SLDocument sl = new SLDocument();
// 元データ作成
SetRecordValue(sl);
// グラフを作成
SetBarChart(sl);
// ファイルを保存
sl.SaveAs(filepath);
};
}
}
アプリを起動してみましょう。起動すると、指定したフォルダにエクセルファイルが出力され、下図のようなグラフが作成されていれば完成です。
まとめ
C#でExcelのインストールが不要であるライブラリ「SpreadsheetLight」を使用して、Excelファイルへグラフを追加する方法について解説しました。
今回は棒グラフを例に説明しましたが、他にも様々なグラフを作成することができますので、ぜひご自身で試してみてください。
グラフの作成以外の使用例を紹介していますので参考になれば幸いです。
以上、最後まで読んでいただきありがとうございました。