Main Content

行と列にまたがるテーブル エントリのスパン

これらの例では、行と列にまたがるテーブル エントリを作成する方法を示します。

略式テーブル

この例では、DOM 略式テーブル オブジェクトで行と列のスパンを使用して、以下のテーブルを作成する方法を示します。

略式テーブルは、事前定義されたヘッダー セクション、本体セクション、およびフッター セクションを含まないテーブルです。ただし、この例に示すように、略式テーブルの最初の数行をヘッダーとして書式設定することができます。

長い完全修飾クラス名を使用せずに済むよう、DOM 名前空間をインポートします。

import mlreportgen.dom.*

ドキュメントを設定し、テーブルを説明するための見出しを追加します。

% To create a PDF report, change the output type from "docx" to "pdf". 
% To create an HTML report, change "docx" to "html" or "html-file" for
% a multifile or single-file report, respectively.
rpt = Document('myReport','docx');

h = Heading(1, 'Multiple Row and Column Table Entries Using an Informal Table');
h.Style = [h.Style {HAlign('center')}];
append(rpt, h);

さまざまなドキュメント コンポーネントで使用されるスタイル用の cell 配列を作成します。含まれているテーブルはページの幅いっぱいに広がり、エントリを分ける実線をもちます。メイン ヘッダーをスチール ブルーにし、次にサブヘッダーを明るいスカイ ブルーにします。

tableStyle = {Width('100%'), Border('solid'), ColSep('solid'), RowSep('solid')};
mainHeaderRowStyle = {VAlign('middle'), InnerMargin('2pt', '2pt', '2pt', '2pt'), ...
    BackgroundColor('steelblue')};
mainHeaderTextStyle = {Bold, OuterMargin('0pt', '0pt', '0pt', '0pt'), FontFamily('Arial')};
subHeaderRowStyle = {VAlign('middle'), InnerMargin('2pt', '2pt', '2pt', '2pt'), BackgroundColor('skyblue')};
subHeaderTextStyle = {Bold, OuterMargin('0pt', '0pt', '0pt', '0pt'), FontFamily('Arial')};
bodyStyle = {OuterMargin('0pt', '0pt', '0pt', '0pt'), InnerMargin('2pt', '2pt', '2pt', '0pt')};

テーブルに含めるサンプル データをいくつか作成します。次に、Table オブジェクトを作成します。

data = {'John', 'Smith', 'Natick, MA';
    'Jane', 'Doe', 'Boston, MA'};

t = Table(3);
t.Style = [t.Style tableStyle];

Name ヘッダーと Address ヘッダーが含まれるテーブルの最初の行の TableRow オブジェクトを作成します。Name ヘッダーには 2 つのサブヘッダーがあるため、2 列にまたがります。これは、テーブル エントリの ColSpan プロパティで設定します。Address ヘッダーにはサブヘッダーがないため、2 行にまたがります。これは、テーブル エントリの RowSpan プロパティで設定します。

r = TableRow;
r.Style = [r.Style mainHeaderRowStyle];
p = Paragraph('Name');
p.Style = [p.Style mainHeaderTextStyle {HAlign('center')}];
te = TableEntry(p);
te.ColSpan = 2;
append(r, te);

p = Paragraph('Address');
p.Style = [p.Style mainHeaderTextStyle];
te = TableEntry(p);
te.RowSpan = 2;
append(r, te);
append(t, r);

Name の First と Last のサブヘッダー用に、テーブルの 2 番目の行を作成します。テーブルの幅は 3 列ですが、Address フィールドが最初の行と 2 番目の行の両方にまたがっているため、2 番目の行には 2 つのエントリしか含まれません。

r = TableRow;
r.Style = [r.Style subHeaderRowStyle];
p = Paragraph('First');
p.Style = [p.Style subHeaderTextStyle];
te = TableEntry(p);
append(r, te);

p = Paragraph('Last');
p.Style = [p.Style subHeaderTextStyle];
te = TableEntry(p);
append(r, te);
append(t, r);

サンプル データをループ処理してテーブルに追加します。

for k = 1:size(data, 1)
    r = TableRow;
    r.Style = [r.Style bodyStyle];
    te = TableEntry(data{k,1});
    append(r, te);
    te = TableEntry(data{k,2});
    append(r, te);
    te = TableEntry(data{k,3});
    append(r, te);
    append(t, r);
end

テーブルをドキュメントに追加します。

append(rpt, t);

形式的テーブル

この例では、DOM 形式的テーブル オブジェクトで行と列のスパンを使用して、以下のテーブルを作成する方法を示します。

形式的テーブルは、それぞれテーブルのヘッダー セクション、本体セクション、およびフッター セクションの 3 つのサブテーブルで構成されるテーブルです。略式テーブルの代わりに形式的テーブルを使用すると、特別な書式設定が必要なヘッダーをデータから分離し、形式的テーブル コンストラクターに直接渡して本体テーブルに入力することができます。

長い完全修飾クラス名を使用せずに済むよう、DOM 名前空間をインポートします。

import mlreportgen.dom.*

既存のドキュメントの新しいページに移動し、テーブルを説明するための見出しを追加します。

br = PageBreak();
append(rpt, br);
h = Heading(1, 'Multiple Row and Column Table Entries Using a Formal Table');
h.Style = [h.Style {HAlign('center')}];
append(rpt, h);

さまざまなドキュメント コンポーネントで使用されるスタイル用の cell 配列を作成します。含まれているテーブルはページの幅いっぱいに広がり、エントリを分ける実線をもちます。メイン ヘッダーをスチール ブルーにし、次にサブヘッダーを明るいスカイ ブルーにします。

tableStyle = {Width('100%'), Border('solid'), ColSep('solid'), RowSep('solid')};
mainHeaderRowStyle = {VAlign('middle'), InnerMargin('2pt', '2pt', '2pt', '2pt'), ...
    BackgroundColor('steelblue')};
mainHeaderTextStyle = {Bold, OuterMargin('0pt', '0pt', '0pt', '0pt'), FontFamily('Arial')};
subHeaderRowStyle = {VAlign('middle'), InnerMargin('2pt', '2pt', '2pt', '2pt'), BackgroundColor('skyblue')};
subHeaderTextStyle = {Bold, OuterMargin('0pt', '0pt', '0pt', '0pt'), FontFamily('Arial')};
bodyStyle = {OuterMargin('0pt', '0pt', '0pt', '0pt')};

テーブルに含めるサンプル データをいくつか作成します。次に、サンプル データを使用して、本体セクションで FormalTable オブジェクトを作成します。

data = {'John', 'Smith', 'Natick, MA';
    'Jane', 'Doe', 'Boston, MA'};

t = FormalTable(data);
t.Style = [t.Style tableStyle];
t.Body.TableEntriesStyle = [t.Body.TableEntriesStyle, bodyStyle];

前の例と同じ方法を使用して、FormalTable オブジェクトの Header テーブルを作成します。Name ヘッダーと Address ヘッダーが含まれるテーブルの最初の行の TableRow オブジェクトを作成します。Name ヘッダーには 2 つのサブヘッダーがあるため、2 列にまたがります。これは、テーブル エントリの ColSpan プロパティで設定します。Address ヘッダーにはサブヘッダーがないため、2 行にまたがります。これは、テーブル エントリの RowSpan プロパティで設定します。

r = TableRow;
r.Style = [r.Style mainHeaderRowStyle];
p = Paragraph('Name');
p.Style = [p.Style mainHeaderTextStyle {HAlign('center')}];
te = TableEntry(p);
te.Style = [te.Style mainHeaderTextStyle];
te.ColSpan = 2;
append(r, te);

p = Paragraph('Address');
p.Style = [p.Style mainHeaderTextStyle];
te = TableEntry(p);
te.Style = [te.Style mainHeaderTextStyle];
te.RowSpan = 2;
append(r, te);
append(t.Header, r);

Name の First と Last のサブヘッダー用に、テーブルの 2 番目の行を作成します。テーブルの幅は 3 列ですが、Address フィールドが最初の行と 2 番目の行の両方にまたがっているため、2 番目の行には 2 つのエントリしか含まれません。

r = TableRow;
r.Style = [r.Style subHeaderRowStyle];
p = Paragraph('First');
p.Style = [p.Style subHeaderTextStyle];
te = TableEntry(p);
append(r, te);

p = Paragraph('Last');
p.Style = [p.Style subHeaderTextStyle];
te = TableEntry(p);
append(r, te);
append(t.Header, r);

テーブルをドキュメントに追加します。

append(rpt, t);

ページ レイアウト テーブル

この例では、行と列のスパンを使用して、複雑なレイアウト用に非表示のページ レイアウト テーブルを作成する方法を示します。

長い完全修飾クラス名を使用せずに済むよう、DOM 名前空間をインポートします。

import mlreportgen.dom.*

既存のドキュメントの新しいページに移動し、テーブルを説明するための見出しを追加します。

br = PageBreak();
append(rpt, br);
h = Heading(1, 'Multi-column Invisible Table');
h.Style = [h.Style {HAlign('center')}];
append(rpt, h);

ページ上のさまざまなコンポーネントのスタイルを決定します。メイン テーブルは非表示なので、境界線や区切りはありません。

mainTableStyle = {Width('100%'), Border('none') ColSep('none'), RowSep('none')};
dataTableStyle = {Border('solid'), ColSep('dotted'), RowSep('solid'),...
    OuterMargin('0pt', '0pt', '0pt', '0pt')};
dataTableEntriesStyle = {OuterMargin('0pt', '0pt', '0pt', '0pt'), VAlign('middle')};
histStyle = {InnerMargin('2pt', '2pt', '2pt', '2pt'), ...
    HAlign('center'), VAlign('bottom'), Width('5in'), Height('4in')};

500 回のランダムなコイン投げを表すサンプル データを作成します。次に、Text オブジェクト、FormalTable オブジェクト、および Image オブジェクトを作成して、データに関する情報を表示します。

coinflips = randi(2, [500, 10]);
numHeads = sum(coinflips-1,2);

p = Text(['The plot below shows the results from 500 trials in which a coin was flipped 10 times, ',...
    'and the number of times the coin landed on heads was counted. ',...
    'The table displays the results for the first 20 trials.']);

dataHeader = {'Trial', 'Heads'};
dataBody = [(1:20)', numHeads(1:20)];
dataTable = FormalTable(dataHeader, dataBody);
dataTable.TableEntriesStyle = [dataTable.TableEntriesStyle dataTableEntriesStyle]; 
dataTable.Header.Style = [dataTable.Header.Style {Bold}];
dataTable.Style = [dataTable.Style dataTableStyle];

histogram(numHeads);
title('Results')
xlabel('Number of Heads')
ylabel('Number of Trials')
saveas(gcf,'histogram_img.png');
close(gcf)
h = Image('histogram_img.png');

非表示テーブルを作成し、コンポーネントの追加を開始します。データ テーブルを最初の行に追加し、2 つの行にまたがるように指定します。

t = Table(2);
t.Style = [t.Style mainTableStyle];

row1 = TableRow;
row1.Style = [row1.Style {Width('100%')}];
entry1 = TableEntry;
append(entry1, dataTable);
entry1.RowSpan = 2;
entry1.Style = [entry1.Style {Width("40%")}];
append(row1, entry1);

Text オブジェクトを最初の行にも追加し、その行をテーブルに追加します。

entry2 = TableEntry(p);
entry2.Style = [entry2.Style {Width("60%")}];
append(row1, entry2);

append(t, row1);

新しい行を作成し、ヒストグラム イメージを唯一のエントリとして追加します。データ テーブルは、最初の列が 1 行目と 2 行目両方とも既に埋まっているため、ヒストグラムは 2 列目に配置されます。

row2 = TableRow;
entry3 = TableEntry;
h.Style = [h.Style histStyle];
append(entry3, h);
append(row2, entry3);
entry3.Style = [entry3.Style {Width('60%')}];

append(t,row2);

レポートを生成して表示します。

append(rpt,t);
close(rpt);
rptview(rpt);