C#

【C#】Excelにグラフ(チャート)を挿入する方法(SpreadsheetLight)

エクセルのデータを視覚で直観的に理解する為に、グラフを用いる機会は多いことでしょう。グラフはエクセルのスタンダードな機能な1つであり、利用する機会がとても多い機能です。

エクセルでは様々な種類のグラフが作成できます。特に使用頻度が高い棒グラフをC#で作成してみましょう。

この記事ではエクセルのインストールを必要としないライブラリである「SpreadsheetLight」を使って、グラフを追加する方法について具体的に解説します。

棒グラフではなく、折れ線グラフを表示したい方はこちらの記事がお勧めです。

【C#】折れ線グラフをExcelファイルに表示する方法(SpreadsheetLight)折れ線グラフをC#のエクセルライブラリ「SpreadsheetLight」で表示する方法を紹介します。Excelに対して書き込み操作と読み込み操作が可能なライブラリです。本記事ではExcelファイルに折れ線グラフを表示する方法について解説しています。...

SpreadsheetLightについて

Microsoftが提供するExcel(2007以降)およびLibreOffice Calcと互換性があるオープンソースのライブラリです。無料で利用できるMITライセンスで商用利用も可能です。

Excelに依存せず独自エンジンで動作するので、エクセルがなくても動かすことができます。Officeのインストールが不要というのは大きなメリットの1つでしょう。

このライブラリはNuGetでインストールすることが可能です。インストールの方法や使用方法についてはこちらの記事で紹介しますので、参考にしてみてくださいね。

【C#】ExcelをSpreadsheetLightで操作する方法Excel(エクセル)の書き込み・読み込み・エクセル操作するならC#専用ライブラリ「SpreadsheetLight」がおすすめ。無料で利用できる上に、豊富なサンプルで導入が簡単です。この記事ではライブラリのインストールを始め、基本となるエクセルの操作方法について詳しく解説をしています。...

ここからはライブラリーのインストールが完了していることを前提に進めていきます。

グラフの元データを追加

グラフの元となるデータをエクセルに用意します。今回グラフの元データとして使用するのは、「都道府県別の人口」です。データは総務省統計局からダウンロードしました。(参考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);

これでグラフを表示する準備が整いました。

グラフを追加したエクセルファイルの出力

上記で記載したサンプルコードを使って、グラフを挿入したエクセルファイルを出力してみましょう。

MainWindow.xaml.csに次のようなコードを記述します。
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ファイルへグラフを追加する方法について解説しました。

今回は棒グラフを例に説明しましたが、他にも様々なグラフを作成することができますので、ぜひご自身で試してみてください。

グラフの作成以外の使用例を紹介していますので参考になれば幸いです。

【C#】Excelを操作して帳票を出力するアプリを作成C#でExcelのファイルを作成してテンプレートを出力する方法を紹介します。実際にエクセルファイルを出力するアプリの作成を通して操作方法を詳しく解説します。...
【C#】エクセルを読み込んで条件付き書式を適用する方法を紹介C#でエクセルを読み込んで条件付き書式を適用させたExcelファイルを出力する方法について紹介します。エクセルのインストールを必要としないライブラリ「SpreadsheetLight」を利用すると簡単に実装することができます。...

以上、最後まで読んでいただきありがとうございました。

プログラミングを学習したいなら…

プログラミングスキルを身に付けるなら、プログラミングを効率良く学べる
プログラミングスクール」がオススメです。

特にこんな方にオススメ!!
これからエンジニアを目指したい
プログラミングの専門性を高めたい
プログラミングを学んで副業をしたい
エンジニアに転職して年収をアップさせたい

プログラミングを触ったことがない未経験からでも、プログラミングスクールで学習すれば、エンジニアへ就職・転職することも可能です。

あなたの「行動力」と「やる気」で、あなたの人生を大きく変えるチャンスになることでしょう。

プログラミングスクールに興味がある方は是非チェックしてみてください。

> プログラミングを学ぶ <

COMMENT

メールアドレスが公開されることはありません。

CAPTCHA