Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

横長テーブルをページに収める

この例では、横長テーブルをレポートに収める方法を示します。

この例のデータは、テキサス州オースティンの交通カメラ データの cell 配列を含む mat ファイルです。この cell 配列には、カメラの位置、そのステータス、電源がオンになった日付などの情報が含まれています。

交通カメラ データの cell 配列を含む Traffic_data.mat ファイルは、現在の作業ディレクトリにあるものとします。要件は、テーブルのすべての列が、幅 8.5 インチ、長さ 11 インチの用紙に縦向きで収まるようにテーブルを印刷することです。

テーブルの作成:

レポートにテーブルを含めるには、mlreportgen.dom.FormalTable オブジェクトを使用します。このオブジェクトにはテーブル本体およびオプションのテーブル ヘッダーとテーブル フッターがあります。

まず、MATLAB cell 配列データを含む mat ファイルをワークスペースに読み込みます。cell 配列データを使用して DOM 形式的テーブル オブジェクトを作成します。テーブルを読みやすくするために、テーブルの見出しを太字に設定し、テーブルの列区切り文字とテーブル コンテンツの間に左余白スペースを追加します。

load('traffic_data.mat');
tbl_header = traffic_camera_data(1,:);
traffic_camera_data(1,:) = [];

formalTable = mlreportgen.dom.FormalTable(tbl_header,traffic_camera_data);
formalTable.RowSep = "Solid";
formalTable.ColSep = "Solid";
formalTable.Border = "Solid";
formalTable.Header.TableEntriesStyle = [formalTable.Header.TableEntriesStyle,...
    {mlreportgen.dom.Bold(true)}];
formalTable.TableEntriesStyle = [formalTable.TableEntriesStyle,...
    {mlreportgen.dom.InnerMargin("2pt","2pt","2pt","2pt"),...
    mlreportgen.dom.WhiteSpace("preserve")}];

試行 1 回目: 幅 8.5 インチ、長さ 11 インチの既定の縦長ページに DOM 形式的テーブルを追加します。

長いクラス名を使用せずに済むよう、DOM およびレポートの API パッケージをインポートします。

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

レポートのコンテンツを保持するコンテナーを作成します。

% To create a Word report, change the output type from "pdf" to "docx". 
rpt = Report("TrafficCameraDataPortrait","pdf");

"Traffic Cameras in Austin" というタイトルの章を作成します。

chapter = Chapter("Title","Traffic Cameras in Austin");

作成したテーブルを章に追加し、レポートに章を追加します。

add(chapter, formalTable);
add(rpt, chapter);
close(rpt);

結果: 生成されたレポートにはテーブルが含まれていますが、テーブルの列が狭すぎます。テーブル全体を縦長のページに収めようとすると、判読できないテーブルが作成されてしまいます。

試行 2 回目: 幅 11 インチ、長さ 8.5 インチの横長のページに、横長テーブルを収めます。

import mlreportgen.dom.*
import mlreportgen.report.*;
import mlreportgen.utils.*

rpt = Report("TrafficCameraDataLandscape","pdf");
chapter = Chapter("Title","Traffic Cameras in Austin");

レポートの横方向レイアウトを true に設定します。テーブルを章に追加します。

rpt.Layout.Landscape = true;
add(chapter,formalTable);
add(rpt,chapter);
close(rpt);

結果: 横向きのレイアウトは縦向きのページ レポートよりも良いですが、多くの列が判読できず、テーブルも読みにくくなっています。

試行 3 回目: Report Generator TableSlicer ユーティリティを使用して、入力テーブルを複数のスライスにスライスします。その MaxCols プロパティは、テーブル スライスごとの最大列数を指定します。

まず、テーブルを 2 つのスライスに分割し、既定の幅 8.5 インチ×長さ 11 インチの縦長の用紙に印刷してみます。

import mlreportgen.dom.*
import mlreportgen.report.*;
import mlreportgen.utils.*

rpt = Report("TrafficCameraDataSlicing-1","pdf");
chapter = Chapter("Title","Traffic Cameras in Austin");

ここで、テーブル スライサー オブジェクトを作成し、入力として形式的テーブルを指定します。入力テーブルには 18 個の列があるため、2 つのスライスを作成するには、MaxCols プロパティを 9 に設定します。

テーブル スライサー ユーティリティには、入力テーブルをスライスして mlreportgen.utils.TableSlice オブジェクトを生成するスライス メソッドがあります。これらのオブジェクトには、スライスされたテーブルと、元の入力テーブルの開始列インデックスと終了列インデックスが含まれます。

slicer = mlreportgen.utils.TableSlicer("Table",formalTable,"MaxCols",9);
slices = slicer.slice();

開始インデックスと終了インデックスを使用して、カスタマイズしたタイトルを作成します。次に、カスタマイズしたスライス テーブルのタイトルとテーブル スライスを章に追加します。

for slice = slices
    str = sprintf("From column %d to column %d",slice.StartCol,slice.EndCol);
    para = Paragraph(str);
    para.Bold = true;
    para.Style = [para.Style,{KeepWithNext(true),...
        OuterMargin("0pt","0pt","5pt","0pt")}];
    add(chapter,para);
    add(chapter,slice.Table);
end

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

add(rpt,chapter);
close(rpt);

結果: 出力は最初の 2 回の試行よりも優れていますが、テーブルのスライスは読みにくく、互いに切り離されています。

試行 4 回目: これまでの試行の出力を基に、MaxCols 値を減らして 4 つのテーブル スライスを作成します。すべてのスライスで列を繰り返すには、RepeatCols プロパティを使用します。4 つのスライスすべてを接続するには、RepeatCols プロパティの値を 1 に設定し、すべてのテーブル スライスで Camera ID 列が繰り返されるようにします。

import mlreportgen.dom.*
import mlreportgen.report.*;
import mlreportgen.utils.*

rpt = Report("TrafficCameraDataSlicing-2","pdf");
chapter = Chapter("Title","Traffic Cameras in Austin");

MaxCols 値を 6 に設定し、RepeatCols 値を 1 に設定します。

slicer = mlreportgen.utils.TableSlicer("Table",formalTable,"MaxCols",...
    6,"RepeatCols",1);
slices = slicer.slice();

開始インデックスと終了インデックスを使用して、カスタマイズしたタイトルを作成します。カスタマイズしたスライス テーブルのタイトルとテーブル スライスを章に追加します。

for slice = slices
    str = sprintf("Repeated Column Index: %d ,SlicedColumns: From column %d to column %d",...
        slicer.RepeatCols,slice.StartCol, slice.EndCol);
    para = Paragraph(str);
    para.Bold = true;
    para.Style = [para.Style,{KeepWithNext(true),...
        OuterMargin("0pt","0pt","5pt","0pt")}];
    add(chapter,para);
    add(chapter,slice.Table);
end

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

add(rpt,chapter);
close(rpt);
rptview(rpt);

結果: 出力は読みやすく、テーブルを縦向きのページに印刷するという当初の要件を満たしています。入力テーブルのスタイルにより、太字のヘッダーと内側の余白がすべてのテーブル スライスで保持されています。

テーブル タイルは、読者がテーブル エントリのデータを理解できるようにカスタマイズされています。

Copyright 2018 The MathWorks, Inc