複数のデータソースを組み合わせたExcel帳票を作成する

今回は「DioDocs(ディオドック)」で新しく追加された、テンプレート構文のフィルタプロパティを使用して、複数のデータソースを組み合わせたExcel帳票を作成する方法を紹介します。こちらは2024年10月23日(水)にリリースされた「DioDocs V7J SP2」でDioDocs for Excelに追加されている機能です。

テンプレート構文のフィルタプロパティ

フィルタプロパティは、帳票テンプレートでフィルタ処理を設定できます。このプロパティは「条件フィルタ」と「スライスフィルタ」という2種類のフィルタオプションを提供しています。

  • 条件フィルタ
    比較演算子(<、>、=など)および論理演算子(AND、OR、NOT、およびLIKEなど)を使用してデータをフィルタ処理します。
  • スライスフィルタ
    指定されたインデックスから別の指定されたインデックスまでデータを取得してフィルタ処理します。

これらのフィルタオプションを個別あるいは組み合わせて使用して、データソースから取得したデータをフィルタ処理します。

使用する帳票テンプレートとデータソース

帳票テンプレート

帳票テンプレートとして、以下の項目を持つ簡易的な売上管理表を作成します。

  • 注文No.
  • 顧客名
  • 商品名
  • 数量
  • 単価
  • 売上金額
帳票テンプレート

データソース

帳票テンプレートに追加するデータソースとして、以下の3つのデータソースを使用します。

  • 顧客(customer)
    • 顧客番号(cid)
    • 顧客名(name)
  • 商品(product)
    • 商品番号(pid)
    • 商品名(name)
    • 単価(unitprice)
  • 注文(order)
    • 注文番号(oid)
    • 顧客番号(cid)
    • 商品番号(pid)
    • 数量(count)

顧客(customer)の「顧客番号」と商品(product)の「商品番号」が、注文(order)の「顧客番号」と「商品番号」に一致するデータをセルに追加するように、テンプレート構文のフィルタプロパティを帳票テンプレートへ設定します。

  • 顧客名:{{customer.name(F=(customer.cid = order.cid))}}
  • 商品名:{{product.name(F=(product.pid = order.pid))}}
帳票テンプレート(テンプレート構文を追加)

実行するコード

帳票テンプレートを読み込んでデータソースを追加し、Excel帳票を出力するためのコードはこちらです。

// 新規ワークブックの作成
Workbook workbook = new();

// 帳票テンプレートを読み込む
workbook.Open("sales-management.xlsx");

// データソースを追加
#region 注文データ
{
    var datasource = new DataTable();
    datasource.Columns.Add(new DataColumn("oid", typeof(string)));
    datasource.Columns.Add(new DataColumn("cid", typeof(string)));
    datasource.Columns.Add(new DataColumn("pid", typeof(string)));
    datasource.Columns.Add(new DataColumn("count", typeof(double)));
    datasource.Rows.Add("OD00001", "C001", "P001", 3);
    datasource.Rows.Add("OD00002", "C001", "P002", 6);
    datasource.Rows.Add("OD00003", "C001", "P003", 9);
    datasource.Rows.Add("OD00004", "C001", "P004", 2);
    datasource.Rows.Add("OD00005", "C001", "P005", 4);
    datasource.Rows.Add("OD00006", "C002", "P009", 7);
    datasource.Rows.Add("OD00007", "C002", "P004", 1);
    datasource.Rows.Add("OD00008", "C002", "P008", 8);
    datasource.Rows.Add("OD00009", "C002", "P007", 5);
    datasource.Rows.Add("OD00010", "C002", "P006", 4);
    datasource.Rows.Add("OD00011", "C003", "P009", 5);
    datasource.Rows.Add("OD00012", "C003", "P003", 2);
    datasource.Rows.Add("OD00013", "C003", "P002", 1);
    datasource.Rows.Add("OD00014", "C003", "P006", 3);
    datasource.Rows.Add("OD00015", "C004", "P010", 10);
    datasource.Rows.Add("OD00016", "C005", "P008", 9);
    datasource.Rows.Add("OD00017", "C006", "P007", 8);
    datasource.Rows.Add("OD00018", "C007", "P011", 7);
    datasource.Rows.Add("OD00019", "C007", "P012", 4);
    datasource.Rows.Add("OD00020", "C008", "P013", 6);
    datasource.Rows.Add("OD00021", "C008", "P014", 5);
    datasource.Rows.Add("OD00022", "C008", "P015", 2);
    workbook.AddDataSource("order", datasource);
}
#endregion

#region 顧客データ
{
    var datasource = new DataTable();
    datasource.Columns.Add(new DataColumn("cid", typeof(string)));
    datasource.Columns.Add(new DataColumn("name", typeof(string)));
    datasource.Rows.Add("C001", "田中太郎");
    datasource.Rows.Add("C002", "鈴木花子");
    datasource.Rows.Add("C003", "佐藤健一");
    datasource.Rows.Add("C004", "高橋和子");
    datasource.Rows.Add("C005", "伊藤誠二");
    datasource.Rows.Add("C006", "渡辺美奈");
    datasource.Rows.Add("C007", "山田一郎");
    datasource.Rows.Add("C008", "加藤由美");
    workbook.AddDataSource("customer", datasource);
}
#endregion

#region 商品データ
{
    var datasource = new DataTable();
    datasource.Columns.Add(new DataColumn("pid", typeof(string)));
    datasource.Columns.Add(new DataColumn("name", typeof(string)));
    datasource.Columns.Add(new DataColumn("unitprice", typeof(double)));
    datasource.Rows.Add("P001", "りんご", 120);
    datasource.Rows.Add("P002", "バナナ", 150);
    datasource.Rows.Add("P003", "みかん", 80);
    datasource.Rows.Add("P004", "いちご", 300);
    datasource.Rows.Add("P005", "ぶどう", 400);
    datasource.Rows.Add("P006", "トマト", 200);
    datasource.Rows.Add("P007", "レタス", 180);
    datasource.Rows.Add("P008", "キャベツ", 160);
    datasource.Rows.Add("P009", "にんじん", 100);
    datasource.Rows.Add("P010", "ピーマン", 90);
    datasource.Rows.Add("P011", "ほうれん草", 130);
    datasource.Rows.Add("P012", "さつまいも", 250);
    datasource.Rows.Add("P013", "キウイ", 140);
    datasource.Rows.Add("P014", "オレンジ", 200);
    datasource.Rows.Add("P015", "アスパラガス", 350);
    workbook.AddDataSource("product", datasource);
}
#endregion

// 売上管理表を作成
workbook.ProcessTemplate();

// 列幅を自動調整
workbook.Worksheets[0].Range["A:F"].AutoFit();

// Excelファイルに保存
workbook.Save("result.xlsx");

実行すると以下のExcel帳票が作成されます。

帳票テンプレート(実行結果)

今回紹介したテンプレート構文のフィルタプロパティは、売上管理や予実管理など複数のデータソースを組み合わせてデータが構成されるようなExcel帳票を作成したいケースで有効な機能です。

今回紹介した機能については以下のサンプルやデモで動作を確認いただけます。

DioDocsの最新バージョン「V7J SP2」の新機能については、以下のページで紹介していますのでこちらも是非ご覧ください。

さいごに

弊社Webサイトでは、製品の機能を気軽に試せるデモアプリケーションやトライアル版も公開していますので、こちらもご確認いただければと思います。

また、ご導入前の製品に関するご相談やご導入後の各種サービスに関するご質問など、お気軽にお問合せください。

\  この記事をシェアする  /