
在编写报告时,往往需要插入大量的图表,不仅工作内容重复,还对准确性要求非常高。如果靠人力去一点点复制粘贴可以说是对报告编写者心里和生理的双重折磨,让人非常崩溃。对于这种格式固定,内容重复的报告,如果能用程序自动生成那肯定是极好的,而且程序的编写想必也不会特别复杂。受到课题组师兄的启发,这里想到的方法是用MATLAB自动生成Word报告。
现在MATLAB生成Word文档有两种主流方法,一种是使用MATLAB自带的工具Report Generator,另一种是使用Office自带的COM组件接口实现对Word的操作。这里主要使用COM组件的实现方法,具体可见官网“Office Visual Basic for Applications (VBA) 参考 | Microsoft Learn”
首先是启动Word服务器,这里用actxserver实现,详情可见“使用MATLAB生成Word报告(1)——启动Word - 知乎 (zhihu.com)”
try % 如果Word服务器已打开,则直接返回其句柄
Word = actxGetRunningServer('Word.Application');
catch % 创建Word服务器
Word = actxserver('Word.Application');
end
set(Word,'Visible',1) %设置Word可见,也可使用 Word.Visible = 1;
ActiveDoc = Word.Documents.Add(); %打开新文档,可使用 ActiveDoc = Word.Documents.Open([Path '\test.docx']);打开现有文档
%文档、段落和格式相关的对象声明如下
Content = ActiveDoc.Content;
Selection = Word.Selection;
Paragraphformat = Selection.ParagraphFormat; 现在就可以开始输入文档了,这里用到的主要是Selection和Content对象,具体的实现方法如下
Content.Start = 0; % 起始点为0,即表示每次写入覆盖之前资料
Selection.Text = 'MATLAB生成的报告'; % 写入文本内容 可以看到已经成功生成了

图1 写入文本
当然仅仅写入文本肯定是不够的,还需要对文本字体等格式做出定义,为了实现这些操作,可以用下面的命令。可以看到,有关字体的操作都是在Selection.Font下进行的,这下面的Size/Name/Italic等都分别代表了字体的不同属性,这里定义不分先后顺序
Selection.Font.Name = 'Time New Roman'; %字体
Selection.Font.NameFarEast = '黑体'; %中文字体
Selection.Font.Size = 20; % 字号
Selection.Font.Bold = 0; % 不加粗
Selection.Font.Italic = 1; %斜体
Paragraphformat.Alignment = 'wdAlignParagraphCenter'; % 居中 段落对齐的命令Paragraphformat.Alignment输入的是Word中的枚举,具体定义也可以在 Office的官方文档中找到,运行的结果如下

图2 修改文字格式
完成这一步之后就要开始正文的书写了,换行开启新段需要用到下面命令
Selection.Start = Content.end; % 开始的地方在文档的结尾
Selection.TypeParagraph; % 插入一个新的空段落
Selection.Text = '正文部分'; 这里就可以发现,上面段落设定的文字格式是可以继续向下沿用的,因此,我们在开始新段时,如果字体格式发生改变,一定要记得重新修改格式

图3 写入正文但有BUG
在这里,增加对文字格式的定义如下
Selection.Start = Content.end;
Selection.TypeParagraph
Selection.Text = "正文部分";
Selection.Font.NameFarEast = '宋体'; %中文字体
Selection.Font.Name = 'Time New Roman'; %字体
Selection.Font.Size = 14; % 字号
Selection.Font.Bold = 0; % 不加粗
Selection.Font.Italic = 0; %斜体
Paragraphformat.Alignment = 'wdAlignParagraphLeft'; % 左对齐 可以看到,修改过后已经可以按我们想要的输出了

图5 正确的正文输入
补充:
通过以上的命令,已经可以将文字正常输入Word,但可以有几点需要注意的,首先就是字号是以磅为单位进行设置的,1磅 = 0.35146mm,字号对照表如下

图6 Word字号对照表
完成之后,不能忘记保存文件,保存方法如下
ActiveDoc.SaveAs2([pwd '\test.docx' ]) %文档保存至当前目录下的test.docx中
Word.Quit() %关闭Word服务器 本期主要介绍了Matlab与Word交互的基本操作,还有关于图表插入、样式定义、多级列表的介绍会在后续进行介绍