メインコンテンツ

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

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

略式テーブル

この例では、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);