最近在进行一批来料的检验测试,一个个手动填写报告存图片太慢了,就有了种想要使用Matlab在分析完后数据可以自动生成PDF报告的想法,于是就去网上搜索了相关的资料,发现Matlab中文论坛上有xiezhh曾经发过的使用Matlab生成Word的一些功能代码。又看了些xiezhh别的帖子和一些别的小伙伴的补充,找到了相关代码,经过运行可以完美的实现功能,在此表示感谢。
其中蕴含了基本的表格操作(如合并单元格)和图片复制粘贴操作,对于我这次的需求已经是足够了,代码部分下面部分列出,其中添加了个人阅读时的一些注释,有助于理解。现阶段我也只是可以根据该代码进行部分更改完成自己的需求,深层次的理解暂时还没有达到。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 | function fun_word %利用MATLAB生成Word文档 % 原摘自xiezhh,根据论坛上的相关建议,做了稍微的改动和完善 filespec_user = [pwd '\测试.doc']; %===启用word调用功能======================================================== try Word = actxGetRunningServer('Word.Application'); catch Word = actxserver('Word.Application'); end Word.Visible = 1; % 使word为可见;或set(Word, 'Visible', 1); %===打开word文件,如果路径下没有则创建一个空白文档打开======================== if exist(filespec_user,'file'); Document = Word.Documents.Open(filespec_user); else Document = Word.Documents.Add; Document.SaveAs2(filespec_user); end %===格式定义=============================================================== Content = Document.Content; Selection = Word.Selection; Paragraphformat = Selection.ParagraphFormat; %===文档的页边距=========================================================== Document.PageSetup.TopMargin = 60; Document.PageSetup.BottomMargin = 45; Document.PageSetup.LeftMargin = 45; Document.PageSetup.RightMargin = 45; %========================================================================== %===文档组成部分============================================================ % 文档的标题及格式 headline = '报告'; Content.Start = 0; % 起始点为0,即表示每次写入覆盖之前资料 Content.Text = headline; Content.Font.Size = 16; % 字体大小 Content.Font.Bold = 1; % 字体加粗 Content.Paragraphs.Alignment = 'wdAlignParagraphCenter'; % 居中,wdAlignParagraphLeft/Center/Right % 文档的创建时间 Selection.Start = Content.end; % 开始的地方在上一个的结尾 Selection.TypeParagraph; % 插入一个新的空段落 % 插入时间 currentdate = datestr(now, 0); % 获取当前时间 Selection.Text = currentdate; % 当前时间作为输出 Selection.Font.Size = 12; % 字号 Selection.Font.Bold = 0; % 不加粗 Selection.MoveDown; %将所选内容向下移动,并返回移动距离的单位数 Paragraphformat.Alignment = 'wdAlignParagraphCenter'; % 居中 % 插入回车 Selection.TypeParagraph;% 插入一个新的空段落 Selection.Font.Size = 10.5;% 新的空段落字号 % 插入表格 Selection.Start = Content.end; Selection.TypeParagraph; Paragraphformat.Alignment = 'wdAlignParagraphLeft'; Selection.MoveDown; Tables = Document.Tables.Add(Selection.Range,12,9); % 插入一个12行9列的表格 DTI = Document.Tables.Item(1); % 表格句柄 DTI.Borders.OutsideLineStyle = 'wdLineStyleSingle'; % 最外框,实线 DTI.Borders.OutsideLineWidth = 'wdLineWidth150pt'; % 线宽 DTI.Borders.InsideLineStyle = 'wdLineStyleSingle'; % 所有的内框线条 DTI.Borders.InsideLineWidth = 'wdLineWidth150pt'; % 线宽 DTI.Rows.Alignment = 'wdAlignRowCenter'; %大表格居中 DTI.Rows.Item(8).Borders.Item(1).LineStyle = 'wdLineStyleNone'; % 第八行的上边线消失 DTI.Rows.Item(8).Borders.Item(3).LineStyle = 'wdLineStyleNone';% 第八行的下边线消失 DTI.Rows.Item(11).Borders.Item(1).LineStyle = 'wdLineStyleNone'; DTI.Rows.Item(11).Borders.Item(3).LineStyle = 'wdLineStyleNone'; % 设置行高,列宽 column_width = [53.7736,85.1434,53.7736,35.0094,... 35.0094,76.6981,55.1887,52.9245,54.9057]; row_height = [28.5849,28.5849,28.5849,28.5849,25.4717,25.4717,... 32.8302,312.1698,17.8302,49.2453,14.1509,18.6792]; for i = 1:9 DTI.Columns.Item(i).Width = column_width(i); end for i = 1:12 DTI.Rows.Item(i).Height = row_height(i); end % 设置垂直居中 for i = 1:12 % 行 for j = 1:9 % 列 DTI.Cell(i,j).VerticalAlignment = 'wdCellAlignVerticalCenter'; end end % 合并单元格 DTI.Cell(1, 4).Merge(DTI.Cell(1, 5)); % 第一行第四个到第五个合并 DTI.Cell(2, 4).Merge(DTI.Cell(2, 5)); DTI.Cell(3, 4).Merge(DTI.Cell(3, 5)); DTI.Cell(4, 4).Merge(DTI.Cell(4, 5)); DTI.Cell(5, 2).Merge(DTI.Cell(5, 5)); DTI.Cell(5, 3).Merge(DTI.Cell(5, 6)); DTI.Cell(6, 2).Merge(DTI.Cell(6, 5)); DTI.Cell(6, 3).Merge(DTI.Cell(6, 6)); DTI.Cell(5, 1).Merge(DTI.Cell(6, 1)); DTI.Cell(7, 1).Merge(DTI.Cell(7, 9)); DTI.Cell(8, 1).Merge(DTI.Cell(8, 9)); DTI.Cell(9, 1).Merge(DTI.Cell(9, 3)); DTI.Cell(9, 2).Merge(DTI.Cell(9, 3)); DTI.Cell(9, 3).Merge(DTI.Cell(9, 4)); DTI.Cell(9, 4).Merge(DTI.Cell(9, 5)); DTI.Cell(10, 1).Merge(DTI.Cell(10, 9));% 第10行第1个到第9个合并 DTI.Cell(11, 5).Merge(DTI.Cell(11, 9)); DTI.Cell(12, 5).Merge(DTI.Cell(12, 9)); DTI.Cell(11, 1).Merge(DTI.Cell(12, 4)); % 表格之后的段落 Selection.Start = Content.end; Selection.TypeParagraph; Selection.Text = '主管院长签字: 年 月 日'; Paragraphformat.Alignment = 'wdAlignParagraphRight'; Selection.MoveDown; % 定义表格中的内容 DTI.Cell(1,1).Range.Text = '课程名称'; DTI.Cell(1,3).Range.Text = '课程号'; DTI.Cell(1,5).Range.Text = '任课教师学院'; DTI.Cell(1,7).Range.Text = '任课教师'; DTI.Cell(2,1).Range.Text = '授课班级'; DTI.Cell(2,3).Range.Text = '考试日期'; DTI.Cell(2,5).Range.Text = '应考人数'; DTI.Cell(2,7).Range.Text = '实考人数'; DTI.Cell(3,1).Range.Text = '出卷方式'; DTI.Cell(3,3).Range.Text = '阅卷方式'; DTI.Cell(3,5).Range.Text = '选用试卷A/B'; DTI.Cell(3,7).Range.Text = '考试时间'; DTI.Cell(4,1).Range.Text = '考试方式'; DTI.Cell(4,3).Range.Text = '平均分'; DTI.Cell(4,5).Range.Text = '不及格人数'; DTI.Cell(4,7).Range.Text = '及格率'; DTI.Cell(5,1).Range.Text = '成绩分布'; DTI.Cell(5,2).Range.Text = '90分以上 人占 %'; DTI.Cell(5,3).Range.Text = '80---89分 人占 %'; DTI.Cell(6,2).Range.Text = '70--79分 人占 %'; DTI.Cell(6,3).Range.Text = '60---69分 人占 %'; DTI.Cell(7,1).Range.Text = ['试卷分析(含是否符合教学大纲、难度、知识覆'... '盖面、班级分数分布分析、学生答题存在的共性问题与知识掌握情况、教学中'... '存在的问题及改进措施等内容)']; DTI.Cell(7,1).Range.ParagraphFormat.Alignment = 'wdAlignParagraphLeft'; DTI.Cell(9,2).Range.Text = '签字 :'; DTI.Cell(9,4).Range.Text = '年 月 日'; DTI.Cell(10,1).Range.Text = '教研室审阅意见:'; DTI.Cell(10,1).Range.ParagraphFormat.Alignment = 'wdAlignParagraphLeft'; DTI.Cell(10,1).VerticalAlignment = 'wdCellAlignVerticalTop'; DTI.Cell(11,2).Range.Text = '教研室主任(签字): 年 月 日'; DTI.Cell(11,2).Range.ParagraphFormat.Alignment = 'wdAlignParagraphLeft'; DTI.Cell(8,1).Range.ParagraphFormat.Alignment = 'wdAlignParagraphLeft'; DTI.Cell(8,1).VerticalAlignment = 'wdCellAlignVerticalTop'; DTI.Cell(9,2).Borders.Item(2).LineStyle = 'wdLineStyleNone'; DTI.Cell(9,2).Borders.Item(4).LineStyle = 'wdLineStyleNone'; DTI.Cell(9,3).Borders.Item(4).LineStyle = 'wdLineStyleNone'; DTI.Cell(11,1).Borders.Item(4).LineStyle = 'wdLineStyleNone'; % 暂时没搞懂意思,貌似不用也不影响 Shape = Document.Shapes; ShapeCount = Shape.Count; if ShapeCount ~= 0; for i = 1:ShapeCount; Shape.Item(1).Delete; end end % 绘图并放置于表格单元(8,1) zft = figure('units','normalized','position',... [0.280469 0.553385 0.428906 0.251302],'visible','off'); % 定义句柄 % 绘图 set(gca,'position',[0.1 0.2 0.85 0.75]); data = normrnd(0,1,1000,1); hist(data); grid on; xlabel('考试成绩'); ylabel('人数'); hgexport(zft, '-clipboard'); % 将图片复制到剪切板 DTI.Cell(8,1).Range.Paragraphs.Item(1).Range.PasteSpecial; % 粘贴操作 Shape.Item(1).WrapFormat.Type = 3; Shape.Item(1).ZOrder('msoBringInFrontOfText'); delete(zft); % 删除句柄 Document.ActiveWindow.ActivePane.View.Type = 'wdPrintView'; Document.Save; % 保存文档 Word.Quit; % 关闭文档 |