生活工程体验信仰哲学精神
精神世界
探索历史
哲学文学
艺术价值
信仰创造
境界审美
体验技术
技能工具
工程信息
医学生产
生活运用
操作能力

Delphi控制Word编程手记

1月9日 不回头投稿
  前几日对软件“文件整理助手”进行了完善。该软件有文本文件合并,文本文件内容的替换、插入、删除、为特定行首尾添加字符、清理空行等,以及文件批量替换、改名等功能。一同事见后,希望能对Word文件进行合并。尽管Word的“插入文件”可以实现这个功能,但不能在插入文件时调整插入的顺序,也不能控制插入的新文件是否另起一页。Word虽然功能强大,但还是有一定的局限性。当然,通过VBA录入脚本、编写宏代码也许可以实现这些复杂的功能。但囿于其缺乏通用性和移植性,对于不善于编程的人来说,还是存在诸多不便。因此,打算做一个“Word文档合并器”。刚做出这个决定时,以为很简单,因为Delphi的Servers组件页有WordApplication、WordDocument等控件,通过它们来控制全不是那么回事!以前做过涉及到Excel的小程序,没觉得有多难。首次跟Word打交道,竟给我来了个大大的下马威。以前用过函数,用过过程,也用过带参数的函数、带参数的过程。见过参数多的,但没见过打开、保存Word时尽然要用多达15个、16个参数的函数、过程。而且这些参数青一色地被定义为OleVariant类型,哪些应该是字符串,哪些应该是布尔型,或者专门为Word程序和文档定义的变量类型,没有详细的、系统的资料,只好摸着石头过河,慢慢研究了。经过几翻碰壁、几翻查证、几翻试验,把要实现的功能一步步拆解,逐一进行调试,通过后再重新组合起来试验。经过拆解、调试、组装三步曲之后,总算是完成了“Word文档合并器”这样一个小小的软件。为避免下次还重复这种繁琐的基础工作,现将有关技术要点总结于下:(本程序在Word2003中调试通过,其他版本未进行测试。网上找的一些资料在过程调用、函数语句及参数个数上有出入,可能与Word版本不一样有关。)说明:主窗体中放置以下三个与Word有关的控件:Word:TWordAWord应用程序接口Document1:TWordDWord文档oleShowDoc:TOleC用以显示Word文档【一】相关Word组件这里仅整理Delphi通过自身所提供的Server组件连接Office(Word)的有关资料,其他方法暂不研究。Delphi中提供的与操作Word有关的组件有共有5个,常用的有4个:1、TWordApplication对象。对应于MicrosoftWord应用程序,主要用来在Delphi程序中直接启动或关闭Word应用程序,建立或断开与Word程序的连接。2、TWordDocument对象。对应于Word文档,主要用来实现创建、销毁一个Word文档,文档的连接和断开,文档中的字符匹配查询,拼写和语法检查以及文档打印等功能。3、TWordFont对象。对应于Word的字体对象,用来设置Word文档中的字体属性。4、TWordParagraphFormat对象。对应于Word的段落对象,用来设置文档中的段落格式。【二】启动Word程序建立与Word应用程序的连接tryWord:TWordApplication。Create(nil);必加此句,否则WORD。Quit后无法再启用提示:“RPC服务器不可用”。word。CexceptApplication。MessageBox(无法连接Word。13101310请确认已正确安装了Word,并关闭了Word中的对话框!,提醒:,MbOkMBICONSTOP);E
  
  说明:不要“Word:TWordApplication。Create(nil);”也可建立与Word应用程序的连接,启动Word应用程序,但
  如果用Word。Quit或Word。Destroy退出或注销Word后,便无法再次与Word建立连接,提示“RPC服务器不可用”。添加
  此句后,便可随心所欲地启动、退出Word应用程序。【三】创建Word文件新建空白文档的函数原型:{Word。Documents。Add(varTemplate:OleVvarNewTemplate:OleVvarDocumentType:OleVvarVisible:OleVariant):WordD
  }
  由于在程序中需要多次调用Add函数,而函数中又不能直接使用变量的值,必须通过OleVariant型的变量名进行传递,
  为避免繁琐的变量定义和赋值,我将其简化为AddDoc过程:WordApplication建立空白文档过程procedureAddDoc(word:TWordADot:SNewDot,DocVisible:Boolean);打开文件varTemplate,NewTemplate,DocumentType,Visible:OleVbeginTemplate:D使用模板的名称,NewTemplate:NewD新建文档的类型,True表示为模板,False表示为文档DocumentType:EmptyP文档类型,默认为空白文档Visible:DocV打捞的窗口是否可见Word。Documents。Add(Template,NewTemplate,DocumentType,Visible);【四】打开Word文件打开文件的函数原型:{Word。Documents。Open(varFileName:OleVvarConfirmConversions:OleVvarReadOnly:OleVvarAddToRecentFiles:OleVvarPasswordDocument:OleVvarPasswordTemplate:OleVvarRevert:OleVvarWritePasswordDocument:OleVvarWritePasswordTemplate:OleVvarFormat:OleVvarEncoding:OleVvarVisible:OleVvarOpenAndRepair:OleVvarDocumentDirection:OleVvarNoEncodingDialog:OleVariant):WordD}由于在程序中需要多次调用Open函数,我将其简化只有2个参数的OpenDoc过程:WordApplication打开文件过程procedureOpenDoc(word:TWordAsFileName:string);var打开文件的参数FileName,CfCversions,ReadOnly,AddToRctFiles,PswDocument,PswTemplate,Revert,WPswDocument,WPswTemplate,Format,Encoding,Visible,OpenAndRepair,DocumentDirection,NoEncodingDialog:OleVbegin创建对象tryWord:TWordApplication。Create(nil);word。CexceptApplication。MessageBox(本机可能没有正确安装WORD!,提醒:,MbOkMBICONSTOP);E打开文件Word。Visible:FileName:sFileNCfCversions:ReadOnly:FAddToRctFiles:PswDocument:;PswTemplate:;Revert:WPswDocument:;文档密码WPswTemplate:;模板密码Format:EmptyPEncoding:;Visible:FOpenAndRepair:EmptyPDocumentDirection:EmptyPNoEncodingDialog:EmptyPWord。Documents。open(FileName,CfCversions,ReadOnly,AddToRctFiles,PswDocument,PswTemplate,Revert,WPswDocument,WPswTemplate,Format,Encoding,Visible,OpenAndRepair,DocumentDirection,NoEncodingDialog);【五】连接Word文件将新建的或打开的word文档通过TWordDocument对象的ConnectTo方法与TWordapplication实例建立关联。varDocInx:OleVbeginDocInx:1;Document1。ConnectTo(Word。ActiveDocument);Document1。ConnectTo(Word。Documents。Item(DocInx));【六】保存Word文件Word保存文件过程的原型:{Word。ActiveDocument。SaveAs(varFileName:OleVvarFileFormat:OleVvarLockComments:OleVvarPassword:OleVvarAddToRecentFiles:OleVvarWritePassword:OleVvarReadOnlyRecommended:OleVvarEmbedTrueTypeFonts:OleVvarSaveNativePictureFormat:OleVvarSaveFormsData:OleVvarSaveAsAOCELetter:OleVvarEncoding:OleVvarInsertLineBreaks:OleVvarAllowSubstitutions:OleVvarLineEnding:OleVvarAddBiDiMarks:OleVariant);}为避免繁琐地使用保存文件过程,精简为:WordApplication保存文件过程procedureSaveDoc(word:TWordAsFileName:string);var保存文件的参数FileName,FileFormat,LockComments,Password,AddToRecentFiles,WritePassword,ReadOnlyRecommended,EmbedTrueTypeFonts,SaveNativePictureFormat,SaveFormsData,SaveAsAOCELetter,Encoding,InsertLineBreaks,AllowSubstitutions,LineEnding,AddBiDiMarks:OleVbeginFileName:sFileNFileFormat:EmptyPLockComments:EmptyPPassword:EmptyPAddToRecentFiles:EmptyPWritePassword:EmptyPReadOnlyRecommended:EmptyPEmbedTrueTypeFonts:EmptyPSaveNativePictureFormat:EmptyPSaveFormsData:EmptyPSaveAsAOCELetter:EmptyPEncoding:EmptyPInsertLineBreaks:EmptyPAllowSubstitutions:EmptyPLineEnding:EmptyPAddBiDiMarks:EmptyPWord。ActiveDocument。SaveAs(FileName,FileFormat,LockComments,Password,AddToRecentFiles,WritePassword,ReadOnlyRecommended,EmbedTrueTypeFonts,SaveNativePictureFormat,SaveFormsData,SaveAsAOCELetter,Encoding,InsertLineBreaks,AllowSubstitutions,LineEnding,AddBiDiMarks);如果通过TWordDocument对象保存文件,则比较简单:Document1。SaveAs(newFileName);【七】插入Word文件Word插入文件过程的原型:{InsertFile(constFileName:WideSvarRange:OleVvarConfirmConversions:OleVvarLink:OleVvarAttachment:OleVariant);}向打开的Word文件中插入外部文件vari:ImyRange,CfCversions,Link,Attachment:OleVs:WideSbeginfori:0toList。Items。Count1dobeginmyRange:EmptyPCfCversions:EmptyPLink:EmptyPAttachment:EmptyPmyType:wdPageBif(chkAddNewPage。Checked)and(i0)thenWord。Selection。InsertBreak(myType);s:List。Items〔i〕;Word。Selection。InsertFile(s,myRange,CfCversions,Link,Attachment);如果在插入文件时,要另起一页,则可在插入文件前执行:varmyType:OleVmyType:wdPageBWord。Selection。InsertBreak(myType);插入“分隔符”的类型定义如下:constwdSectionBreakNextPage00000002;wdSectionBreakContinuous00000003;wdSectionBreakEvenPage00000004;wdSectionBreakOddPage00000005;wdLineBreak00000006;wdPageBreak00000007;wdColumnBreak00000008;wdLineBreakClearLeft00000009;wdLineBreakClearRight0000000A;wdTextWrappingBreak0000000B;如果要插入字符串,可以使用如下方法:Document1。Characters。Last。S选择最后字符Document1。Range。InseflAfter(要输入的文字13);【八】关闭Word文件关闭打开的Word文件{procedureClose(varSaveChanges:OleVvarOriginalFormat:OleVvarRouteDocument:OleVariant);}varSaveChanges,OriginalFormat,RouteDocument:OleVbeginDocument1。DDocument1。CSaveChanges:FOriginalFormat:EmptyPRouteDocument:EmptyPWord。Documents。Close(SaveChanges,OriginalFormat,RouteDocument);【九】退出Word程序退出WordbeginWord。DWord。D
  WORD。Q
  
  【十】其他相关操作varWORDAPP:TWORDdocument:TWordDitemindex:OleVtemplate,newtemplate,documenttype,visible:currrange:Rrow,col:Idirection:OleVdefaulttablebehvior,autofitbehvior:OleVcurrtable:Tmyrange:OleVsavefile:OleVbegintrytryWORDAPP:TWordApplication。Create(nil);WORDdocument:TWordDocument。Create(nil);exceptShowMessage(本机可能没有装WORD!);Eitemindex:1;WORDAPP。CWORDAPP。Visible:WORDAPP。Documents。AddOld(EmptyParam,EmptyParam);WORDdocument。ConnectTo(WORDAPP。Documents。Item(itemindex)asdocument);关闭拼写检查,因为这会浪费较多时间WORDAPP。Options。CheckSpellingAsYouType:FWORDAPP。Options。CheckGrammarAsYouType:F页面设置withWORDdocument。PageSetupdobeginPaperSize:wdPaperA4;wdPaperA400000007;;LeftMargin:WORDAPP。CentimetersToPoints(2。0);RightMargin:WORDAPP。CentimetersToPoints(2。0);TopMargin:WORDAPP。CentimetersToPoints(2。0);BottomMargin:WORDAPP。CentimetersToPoints(2。0);Orientation:wdOrientL横向打印centerHorizontally:T水平对齐方式写标题currrange:WORDdocument。Rcurrrange。InsertAfter(插入标题文字1310);currrange。Font。Size:14;currrange。Bold:1;currrange。ParagraphFormat。Alignment:wdAlignPageNumberC居中对齐加入表格direction:wdCollapseE定位到标题的下一行加入表格currrange。Collapse(direction);defaulttablebehvior:wdWord10ListB画边框线autofitbehvior:wdAutoFitWcol:DBGridEh1。DataSource。DataSet。FieldCount1;列数row:DBGridEh1。DataSource。DataSet。RecordCount1;行数下面两种方式也能通过myrange:WORDdocument。Content。End1;定位到标题的下一行加入表格currtable:WORDdocument。Tables。AddOld(WORDdocument。Range(myrange),row,col);currtable:WORDdocument。Tables。Add(currrange,row,col,defaulttablebehvior,autofitbehvior);WORDdocument。Tables。AddOld(currrange,row,col);currtable。Range。Paragraphs。Alignment:wdAlignParagraphL对齐方式左对齐写字段名及值withDBGridEh1。DataSource。DataSetdobeginforcol:1toFieldCount1do写字段名begincurrtable。Cell(1,col)。Range。Font。Name:宋体;currtable。Cell(1,col)。Range。Font。Size:12;currtable。Cell(1,col)。Range。Font。Bold:Integer(False);ifcol1thencurrtable。Cell(1,col)。Range。Text:序号elsecurrtable。Cell(1,col)。Range。Text:Fields〔col1〕。FieldNcurrtable。Columns。AutoFrow:2;FwhilenotEofdo写值beginforcol:1toFieldCount1dobeginifcol1thencurrtable。Cell(row,col)。Range。Text:IntToStr(row1)elsebegin
  if(Fields〔COL1〕。FieldName开始时间)or(Fields〔COL1〕。FieldName终止时间)then
  currtable。Cell(row,col)。Range。Text:FormatDateTime(yyyyMMdd,Fields〔COL
  1〕。AsDateTime)elsecurrtable。Cell(row,col)。Range。Text:Fields〔COL1〕。AsScurrtable。Cell(row,col)。Range。Font。Size:11;currtable。Cell(row,col)。Range。Font。Name:宋体;currtable。Cell(row,col)。Range。Font。Bold:Integer(False);inc(row);Ncurrtable。Columns。AutoFfinallyifTrim(savefilename)thenbeginsavefile:savefilename。WORDdocument。SaveAs(savefile);WORDdocument。DWORDAPP。DFreeAndNil(WORDdocument);FreeAndNil(WORDAPP);
  
搜索 投诉 评论 转载

红楼梦所有人物关系整理,看看对你绝对有帮助!热文聚热点网 第一代贾演:宁国公贾源:荣国公第二代贾代化:宁国公贾演之子,原任京营节度使,世袭一等神威将军。贾代善:荣国公贾源之子。史太君:即贾母。金陵世……薇娅“杀死”淘宝直播热文聚热点网 前有抖音兴趣电商野心勃勃,后有快手老铁经济紧追不舍,超级头部主播接连“阵亡”,淘宝直播又一次站上命运的岔路口。作者葡萄出品新摘商业评论淘宝直播曾是淘宝内容生态……第一次挫折作文热传聚热点网 第一次挫折作文在平时的学习、工作或生活中,大家都写过作文吧,根据写作命题的特点,作文可以分为命题作文和非命题作文。一篇什么样的作文才能称之为优秀作文呢?下面是小编为大家收……绚丽日食人间仰头同看作文热议聚热点网 绚丽日食人间仰头同看作文在平时的学习、工作或生活中,大家对作文都不陌生吧,作文是人们以书面形式表情达意的言语活动。写起作文来就毫无头绪?下面是小编帮大家整理的绚丽日食人间……北京民事律师子女满十八周岁父母可以不抚养吗?子女满十八周岁父 问:北京民事律师子女满十八周岁父母可以不抚养吗?子女满十八周岁父母还有监护权吗?律师解答:子女满十八周岁父母可以不抚养吗?法律规定父母支付抚养费的期限是到子女……自然的芬芳热传聚热点网 自然的芬芳微微晓光中,啾啾乌呜中,清晨,何等令人愉悦,披着厚重的毛衣,披着一身愉快心情,开始了每天的例行公的事清扫街道,妈妈总是在一股欢愉中,做着自己喜爱的事,总能感觉到……成长中,我学会了坚强作文热文聚热点网 成长中,我学会了坚强作文在日常学习、工作抑或是生活中,大家都经常接触到作文吧,根据写作命题的特点,作文可以分为命题作文和非命题作文。相信写作文是一个让许多人都头痛的问题,……校园青春年华热闻聚热点网 校园青春年华几何时曾,我们也会做世上最柔情的人,为校园中的一枝花低眉,一朵云驻足,一滴雨感动。只因为这三年的校园,这三年的生活,我已处处留情。三年,连我这从不计较时……Delphi控制Word编程手记热文聚热点网 前几日对软件“文件整理助手”进行了完善。该软件有文本文件合并,文本文件内容的替换、插入、删除、为特定行首尾添加字符、清理空行等,以及文件批量替换、改名等功能。一同事见后,希望能……记一次拔河比赛作文700字热博聚热点网 记一次拔河比赛作文700字拔河为双方各执绳一端进行角力的体育活动,属于中国的传统运动项目。下面小编整理收集了记一次拔河比赛作文700字,欢迎阅读!篇一:记一次拔河比……现当代名家:张石园山水作品欣赏热闻聚热点网 张石园(18981959)又名入玄,字克龢,一字蔼如,又号麻石翁,江苏武进人,上海中国画院画师上海文史馆员,擅山水画,其作工整森秀,笔力劲健,书法亦深具功力,对金石学也颇有研究……大海的风景作文热议聚热点网 大海的风景作文在现实生活或工作学习中,大家都写过作文吧,作文根据体裁的不同可以分为记叙文、说明文、应用文、议论文。你所见过的作文是什么样的呢?以下是小编收集整理的大海的风……
钱有多重要?车王舒马赫昏迷9年花费20亿,妻子变卖其飞机和别 宋霭龄活了多少岁(宋霭龄享年多少岁)热博聚热点网 鱿鱼属于鱼类吗鱿鱼是不是属于鱼类热闻聚热点网 30岁的队长,结婚还有孩子,同时还是布莱泽奥特曼的人间体?热 手脚麻木的原因是什么?热博聚热点网 seiko什么牌子的手表(日本精工石英表怎么样?热闻聚热点网 蛋白质食物有哪些(富含蛋白质的食物有哪些)热评聚热点网 室内哪里好玩(大人玩的游乐场所)热评聚热点网 珐琅(珐琅板到底值不值得买)热文聚热点网 打桩机钻头掉了为什么要水鬼捞上来?上来2万,上不来100万热 逍遥丸的功效与作用和适用人群(吃逍遥丸真的能”逍遥“吗?)热 AcFun热传聚热点网
c1科目二科目三多少分及格C1驾照的简介如何避免万能险骗局孕妇高血压是怎么引起的遗传和环境两个因素不可忽视夏天夜钓用什么味型的饵料,用什么鱼竿最新款越野车(测评新款越野车驭胜)关于体会父爱的作文iphone7发热严重卡顿职业核心能力课程改革背景下的职教教师专业化发展研关于诗朗诵比赛作文汇总10篇一年级上册统计教学说课稿名人的励志箴言两篇腾讯否认发币传闻:腾讯区块链不发行数字货币

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找新乡渭南铜川松江山南雅安松原荃湾淮北昭通平凉鞍山赤峰苗栗保亭池州渝北株洲陇南濮阳三沙秀山密云鸡西