《量化投资:以MATLAB为工具》

MATLAB技术论坛

 找回密码
 注册账号
查看: 63187|回复: 379
收起左侧

[教程] [原创]利用MATLAB生成Word和Excel文档之案例教程

    [复制链接]
发表于 2010-8-11 11:15:37 | 显示全部楼层 |阅读模式
本帖最后由 xiezhh 于 2012-10-27 22:55 编辑

利用MATLAB生成统计报告或报表是一件非常有意义的事情,做这个事情的起因是本人每个学期末都要做好几张试卷分析,工作重复单调,并且周围很多人都有对类似的困扰。特别是当统计工作者面对大量相同格式的统计报表时,所做的工作往往只是重复性劳动,此时就需要一个模版,每次自动导入数据,自动生**们想要的报告,把人们从繁重的、重复的工作中解脱出来。基于这个考虑,本帖以案例的形式详细介绍如何利用MATLAB生成Word和Excel文档。读者可以参照本帖内容,生成自己的统计报告或报表。
注:更为详细的内容,请参阅本人(谢中华)编著的《MATLAB统计分析与应用:40个案例分析》,北京航空航天大学出版社出版
【例1】利用MATLAB生成Word文档
效果图:
word文档.JPG
源代码:
function ceshi_Word
%利用MATLAB生成Word文档
%   ceshi_Word
%
%   Copyright 2009 - 2010 xiezhh.
%   $Revision: 1.0.0.0 $  $Date: 2009/12/14 12:37:00 $

% 设定测试Word文件名和路径
filespec_user = [pwd '\测试.doc'];

% 判断Word是否已经打开,若已打开,就在打开的Word中进行操作,否则就打开Word
try
    % 若Word服务器已经打开,返回其句柄Word
    Word = actxGetRunningServer('Word.Application');
catch
    % 创建一个Microsoft Word服务器,返回句柄Word
    Word = actxserver('Word.Application');
end;

Word.Visible = 1;    % 或set(Word, 'Visible', 1);

% 若测试文件存在,打开该测试文件,否则,新建一个文件,并保存,文件名为测试.doc
if exist(filespec_user,'file');
    Document = Word.Documents.Open(filespec_user);     
    % Document = invoke(Word.Documents,'Open',filespec_user);
else
    Document = Word.Documents.Add;     
    % Document = invoke(Word.Documents, 'Add');
    Document.SaveAs(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;

Content.Start = 0;
title = '试  卷  分  析';
Content.Text = title;
Content.Font.Size = 16 ;
Content.Font.Bold = 4 ;
Content.Paragraphs.Alignment = 'wdAlignParagraphCenter';

Selection.Start = Content.end;
Selection.TypeParagraph;

xueqi = '( 2009  —  2010   学年 第一学期)';
Selection.Text = xueqi;
Selection.Font.Size = 12;
Selection.Font.Bold = 0; Selection.MoveDown;
paragraphformat.Alignment = 'wdAlignParagraphCenter';
Selection.TypeParagraph;
Selection.TypeParagraph;
Selection.Font.Size = 10.5;

Tables = Document.Tables.Add(Selection.Range,12,9);   

DTI = Document.Tables.Item(1);    % 或DTI = Tables;

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

% 产生标准正态分布随机数,画直方图,并设置图形属性
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('考试成绩');    % 为X轴加标签
ylabel('人数');       % 为Y轴加标签

% 将图形复制到粘贴板
hgexport(zft, '-clipboard');

% 将图形粘贴到当前文档里(表格的第8行第1列的单元格里),并设置图形版式为浮于文字上方
% Selection.Range.PasteSpecial;
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中,应将Document.SaveAs(filespec_user)改为Document.SaveAs2(filespec_user);

【例2】利用MATLAB生成Excel文档
效果图与前面的效果图类似
源代码:
  1. function ceshi_Excel
  2. %利用MATLAB生成Excel文档
  3. %   ceshi_Excel
  4. %
  5. %   Copyright 2009 - 2010 xiezhh.
  6. %   $Revision: 1.0.0.0 $  $Date: 2009/12/14 20:40:00 $

  7. filespec_user = [pwd '\测试.xls'];

  8. try
  9.     Excel = actxGetRunningServer('Excel.Application');
  10. catch
  11.     Excel = actxserver('Excel.Application');
  12. end;

  13. Excel.Visible = 1;    % set(Excel, 'Visible', 1);

  14. if exist(filespec_user,'file');
  15.     Workbook = Excel.Workbooks.Open(filespec_user);
  16.     % Workbook = invoke(Excel.Workbooks,'Open',filespec_user);
  17. else
  18.     Workbook = Excel.Workbooks.Add;
  19.     % Workbook = invoke(Excel.Workbooks, 'Add');
  20.     Workbook.SaveAs(filespec_user);
  21. end

  22. Sheets = Excel.ActiveWorkbook.Sheets;    % Sheets = Workbook.Sheets;
  23. Sheet1 = Sheets.Item(1);
  24. Sheet1.Activate;

  25. Sheet1.PageSetup.TopMargin = 60;
  26. Sheet1.PageSetup.BottomMargin = 45;
  27. Sheet1.PageSetup.LeftMargin = 45;
  28. Sheet1.PageSetup.RightMargin = 45;

  29. RowHeight = [26,22,15,29,37,29,29,25,25,36,280,31,40,29,15,24]';
  30. Sheet1.Range('A1:A16').RowHeight = RowHeight;
  31. Sheet1.Range('A1:H1').ColumnWidth = [9,15,9,9,9,9,9,9];

  32. Sheet1.Range('A1:H1').MergeCells = 1;
  33. Sheet1.Range('A2:H2').MergeCells = 1;
  34. Sheet1.Range('A8:A9').MergeCells = 1;
  35. Sheet1.Range('B8:D8').MergeCells = 1;
  36. Sheet1.Range('E8:H8').MergeCells = 1;
  37. Sheet1.Range('B9:D9').MergeCells = 1;
  38. Sheet1.Range('E9:H9').MergeCells = 1;
  39. Sheet1.Range('A10:H10').MergeCells = 1;
  40. Sheet1.Range('A11:H11').MergeCells = 1;
  41. Sheet1.Range('A12:H12').MergeCells = 1;
  42. Sheet1.Range('A13:H13').MergeCells = 1;
  43. Sheet1.Range('A14:H14').MergeCells = 1;
  44. Sheet1.Range('D16:H16').MergeCells = 1;

  45. Sheet1.Range('A4:H14').Borders.Weight = 3;
  46. Sheet1.Range('A10:H12').Borders.Item(3).Linestyle = 0;
  47. Sheet1.Range('A10:H12').Borders.Item(4).Linestyle = 0;
  48. Sheet1.Range('A13:H13').Borders.Item(4).Linestyle = 0;
  49. Sheet1.Range('A14:H14').Borders.Item(3).Linestyle = 0;

  50. Sheet1.Range('A1:H9').HorizontalAlignment = 3;
  51. Sheet1.Range('A4:A9').HorizontalAlignment = 6;
  52. Sheet1.Range('C4:C7').HorizontalAlignment = 6;
  53. Sheet1.Range('E4:E7').HorizontalAlignment = 6;
  54. Sheet1.Range('G4:G7').HorizontalAlignment = 6;
  55. Sheet1.Range('A10:H10').HorizontalAlignment = 6;
  56. Sheet1.Range('A11:H11').HorizontalAlignment = 6;    % -4130
  57. Sheet1.Range('A11:H11').VerticalAlignment = 1;
  58. Sheet1.Range('A12:H12').HorizontalAlignment = 4;
  59. Sheet1.Range('A13:H13').VerticalAlignment = 1;
  60. Sheet1.Range('A14:H14').HorizontalAlignment = 4;
  61. Sheet1.Range('D16:H16').HorizontalAlignment = 4;

  62. Sheet1.Range('A1').Value = '试  卷  分  析';
  63. Sheet1.Range('A2').Value = '( 2009  —  2010   学年 第一学期)';
  64. Sheet1.Range('A4:H4').Value = {'课程名称','','课程号',...
  65.     '','任课教师学院','','任课教师',''};
  66. Sheet1.Range('A5:H5').Value = {'授课班级','','考试日期',...
  67.     '','应考人数','','实考人数',''};
  68. Sheet1.Range('A6:H6').Value = {'出卷方式','','阅卷方式',...
  69.     '','选用试卷A/B','','考试时间',''};
  70. Sheet1.Range('A7:H7').Value = {'考试方式','','平均分',...
  71.     '','不及格人数','','及格率',''};
  72. Sheet1.Range('A8').Value = '成绩分布';
  73. Sheet1.Range('B8').Value = '90分以上       人占        %';
  74. Sheet1.Range('E8').Value = '80---89分        人占        %';
  75. Sheet1.Range('B9').Value = '70---79分      人占        %';
  76. Sheet1.Range('E9').Value = '60---69分        人占        %';
  77. Sheet1.Range('A10').Value = ['试卷分析(含是否符合教学大纲、难度、知识覆'...
  78.     '盖面、班级分数分布分析、学生答题存在的共性问题与知识掌握情况、教学中'...
  79.     '存在的问题及改进措施等内容)'];
  80. Sheet1.Range('A12').Value = '签字 :                      年     月     日';
  81. Sheet1.Range('A13').Value = '教研室审阅意见:';
  82. Sheet1.Range('A14').Value = '教研室主任(签字):             年    月    日';
  83. Sheet1.Range('D16').Value = '主管院长签字:                  年    月    日';

  84. Sheet1.Range('A4:H12').Font.size = 10.5;
  85. Sheet1.Range('A1').Font.size = 16;
  86. Sheet1.Range('A1').Font.bold = 2;

  87. Shapes = Sheet1.Shapes;
  88. if Shapes.Count ~= 0;
  89.     for i = 1 : Shapes.Count;
  90.         Shapes.Item(1).Delete;
  91.     end;
  92. end;

  93. zft = figure('units','normalized','position',...
  94. [0.280469 0.553385 0.428906 0.251302],'visible','off');
  95. set(gca,'position',[0.1 0.2 0.85 0.75]);
  96. data = normrnd(75,4,1000,1);
  97. hist(data);
  98. grid on;
  99. xlabel('考试成绩');
  100. ylabel('人数');
  101. hgexport(zft, '-clipboard');

  102. Sheet1.Range('A11').Select;
  103. Sheet1.Paste    % Sheet1.PasteSpecial;

  104. delete(zft);
  105. Workbook.Save   % 保存文档
复制代码
发表于 2017-12-5 22:55:14 | 显示全部楼层
         
参与/回复主题关闭
RE: [原创]利用MATLAB生成Word和Excel文档之案例教程 [修改]         
参与/回复主题关闭
RE: [原创]利用MATLAB生成Word和Excel文档之案例教程 [修改]
回复 支持 反对

使用道具 举报

发表于 2017-7-30 10:49:04 | 显示全部楼层
非常感谢您的分享与帮助,施主才华横溢,功德无量。
回复 支持 反对

使用道具 举报

发表于 2016-5-25 20:12:30 | 显示全部楼层
最近在用MATLAB和Excel做数据库,有帮助
回复 支持 反对

使用道具 举报

发表于 2010-8-11 14:31:55 | 显示全部楼层
谢老师的精华之作,不能不顶。
发表于 2010-8-11 14:32:15 | 显示全部楼层
发表于 2010-8-11 14:46:12 | 显示全部楼层
很强大,谢谢分享啊!!
发表于 2010-8-11 14:48:37 | 显示全部楼层
发表于 2010-8-11 15:09:57 | 显示全部楼层
呵呵 学习啦 十分感谢老师。
发表于 2010-8-11 16:52:44 | 显示全部楼层
发表于 2010-8-11 21:42:38 | 显示全部楼层
回复 7# chuangxin09


    太强大了
发表于 2010-8-11 21:43:30 | 显示全部楼层
回复 1# xiezhh


    狂顶
发表于 2010-8-11 22:03:16 | 显示全部楼层
多谢分分享, 看看哦_smile_
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|MATLAB技术论坛|Simulink仿真论坛 ( 蜀ICP备19014457号 

GMT+8, 2020-10-31 09:45 , Processed in 0.058097 second(s), 14 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表