Main Content

動的テーブルの作成

動的テーブルとは、Report Generator プログラムの実行前にサイズが不明のテーブルです。そのため、サイズをハード コードすることはできません。この例では、動的テーブルを作成する 2 つの方法を示します。1 つ目のアプローチでは、基本の table オブジェクトからテーブルを作成します。別のアプローチでは、コンストラクターへの入力から直接テーブルを作成するテーブル コンストラクターを使用します。

table オブジェクトからの動的テーブルの作成

このプログラムでは、基本的な table オブジェクト (テーブル、テーブル エントリ、およびテーブル行の各オブジェクト) をループ処理および作成することでテーブルを作成する方法を示します。このコードはテスト結果のテーブルを表示します。1 列目はテスト名、2 列目はテスト時間、そして 3 列目は色分けされた結果です。

The green text, Pass, indicates that the results in the first and third row pass, The red text, Fail, in the other two rows indicates that the results in these rows fail.

このコードでは、最初に struct のデータからテーブルのヘッダー行テキストとテーブルの列数を判断します。次に、形式的テーブル オブジェクトを作成して、テーブルの書式設定を指定します。その後、テキスト項目の見出し付け、テーブル エントリの作成、テーブル エントリの追加をループ処理することでテーブルの構築を開始し、テーブルの見出し行を作成します。データをループ処理し、テーブル行とテーブル エントリを作成します。各テーブル エントリをそのテーブル行に追加することでテーブルを構築してから、各テーブル行をテーブルに追加します。

import mlreportgen.report.*
import mlreportgen.dom.*

rpt = Report('testResults','pdf');

% Input data
testData = struct('Name',{'Test 1','Test 2',...
    'Test 3','Test 4'},'Time',{1.25,1.43,1.51,2.17},...
    'Result',{'Pass','Fail','Pass','Fail'});

% Row heading names and number of columns
fields = fieldnames(testData);
nFields = numel(fields);

% Table, row, and table entries formatting
table = FormalTable();
table.RowSep = 'Solid';
table.ColSep = 'Solid';
table.Border = 'Solid';
table.TableEntriesInnerMargin = '5px';
table.Header.Style = {Bold()};

% Table heading row
headRow = TableRow();
for k = 1:nFields
    append(headRow,TableEntry(fields{k}));
end
append(table.Header,headRow);

% Table rows and table entries
for data = testData
    row = TableRow();
    for j = 1:nFields
        x = string(data.(fields{j}));
        p = Paragraph(x);
        if x == "Pass"
            p.Color = 'green';
        elseif  x == "Fail"
            p.Color = 'red';
        end
        new_entry = TableEntry(p);
        append(row,new_entry);
    end
    append(table,row);
end
add(rpt,table);

close(rpt);
rptview(rpt);

テーブル コンストラクターを使用した動的テーブルの作成

このプログラムでは、テーブル コンストラクターへの入力を使用してテーブルを作成する方法を説明します。この方法でテーブルを作成するメリットは、テーブルを構築する際、データをループ処理してテーブル エントリと行オブジェクトを作成する必要がないことです。この例では、テーブル コンテンツを指定する入力データは cell 配列内にあります。このコードによって、table オブジェクトからの動的テーブルの作成に示されているのと同じテスト結果テーブルが表示されます。

このコードでは、最初に cell 配列に含まれる行数と列数を判断し、テーブル用のメモリを事前に割り当てます。次に、このコードではテーブル コンテンツの書式設定を行う 2 つのオプション手順を実行します。つまり、データの小数点部分を指定するためにデータ値を string に変換することと、結果列の色を設定するためにデータのループ処理を行うことです。最後に、形式的テーブルを入力 (テーブルの見出し行のテキスト、テーブル データの cell 配列) から直接作成し、テーブルを書式設定します。

import mlreportgen.report.*
import mlreportgen.dom.*

rpt = Report('testResults_cell','pdf');

testData_raw = {'Test 1',1.25,'Pass';'Test 2',1.43,...
   'Fail';'Test 3',1.51,'Pass';'Test 4',2.17,'Fail'};

% Obtain cell array size
[nrows,ncols] = size(testData_raw);

% Preallocate memory for cell array
testData{nrows,ncols} = [];

% Convert all values to strings to control number of 
% decimal places displayed
testData = testData_raw;
idx = cellfun(@isnumeric, testData_raw(:)); 
testData(idx) = cellfun(@(x){sprintf('%.2f', x)}, testData_raw(idx));

% Set color of results column text items
for i = 1:nrows
    for j = 1:ncols  
       d = string(testData(i,j));     
       p = Paragraph(d);
       if d == "Pass"
            p.Color = 'green';
       elseif  d == "Fail"
            p.Color = 'red';
       end
       testData(i,j) = {p};
   end
end

% Create and format table
table = FormalTable({'Name','Time','Result'},testData);
table.RowSep = 'Solid';
table.ColSep = 'Solid';
table.Border = 'Solid';
table.TableEntriesInnerMargin = '5px';
table.Header.Style = {Bold()};
add(rpt,table);

close(rpt);
rptview(rpt);

参考

| | | |

関連するトピック