主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

适合页面中的宽表

此示例显示如何在报告中容纳宽表。

本例的数据是一个 mat 文件,其中包含来自德克萨斯州奥斯汀的交通摄像头数据的元胞数组。该元胞数组包含摄像机位置、状态和开启日期等信息。

我们假设包含交通摄像头数据元胞数组的 traffic_data.mat 文件位于当前工作目录中。要求打印表,以便其所有列都适合纵向放置在宽 8.5 英寸、长 11 英寸的纸张上。

创建表:

要在报告中包含表,请使用 mlreportgen.dom.FormalTable 对象。该对象有一个表体和一个可选的表头和表脚。

首先,将包含 MATLAB 元胞数组数据的 mat 文件加载到工作区。使用元胞数组数据创建 DOM Formal Table 对象。为了使表更易于阅读,请将表标题设置为粗体,并在表列分隔线和表内容之间添加左边距空间。

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

创建一个名为“奥斯汀的交通摄像头”的章节。

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

将创建的表添加到章节中,并将章节添加到报告中。

add(chapter, formalTable);
add(rpt, chapter);
close(rpt);
rptview(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);
rptview(rpt);

结果:虽然横向布局比纵向页面报告更好,但许多列不清晰,表也不易于阅读。

试验编号 3:使用报告生成器 TableSlicer 实用工具将输入表切成多个片。其 MaxCols 属性指定每个表切片的最大列数。

首先,尝试将表分成两部分,并将它们打印在默认的 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 列,因此要创建两个切片,请将 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);
rptview(rpt);

结果:输出比前两次试验更好,但表切片难以阅读并且彼此不相连。

试验编号 4:根据迄今为止的试验输出,减少 MaxCols 值以创建 4 个表切片。使用 RepeatCols 属性在所有切片中重复列。要连接所有 4 个切片,请将 RepeatCols 属性值设置为 1,以便在每个表切片中重复相机 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);

结果:Output 清晰易读,满足了在纵向页面上打印表的原始要求。

输入表样式(具有粗体标题和内边距)在所有表切片中均保留。表图块是专门为帮助读者了解表条目数据而自定义的。