加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

关于Matlab生成Word程序的修改意见

(2012-05-16 13:10:51)
标签:

杂谈

分类: Matlab

最近在看谢老师的Matlab生成Word的程序,尤其是大飞哥发了感谢贴之后,因为很早之前就在大飞的版块上看见那个帖子了,当时的效果可以说是惊呆了,但是很可惜没有深入研究下去,最后发现功能实在是太强大了,如果掌握这项技术,配合GUI,完全可以做出真正意义上的试验数据处理软件,因为它连结果记录都能直接写出来,都不用你人工去Word里面填写试验数据,虽然大飞哥和谢老师的程序都只是生成一个表格形式,其实稍加改动,完全可以让Matlab自动的去填写刚刚处理后的数据信息,Matlab自带了xlswrite函数,如果不需要改变单元格的属性,一般是够用了的.关键是Word,没有提供可直接读写的函数,需要用Matlab调用Word的服务器,利用VBA的方法在Word里面录制宏,用Matlab遥控Word自动生成数据和表格(这句话form 琛琛),听完琛琛的一席话,第一印象,哇塞,太专业了,也太恐怖了.可是看了谢老师的程序,以及在北京研讨会上PPT的内容后,好像也没想象中的那么难,用谢老师的话来讲,相关的资料太少了,所以谢老师留给我们的这些资料就尤其珍贵了.程序部分真的封装得很好,让人看得一目了然. 感觉步骤就是一步一步教你怎样用Word写你的内容,跟脚本GUI有点类似,我们平时用Word好比是GUIDE,通过选择属性即可,而Matlab写Word和脚本GUI则需要把属性一个一个定义.
       谢老师的程序移植性还是蛮强的,稍作修改就可以用于自己的项目,基本上感觉谢老师提供的不是程序而是一个模板,里面有text,有table,有图片,这些都是word里面平时用到的,我们所需要的只是把它们自由组合而已.最好还是看下谢老师的另外一个帖子,感觉那个帖子的解释,更加详细一点,网址如下:
http://www.chinavib.com/forum/thread-75703-1-3.html
       主程序:

function ceshi_Word

%利用MATLAB生成Word文档

  ceshi_Word

%

  Copyright 2009 - 2010 xiezhh.

  $Revision: 1.0.0.0 $  $Date: 2009/12/14 12:37:00 $

 

filespec_user = [pwd '\测试.doc'];

 

try   

    Word = actxGetRunningServer('Word.Application');

catch   

    Word = actxserver('Word.Application');

end;

 

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

 

if exist(filespec_user,'file');

    Document = Word.Documents.Open(filespec_user);   

else

    Document = 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.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('考试成绩');

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;
复制代码
可是,再研究的过程中,发现有2个位置需要和谢老师探讨一下.
         第一个位置是title = '试  卷  分  析';谢老师可能是为了让大家更好理解程序,所以变量都具有一定的意义,可是,反而犯了一个小错误,谢老师可以尝试在后面的插图程序里面加上标题,例如:title('统计直方图'),运行程序后会发现Matlab提示title的位数有问题,无法给图片加上标题,经过反复的研究,发现问题出现在前面,原来2个title相冲突了,这也正是Matlab里面的变量不能与自带函数重名的原因吧.所以我的个人建议是把前面的title改为"headline"更合适,无论是语法还是实际解释上面,呵呵.
         第二个位置是将figure的'visible'属性设置为了'off ',这个设置没有错误,也很好理解,不能让用户看见后台图片,可是谢老师可以做个测试,当您运行完您的程序以后,到Matlab的command window里画图,例如:ezplot('sin(x)') ,您会发现,不会自动出图,关掉matlab重启后,直接运行ezplot('sin(x)'),又会自动出图,再次运行完您的程序后,再在command window里画图,又不出图了,所以说问题可能还是出在您的程序里面.经过一翻排查,问题可能出现在把figure的'visible'属性设置为了'off ',我们平时的plot和ezplot都是无须定义figure,这是默认的,而您的程序却把figure的属性设置为了'off',造成了用户无法查看plot和ezplot的绘图结果,所以可以在delete(zft);的前面加上
'set(zft,'visible','on')',这样问题就可以解决了.
    以上2个地方是我调试自己程序的过程中发现的,本来以为是自己程序没有写完整,后来尝试了下谢老师您的程序,问题依然存在,如果说得有不对的地方,还望谢老师多多包涵,多多指正!
    PS:期待书籍早日到我手中,无比期待第一章的内容,这类资料真的很少,网上的资料基本上都是谢老师的一些经典帖子..

0

阅读 收藏 喜欢 打印举报/Report
后一篇:用VBA操作Word
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有