DioDocs for Excel
DioDocs for Excel
データ連結
機能 > データ連結

DioDocs for Excel では、データ連結を使用することで、データバインドレポートを作成して、Excelで出力ることができます。データソースをシート、セル、またはテーブル列に連結できます。また、SpreadJSと対話するために、バインディングパスのJSONへのインポートやエクスポートが可能です。

シートの連結

IWorksheetインタフェースのDataSourceプロパティを使用して、シートをデータベースに連結できます。シートに連結する時、データソースとしてJSON文字列、DataTableまたはIEnumerableコレクションがサポートされます。ワークシートごとに1つのデータソースのみを使用できます。

データソースのフィールドをシートの列に自動的に連結するには、IWorksheetインタフェースのAutoGenerateColumnsプロパティをtrueに設定します。デフォルト値はtrueです。

また、データソースのフィールドをシートの列に手動で連結するには、IWorksheetインタフェースのAutoGenerateColumnsプロパティををfalseに設定し、IRangeインタフェースのBindingPathプロパティを使用して、データソースのフィールドのバインドパスをシートの列に設定します。

たとえば、「TeamName」フィールドをD列に表示する場合、「TeamName」フィールドのバインディングパスはD列になります。

次のコードは、DataTableをシートの列に手動で連結する方法を示します。

C#
コードのコピー
//ワークブックを初期化します
Workbook workbook = new Workbook();

DataTable teamInfo = new DataTable();
teamInfo.Columns.Add(new DataColumn("ID", typeof(Int32)));
teamInfo.Columns.Add(new DataColumn("Name", typeof(string)));
teamInfo.Columns.Add(new DataColumn("Score", typeof(Int32)));
teamInfo.Columns.Add(new DataColumn("Team", typeof(string)));

teamInfo.Rows.Add(10, "Bob", 12, "Xi'An");
teamInfo.Rows.Add(11, "Tommy", 6, "Xi'An");
teamInfo.Rows.Add(12, "Jaguar", 15, "Xi'An");
teamInfo.Rows.Add(12, "Lusia", 9, "Xi'An");
        
IWorksheet worksheet = workbook.Worksheets[0];

//AutoGenerateColumnsをfalseに設定します
worksheet.AutoGenerateColumns = false;

//列を手動で連結します
worksheet.Range["A:A"].EntireColumn.BindingPath = "ID";
worksheet.Range["B:B"].EntireColumn.BindingPath = "Name";
worksheet.Range["C:C"].EntireColumn.BindingPath = "Score";
worksheet.Range["D:D"].EntireColumn.BindingPath = "Team";

//データソースを設定します
worksheet.DataSource = teamInfo;

//ワークブックをXLSXファイルに保存します
workbook.Save("SheetBindDatatable.xlsx");

セルの連結

IWorksheetインタフェースのDataSourceプロパティを使用して、セルをデータベースに連結できます。データソースとしてカスタムオブジェクトとJSON文字列がサポートされます。

また、IRangeインタフェースのBindingPathロパティを使用して、データソースのフィールドのバインディングパスをセルに設定できます。たとえば、「Area」フィールドをA1セルに表示する場合、「Area」フィールドのバインディングパスはA1セルになります。

次のコードは、カスタムオブジェクトをセルに連結する方法を示します。

C#
コードのコピー
public void CellBinding()
{

    //ワークブックを初期化します
    Workbook workbook = new Workbook();

    var record = new SalesRecord
    {
        Area = "NorthChina",
        Salesman = "Hellen",
        Product = "Apple",
        ProductType = "Fruit",
        Sales = 120
    };
 
    IWorksheet worksheet = workbook.Worksheets[0];

    //セルのバインディングパスを設定します
    worksheet.Range["A1"].BindingPath = "Area";
    worksheet.Range["B2"].BindingPath = "Salesman";
    worksheet.Range["C2"].BindingPath = "Product";
    worksheet.Range["D3"].BindingPath = "ProductType";

    //データソースを設定します
    worksheet.DataSource = record;

    //ワークブックをXLSXファイルに保存します
    workbook.Save("cellbinding.xlsx");

}
internal class SalesRecord
{
    public string Area;
    public string Salesman;
    public string Product;
    public string ProductType;
    public int Sales;
}

テーブルの連結

IWorksheetインタフェースのDataSourceプロパティを使用して、テーブルをデータベースに連結できます。データソースとしてDataSet、JSON文字列、またはIEnumerableフィールドやプロパティを含むカスタムオブジェクトがサポートされます。また、ITableインタフェースのBindingPathプロパティを使用して、データソースのバインディングパスをテーブルに設定できます。

データソースのフィールドをテーブルの列に自動的に連結するには、IWorksheetインタフェースのAutoGenerateColumnsプロパティをtrueに設定します。デフォルト値はtrueです。

また、データソースのフィールドをテーブル列に手動で連結するには、IWorksheetインタフェースのAutoGenerateColumnsプロパティをfalseに設定し、ITableColumnインタフェースのDataFieldプロパティを使用して、データソースのフィールドのバインドパスをテーブルの列に設定します。

以下の例では、DataTableの「T1」が最初のテーブルに連結され、「ID」フィールドはテーブルの先頭列に連結されます。

DioDocs for Excelでは、連結されたテーブルがデータソースの変更にどのように応答するかを処理するITable.ExpandBoundRowsプロパティがあります。このプロパティをTrueに設定すると、連結されたテーブルはデータソースの変更に対応するために行数を自動的に調整します。一方、このプロパティをFalse(デフォルト値)に設定すると、テーブルはExcelのように動作し、データソースの変更を反映するために行全体ではなくセルのみを追加または削除します。

次のコードは、データセットをテーブル列に手動で連結する方法を示します。

C#
コードのコピー
//ワークブックを初期化します
Workbook workbook = new Workbook();

//データセット
var team1 = new DataTable("T1");
team1.Columns.Add(new DataColumn("ID", typeof(Int32)));
team1.Columns.Add(new DataColumn("Name", typeof(string)));
team1.Columns.Add(new DataColumn("Score", typeof(Int32)));
team1.Columns.Add(new DataColumn("Team", typeof(string)));

team1.Rows.Add(10, "Bob", 12, "Xi'An");
team1.Rows.Add(11, "Tommy", 6, "Xi'An");
team1.Rows.Add(12, "Jaguar", 15, "Xi'An");
team1.Rows.Add(12, "Lusia", 9, "Xi'An");

var team2 = new System.Data.DataTable("T2");
team2.Columns.Add(new DataColumn("ID", typeof(Int32)));
team2.Columns.Add(new DataColumn("Name", typeof(string)));
team2.Columns.Add(new DataColumn("Score", typeof(Int32)));
team2.Columns.Add(new DataColumn("Team", typeof(string)));

team2.Rows.Add(2, "Phillip", 9, "BeiJing");
team2.Rows.Add(3, "Hunter", 10, "BeiJing");
team2.Rows.Add(4, "Hellen", 8, "BeiJing");
team2.Rows.Add(5, "Jim", 9, "BeiJing");

var datasource = new System.Data.DataSet();
datasource.Tables.Add(team1);
datasource.Tables.Add(team2);

IWorksheet worksheet = workbook.Worksheets[0];

//テーブルを追加します
ITable table = worksheet.Tables.Add(worksheet.Range["B2:E6"], true);
ITable table2 = worksheet.Tables.Add(worksheet.Range["G2:J6"], true);

//AutoGenerateColumnsをfalseに設定します
table.AutoGenerateColumns = false;
table2.AutoGenerateColumns = false;

//テーブルのバインディングパスを設定します
table.BindingPath = "T1";
table2.BindingPath = "T2";

//テーブル列のデータフィールドをを設定します
table.Columns[0].DataField = "ID";
table.Columns[1].DataField = "Name";
table.Columns[2].DataField = "Score";
table.Columns[3].DataField = "Team";

table2.Columns[0].DataField = "ID";
table2.Columns[1].DataField = "Name";
table2.Columns[2].DataField = "Score";
table2.Columns[3].DataField = "Team";

//データセットをデータソースとして設定します
worksheet.DataSource = datasource;

//ワークブックをXLSXファイルに保存します
workbook.Save("TableBindDataset.xlsx");

制限

DioDocs for Excelでは、データソースに接続すると、データが設定されるが、その後データソースの内容を変更しても、データは変更されません。