适合页面中的宽表
此示例显示如何在报告中容纳宽表。
本例的数据是一个 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 清晰易读,满足了在纵向页面上打印表的原始要求。
输入表样式(具有粗体标题和内边距)在所有表切片中均保留。表图块是专门为帮助读者了解表条目数据而自定义的。