行と列にまたがるテーブル エントリのスパン
これらの例では、行と列にまたがるテーブル エントリを作成する方法を示します。
略式テーブル
この例では、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);