メインコンテンツ

動的テーブルの作成

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

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

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

task_lib_dynamic.png

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);

% 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);

参考

| | | |

トピック