谁能帮我做个例子?关于word操作的! 1、通过delphi调用word,打开一个指定的模板;2、关闭word时,把它存到指定的路径里去。并指定文件名(在edit中输入)。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 联系方式:[email protected] 谢谢! 1\参考以下代码:procedure PrintReport4(DSR, AJXZ, CFSJ, JBAQ: PChar); stdcall;var Word, Doc, Fields:OleVariant;begin Word:=CreateOleObject('Word.Application'); Word.Visible:=True; Word.Documents.Add('C:\Customs\案件呈报表'); Doc := Word.ActiveDocument; Fields := Doc.FormFields; Fields.Item('DSR').Result := String(DSR); Fields.Item('AJXZ').Result := String(AJXZ); Fields.Item('CFSJ').Result := String(CFSJ); Fields.Item('JBAQ').Result := String(JBAQ);end;其中案件呈报表就是word模版文件。 2\控制从数据库中取文字添加到Word模板中,可以操作word中的表。可以向word贴图。你应该在模板中设定标志字符,然后用系统来查找这些标志字符,然后从数据库中取数据进行替换。可以多参看一下Office的在线帮助,多试一下吧。先告诉你如何替换文字吧。注意:要uses Word97。procedure openwordfile(Myword:TWordApplication;Myfile:string);//打开Word文档函数。//Myword:文档工程名称;Myfile:word文件名。var ItemIndex :OleVariant; FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate, Revert, WritePasswordDocument, WritePasswordTemplate, Format, MatchCase,MatchWholeWord,find1,rep1, MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, Wrap, Replace : OleVariant;begin Myword.Visible := false; FileName :=MyFile; confirmConversions := False; ReadOnly := False; AddToRecentFiles := False; PasswordDocument := ''; PasswordTemplate := ''; Revert := True; WritePasswordDocument := ''; WritePasswordTemplate := ''; Format := wdOpenFormatDocument; myWord.Documents.Open( FileName, ConfirmConversions, readOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate, Revert, WritePasswordDocument, WritePasswordTemplate, Format ); myword.Visible:=false;end;//打开Word文档函数(结束)Procedure RepData(MyDoc:TWordDocument;FindStr,RepStr:string);//利用数据库替换Word字符串函数//FindStr:被查找的字符串。RepStr:要替换的字符串。var MatchCase,MatchWholeWord,find1,rep1,Format, MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, Wrap, Replace : OleVariant;begin Find1:=FindStr; Rep1:=RepStr; MatchCase:=false; MatchWholeWord:=true; MatchWildcards:=false; MatchSoundsLike:=false; MatchAllWordForms:=false; Format:=true; Forward:=true; replace:=wdReplaceall;// WordApplication2.StartOfdocument; //到文首 {if} Mydoc.Range.Find.Execute( find1, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, Wrap, Format, Rep1, Replace );{ then showmessage('OK!!!!')} {else showmessage('finish!!');}end;以下是根据模板新建一个Doc文件。 FileName := Opendialog1.FileName; itemindex:=1; tempPlate:=Filename; newtemplate:=false; WordApplication1.Connect; WordApplication1.Visible:=true; WordApplication1.Documents.Add(TempPlate,newtemplate); WordDocument1.ConnectTo(WordApplication1.Documents.Item(itemindex)); 回复人:dingsg111(飞天) (2001-7-13 10:48:51) 得0分Windows支持三种基本的IPC(进程间通信)机制:动态链接库(DLL)中的共享数据段、Windows剪贴版(Clipboard)和动态数据交换DDE(Dynamic Data Exchange)。许多著名的Windows应用程序如Microsoft Word等都宣布支持DDE技术,并在程序中嵌入了DDE消息处理函数。而此类应用程序单在DDE技术上讲大多是作为一个DDE服务器形式存在的,这就允许用户通过自行编制的一些外围软件以DDE客户的身份对其进行连接,并通过向DDE服务器程序发送一些特定的宏命令来完成对服务器程序的动态控制,本文就以常用的Microsoft Word为例,讲述了在Delphi 5.0编程环境下如何编制DDE客户程序,使其动态控制Microsoft Word的一般方法。 二、 DDE的工作原理 DDE顾名思义,是提供对不同程序在运行期间实现对数据的动态交换的一种通用技术。Windows消息虽然是在不同程序窗口间传送信息的最佳手段,但一条消息只能包含两个参数(wParam和lParam),不能传送较多的信息。内存块是存放较多信息的重要手段,但不支持全局内存句柄的共享。DDE正是建立在Windows内部消息系统、全局原子和共享全局内存基础上的一种协议,用来协调Windows应用程序之间的数据交换和命令调用。 DDE协议使用三级命名:服务(service)、主题(topic)和数据项(item)来标识DDE所传递的数据单元。服务使应用程序具有了提供给其他程序的数据交换能力,一般服务就是应用程序的文件名,如Word的服务就是是Winword(可执行文件是Winword.exe);主题是对服务器有意义的信息单元,对于Word文档就是很好的主题,许多服务器都有默认的主题System,但无法知道服务器确切有那些主题,除非查阅应用程序的相关技术文档。每次DDE客户与服务程序之间的对话都是先由客户启动的,所以在每次客户启动之前,DDE服务器必须先投入运行,下面是一个典型的DDE会话流程的事务组成: 。客户程序自动会话,服务器程序响应。 。客户和服务器用下述方法交换数据: 。服务器应客户的请求向客户发送数据; 。客户主动想服务器发送数据; 。客户要求服务器在数据修改时发送数据(热数据连接); 。客户要求服务器在数据修改后发送通知(温数据连接); 。在客户的要求下,服务器执行一个命令。 。由客户或服务器中止会话。 三、 设计思路 首先,在开发工具的选择上,选择了提供有现成的DDE 系列组件的 Borland Delphi 5.0。既然以Microsoft Word作为要连接的服务器,在与其建立连接之前要先设定好连接的服务与主题,由于本例只要求通过本程序控制Word的一些操作动作,如打开新文件、关闭文件、插入表格等等,所以可以分别设定这两项为:"Winword"和"System",当设置好连接后就可以通过Delphi提供的DDEClientConv组件的OpenLink函数打开与这个服务的连接,剩下的工作就是向Word服务器发送宏命令,并通过组件向其发送执行宏的命令即可,用该组件的函数ExecuteMacro来实现之。 四、程序的实现 (一) 加入DDE客户端组件 新建一App工程WordDDE,然后在Component Palette组件条的System属性页里选择DdeClientConv组件,并把它拖放到窗体上。修改其Name 属性为DDEClient。 (二) 添加同DDE服务进行交互的代码 在工程上添加一个过程RunMacro,用于打开同Word服务器的链接,并通知服务器执行由Macro标识的宏命令,让Word按用户的意图完成响应的动作。完成之后由客户方断开这次连接,完成一次会话。下面是上述过程的实现代码: procedure TForm1.RunMacro(Macro:pChar); var pMacro:array[0..80] of Char; begin DDEClient.SetLink('Winword','System');{设置连接} DDEClient.OpenLink;{按设置打开连接} StrPCopy(pMacro,Macro); if Not DDEClient.ExecuteMacro(pMacro,false) then{执行宏命令} ShowMessage('Unable to Execute Macro'); DDEClient.CloseLink;{断开连接} end; (三) 宏命令的执行 宏(Macro)是客户程序要服务器完成的一些操作指令,对与特定的Microsoft Word 而言无非是些打开文件、插入分割符、复制粘贴字符等一些字处理方面的宏命令,这些宏命令完成的功能大多在Word的菜单下都能找到与之相匹配的菜单。如"关闭文件"菜单完成的功能就可以通过宏[FileClose]来完成。可以向窗口添加一个按钮或是菜单然后在其处理函数中添加执行宏的代码如下: procedure TForm1.N2Click(Sender: TObject); begin RunMacro('[FileNew]');{让Word创建一个新文件,宏[FileNew]由函数RunMacro通知Word} end; Word下有许多可供传送执行的宏命令,现将一些常用的宏罗列如下,以备实际编程时选用: [FileNew] …… 创建新文件 [FileClose] …… 关闭文件 [FileSave] …… 保存文件 [FilePrint] …… 打印文件 [FileExit] …… 退出Word [File1] …… 打开最近打开的文件,相应还有[File2]、[File3]等等 [EditCut] …… 剪切操作 [EditCopy] …… 复制操作 [EditPaste] …… 粘贴操作 [EditUndo] …… 恢复上一步 [EditRedo] …… 重做上一步 [EditClear] …… 清除操作 [EditSelectAll] …… 全选操作 [ViewNormal] …… 正常视图 [ViewPage] …… 页面视图 [ViewOutLine] …… 大纲视图 [InsertBreak] …… 插入分割符 [InsertIndex] …… 插入索引 [FormatNumber] …… 格式化项目符号和编号 [ToolsOptions] …… 工具的选项 [TableInsertTable] …… 插入表格 [TableInsertRow] …… 插入行 [TableDeleteRow] …… 删除行 [TableSplit] …… 拆分表格 [TableSelectRow] …… 选择行 [TableSelectColumn] …… 选择列 [TableSelectTable] …… 选择表格 [TableSort] …… 排序 [WindowNewWindow] …… 新建窗口 [Window1] …… 最近打开的窗口,响应还有[Window2]、[Window3]等等 [HelpIndex] …… 帮助的索引 [HelpAbout] …… 帮助的关于 小结:DDE技术向用户提供了一种更加集成的工作环境,最适合于不需要用户参与的动态数据交换。 通过上述这个例子,对DDE 的工作原理和编程思想有了一定的认识之后,可以用类似的方法实现同其他程序如Microsoft Execl的DDE动态交互。该程序在Windows 98下,由Borland Delphi 5.0编译通过。 一段控制WORD文档的程序,谨供参考。希望能提供一些思路。更详细的情况最好能去看一下Word的关于编程方面的帮助,应该是没有问题的。procedure TForm1.Button1Click(Sender: TObject);begin WordApplication1.Connect; WordApplication1.Visible := True; visible:=true; // wordapplication1.Documents.Add() WordApplication1.Documents.Add(EmptyParam,EmptyParam); WordDocument1.Connect; WordApplication1.ActiveWindow.View.Type_:= wdNormalView; WordApplication1.Selection.Font.Name :='黑体'; WordApplication1.Selection.Font.Size := 16; WordApplication1.Selection.ParagraphFormat.Alignment := wdAlignParagraphCenter; WordApplication1.Selection.TypeText('自定义表头内容'); WordApplication1.Selection.TypeParagraph; WordApplication1.Selection.TypeParagraph; WordApplication1.Selection.Font.Name := '宋体'; WordApplication1.Selection.Font.Size :=12; WordApplication1.Selection.ParagraphFormat.Alignment := wdAlignParagraphRight; WordApplication1.Selection.TypeText('日期'+formatdatetime('yyyy"年"mm"月"dd"日"',now)); WordApplication1.Selection.TypeParagraph; WordApplication1.Selection.TypeParagraph;//回车 WordApplication1.Selection.ParagraphFormat.Alignment := wdAlignParagraphLeft;end; form上放置以下控件:一个Tadoquery组件,名称为ADOQuery1; 一个TWordFont组件,名称为WordFont1; 一个TWordApplication组件,名称为WordApplication1; 一个TWordDocument1组件,名称为Doc; 一个TWordParagraphFormat组件,名称为ParaFmt; 一个TIMAGE组件,名称为IMAGE1; 一个TBUTTON组件,名称为Button1; procedure TFrm_TravilRDXL.EnterText;//自定义函数var S: Selection; MyFormat : Word; // Bitmap : TBitMap; AData :cardinal; APalette : hpalette;begin S := WordApplication1.Selection; WordFont1.ConnectTo(S.Font); S.TypeText('Word demo'); //加回车键,形成第一个段落:Doc.Paragraphs.Item(1) S.TypeParagraph; //输入文字 S.TypeText(txt_DateFrom.Text+'至'+txt_DateTo.text); //加回车键,形成第二个段落:Doc.Paragraphs.Item(2) S.TypeParagraph; S.TypeText('使用部门:'+'销售部'+#13); S.TypeText('时间范围:'+'2002-8-8至2002-8-28'+#13 ); S.TypeText('线路类型:'+'团体线'+#13); s.TypeText('线路等级:'+'豪华线'+#13); //加回车键,形成第三个段落:Doc.Paragraphs.Item(3) S.TypeParagraph; //--------------------------设置段落1属性-------------------// ParaFmt.ConnectTo(Doc.Paragraphs.Item(1).Format); //绑定WordFont1与Doc.Paragraphs.Item(1).Range.Font WordFont1.ConnectTo(Doc.Paragraphs.Item(1).Range.Font); //设置段落对齐方式 ParaFmt.Alignment := wdAlignParagraphCenter; //设置段落行距(磅) ParaFmt.SpaceAfter := 24; //画单水平线 ParaFmt.Borders.Item(3).LineStyle := wdLineStyleSingle; WordFont1.Size := 18; WordFont1.Name := 'Arial'; WordFont1.Bold := integer(True); WordFont1.ColorIndex:=5; //粉红色字体 //--------------------------设置段落2属性-------------------// ParaFmt.ConnectTo(Doc.Paragraphs.Item(2).Format); //绑定WordFont1与Doc.Paragraphs.Item(1).Range.Font WordFont1.ConnectTo(Doc.Paragraphs.Item(2).Range.Font); //设置段落对齐方式 ParaFmt.Alignment := wdAlignParagraphCenter; //设置段落行距(磅) ParaFmt.SpaceAfter := 12; WordFont1.Size := 18; WordFont1.Name := 'Arial';end;procedure TFrm_TravilRDXL.Button1Click(Sender: TObject);var i,j:integer;begin i:=2;//初始化 j:=1; WordApplication1.Connect; Doc.ConnectTo(WordApplication1.Documents.Add(EmptyParam, EmptyParam)); WordApplication1.Visible := True;//显示word文档 EnterText;//自定义函数---添加文本 WordApplication1.Selection.SetRange(100,100);//设定段落范围 doc.Tables.Add(WordApplication1.Selection.Range,ADOQuery1.RecordCount+1,5);//创建表格 doc.Tables.Item(1).Columns.Item(1).Width:=120;//设定第一列宽度//--------------------------设定第一列字体属性-----------------------// while j<6 do begin doc.Tables.item(1).cell(1,j).Range.Bold:=integer(true); WordFont1.ConnectTo(doc.Tables.item(1).cell(1,j).Range.Font); WordFont1.ColorIndex:=10; j:=j+1; end;//--------------------------向表格中添加数据----------------------------------------// doc.Tables.Item(1).Cell(1,1).Range.Text:='线路名称'; doc.Tables.Item(1).cell(1,2).Range.text:='人数'; doc.Tables.item(1).cell(1,3).Range.text:='销售额(元)'; doc.Tables.item(1).cell(1,4).Range.text:='毛利润'; doc.Tables.Item(1).cell(1,5).Range.text:='毛利润率'; while not ADOQuery1.Eof do begin doc.Tables.Item(1).Cell(i,1).Range.Text:=ADOQuery1.fieldbyname('linename').asstring; doc.Tables.Item(1).cell(i,2).Range.text:=ADOQuery1.Fieldbyname('STUFFNUM').asstring; doc.Tables.Item(1).cell(i,3).Range.text:=ADOQuery1.Fieldbyname('TOTALACCOUNT').asstring; doc.Tables.Item(1).cell(i,4).Range.text:=ADOQuery1.Fieldbyname('TOTAL').asstring; doc.Tables.Item(1).cell(i,5).Range.text:=ADOQuery1.Fieldbyname('ration').asstring; ADOQuery1.Next; i:=i+1; end;//----------------------------------------------------------------------// WordApplication1.Selection.SetRange(350,350);//设定段落范围 ParaFmt.ConnectTo(WordApplication1.Selection.Paragraphs.item(1).Format); ParaFmt.Borders.Item(3).ColorIndex:=6; ParaFmt.Borders.Item(3).LineStyle:=wdLineStyleSingle;//画底线//-----------设置段落字体----------------------------------------// WordFont1.ConnectTo(WordApplication1.Selection.Paragraphs.Item(1).Range.Font); WordFont1.Bold:=integer(true); WordFont1.Size:=16; //-----------------------------粘贴图形-------------------------// Image1.Picture.SaveToClipboardFormat(MyFormat,AData,APalette); Clipboard.SetAsHandle(MyFormat,AData); doc.Sentences.Last.Paste;//--------------------------插入记录-------------------------------------// doc.Range.InsertAfter(#13+'操作员:'+ G_username);//G_username为全局变量end; 我有Excel的,但原理都是一样的,并且Delphi自带的demo里有关于Word的Try ExcelApplication1.Connect;Except MessageDlg('Excel may not be installed', mtError, [mbOk], 0); Abort; End;ExcelApplication1.Workbooks.Open('C:\Program Files\Microsoft Office\Templates\unit.xlt',EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,0);ExcelApplication1.Visible[0]:=True;ExcelApplication1.Caption:='Excel报表';//ExcelApplication1.Workbooks.Add(Null,0);ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _Worksheet);row := 5;while not (query1.eof) do begin for i := 1 to query1.RecordCount do begin ExcelWorkSheet1.Cells.Item [row,1] := query1.Fields[0].AsString ; ExcelWorkSheet1.Cells.Item [row,2] := query1.Fields[1].AsString ; ExcelWorkSheet1.Cells.Item [row,3] := query1.Fields[2].AsString ; ExcelWorkSheet1.Cells.Item [row,4] := query1.Fields[3].AsFloat ; ExcelWorkSheet1.Cells.Item [row,5] := query1.Fields[4].AsFloat ; row := row + 1; query1.Next ; end; end;procedure TForm1.Button2Click(Sender: TObject);begin ExcelApplication1.Quit ;//释放掉变量 close;end; 求助:有关sql语句问题? 为什么用web service 无发保存上传信息 ? 会者不难: 怎样用API来循环播放一首mp3 TListView的Position定位问题 如何让query查询得的结果字段别名带括号? button1.click 送分啦 DBcombobox的简单问题 如何放大bmp图象,而又不失真,答得好的有50分 谁能给我一个delphi下的关于进程和端口关联的源码或者文章? 非常简单的问题 我领结婚证了,。。散分 我为什么无法将memo的内容发到系统剪贴板?
procedure PrintReport4(DSR, AJXZ, CFSJ, JBAQ: PChar); stdcall;
var
Word, Doc, Fields:OleVariant;
begin
Word:=CreateOleObject('Word.Application'); Word.Visible:=True; Word.Documents.Add('C:\Customs\案件呈报表');
Doc := Word.ActiveDocument; Fields := Doc.FormFields;
Fields.Item('DSR').Result := String(DSR);
Fields.Item('AJXZ').Result := String(AJXZ);
Fields.Item('CFSJ').Result := String(CFSJ);
Fields.Item('JBAQ').Result := String(JBAQ);
end;其中案件呈报表就是word模版文件。
可以向word贴图。
你应该在模板中设定标志字符,然后用系统来查找这些标志字符,然后从数据库中取数据进行替换。
可以多参看一下Office的在线帮助,多试一下吧。
先告诉你如何替换文字吧。注意:要uses Word97。procedure openwordfile(Myword:TWordApplication;Myfile:string);//打开Word文档函数。
//Myword:文档工程名称;Myfile:word文件名。
var
ItemIndex :OleVariant;
FileName, ConfirmConversions, ReadOnly, AddToRecentFiles,
PasswordDocument, PasswordTemplate, Revert,
WritePasswordDocument, WritePasswordTemplate, Format,
MatchCase,MatchWholeWord,find1,rep1,
MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
Wrap, Replace : OleVariant;
begin
Myword.Visible := false;
FileName :=MyFile;
confirmConversions := False;
ReadOnly := False;
AddToRecentFiles := False;
PasswordDocument := '';
PasswordTemplate := '';
Revert := True;
WritePasswordDocument := '';
WritePasswordTemplate := '';
Format := wdOpenFormatDocument;
myWord.Documents.Open( FileName, ConfirmConversions,
readOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate,
Revert, WritePasswordDocument, WritePasswordTemplate, Format );
myword.Visible:=false;
end;
//打开Word文档函数(结束)
Procedure RepData(MyDoc:TWordDocument;FindStr,RepStr:string);//利用数据库替换Word字符串函数
//FindStr:被查找的字符串。RepStr:要替换的字符串。
var
MatchCase,MatchWholeWord,find1,rep1,Format,
MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
Wrap, Replace : OleVariant;
begin
Find1:=FindStr;
Rep1:=RepStr;
MatchCase:=false;
MatchWholeWord:=true;
MatchWildcards:=false;
MatchSoundsLike:=false;
MatchAllWordForms:=false;
Format:=true;
Forward:=true;
replace:=wdReplaceall;
// WordApplication2.StartOfdocument; //到文首
{if} Mydoc.Range.Find.Execute( find1, MatchCase, MatchWholeWord,
MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
Wrap, Format, Rep1, Replace );{ then showmessage('OK!!!!')}
{else showmessage('finish!!');}
end;
以下是根据模板新建一个Doc文件。
FileName := Opendialog1.FileName;
itemindex:=1;
tempPlate:=Filename;
newtemplate:=false;
WordApplication1.Connect;
WordApplication1.Visible:=true;
WordApplication1.Documents.Add(TempPlate,newtemplate);
WordDocument1.ConnectTo(WordApplication1.Documents.Item(itemindex));
回复人:dingsg111(飞天) (2001-7-13 10:48:51) 得0分
Windows支持三种基本的IPC(进程间通信)机制:动态链接库(DLL)中的共享数据段、Windows剪贴版(Clipboard)和动态数据交换DDE(Dynamic
Data Exchange)。许多著名的Windows应用程序如Microsoft
Word等都宣布支持DDE技术,并在程序中嵌入了DDE消息处理函数。而此类应用程序单在DDE技术上讲大多是作为一个DDE服务器形式存在的,这就允许用户通过自行编制的一些外围软件以DDE客户的身份对其进行连接,并通过向DDE服务器程序发送一些特定的宏命令来完成对服务器程序的动态控制,本文就以常用的Microsoft
Word为例,讲述了在Delphi 5.0编程环境下如何编制DDE客户程序,使其动态控制Microsoft Word的一般方法。 二、 DDE的工作原理 DDE顾名思义,是提供对不同程序在运行期间实现对数据的动态交换的一种通用技术。Windows消息虽然是在不同程序窗口间传送信息的最佳手段,但一条消息只能包含两个参数(wParam和lParam),不能传送较多的信息。内存块是存放较多信息的重要手段,但不支持全局内存句柄的共享。DDE正是建立在Windows内部消息系统、全局原子和共享全局内存基础上的一种协议,用来协调Windows应用程序之间的数据交换和命令调用。 DDE协议使用三级命名:服务(service)、主题(topic)和数据项(item)来标识DDE所传递的数据单元。服务使应用程序具有了提供给其他程序的数据交换能力,一般服务就是应用程序的文件名,如Word的服务就是是Winword(可执行文件是Winword.exe);主题是对服务器有意义的信息单元,对于Word文档就是很好的主题,许多服务器都有默认的主题System,但无法知道服务器确切有那些主题,除非查阅应用程序的相关技术文档。每次DDE客户与服务程序之间的对话都是先由客户启动的,所以在每次客户启动之前,DDE服务器必须先投入运行,下面是一个典型的DDE会话流程的事务组成:
。客户程序自动会话,服务器程序响应。
。客户和服务器用下述方法交换数据:
。服务器应客户的请求向客户发送数据;
。客户主动想服务器发送数据;
。客户要求服务器在数据修改时发送数据(热数据连接);
。客户要求服务器在数据修改后发送通知(温数据连接);
。在客户的要求下,服务器执行一个命令。
。由客户或服务器中止会话。 三、 设计思路 首先,在开发工具的选择上,选择了提供有现成的DDE 系列组件的 Borland Delphi 5.0。既然以Microsoft
Word作为要连接的服务器,在与其建立连接之前要先设定好连接的服务与主题,由于本例只要求通过本程序控制Word的一些操作动作,如打开新文件、关闭文件、插入表格等等,所以可以分别设定这两项为:"Winword"和"System",当设置好连接后就可以通过Delphi提供的DDEClientConv组件的OpenLink函数打开与这个服务的连接,剩下的工作就是向Word服务器发送宏命令,并通过组件向其发送执行宏的命令即可,用该组件的函数ExecuteMacro来实现之。 四、程序的实现 (一) 加入DDE客户端组件 新建一App工程WordDDE,然后在Component
Palette组件条的System属性页里选择DdeClientConv组件,并把它拖放到窗体上。修改其Name 属性为DDEClient。 (二) 添加同DDE服务进行交互的代码 在工程上添加一个过程RunMacro,用于打开同Word服务器的链接,并通知服务器执行由Macro标识的宏命令,让Word按用户的意图完成响应的动作。完成之后由客户方断开这次连接,完成一次会话。下面是上述过程的实现代码:
procedure TForm1.RunMacro(Macro:pChar);
var pMacro:array[0..80] of Char;
begin
DDEClient.SetLink('Winword','System');{设置连接}
DDEClient.OpenLink;{按设置打开连接}
StrPCopy(pMacro,Macro);
if Not DDEClient.ExecuteMacro(pMacro,false) then{执行宏命令}
ShowMessage('Unable to Execute Macro');
DDEClient.CloseLink;{断开连接}
end; (三) 宏命令的执行 宏(Macro)是客户程序要服务器完成的一些操作指令,对与特定的Microsoft Word
而言无非是些打开文件、插入分割符、复制粘贴字符等一些字处理方面的宏命令,这些宏命令完成的功能大多在Word的菜单下都能找到与之相匹配的菜单。如"关闭文件"菜单完成的功能就可以通过宏[FileClose]来完成。可以向窗口添加一个按钮或是菜单然后在其处理函数中添加执行宏的代码如下: procedure TForm1.N2Click(Sender: TObject);
begin
RunMacro('[FileNew]');{让Word创建一个新文件,宏[FileNew]由函数RunMacro通知Word}
end; Word下有许多可供传送执行的宏命令,现将一些常用的宏罗列如下,以备实际编程时选用: [FileNew] …… 创建新文件
[FileClose] …… 关闭文件
[FileSave] …… 保存文件
[FilePrint] …… 打印文件
[FileExit] …… 退出Word
[File1] …… 打开最近打开的文件,相应还有[File2]、[File3]等等
[EditCut] …… 剪切操作
[EditCopy] …… 复制操作
[EditPaste] …… 粘贴操作
[EditUndo] …… 恢复上一步
[EditRedo] …… 重做上一步
[EditClear] …… 清除操作
[EditSelectAll] …… 全选操作
[ViewNormal] …… 正常视图
[ViewPage] …… 页面视图
[ViewOutLine] …… 大纲视图
[InsertBreak] …… 插入分割符
[InsertIndex] …… 插入索引
[FormatNumber] …… 格式化项目符号和编号
[ToolsOptions] …… 工具的选项
[TableInsertTable] …… 插入表格
[TableInsertRow] …… 插入行
[TableDeleteRow] …… 删除行
[TableSplit] …… 拆分表格
[TableSelectRow] …… 选择行
[TableSelectColumn] …… 选择列
[TableSelectTable] …… 选择表格
[TableSort] …… 排序
[WindowNewWindow] …… 新建窗口
[Window1] …… 最近打开的窗口,响应还有[Window2]、[Window3]等等
[HelpIndex] …… 帮助的索引
[HelpAbout] …… 帮助的关于 小结:DDE技术向用户提供了一种更加集成的工作环境,最适合于不需要用户参与的动态数据交换。
通过上述这个例子,对DDE 的工作原理和编程思想有了一定的认识之后,可以用类似的方法实现同其他程序如Microsoft
Execl的DDE动态交互。该程序在Windows 98下,由Borland Delphi 5.0编译通过。
一段控制WORD文档的程序,谨供参考。希望能提供一些思路。更详细的情况
最好能去看一下Word的关于编程方面的帮助,应该是没有问题的。
procedure TForm1.Button1Click(Sender: TObject);
begin
WordApplication1.Connect;
WordApplication1.Visible := True;
visible:=true;
// wordapplication1.Documents.Add()
WordApplication1.Documents.Add(EmptyParam,EmptyParam);
WordDocument1.Connect;
WordApplication1.ActiveWindow.View.Type_:= wdNormalView;
WordApplication1.Selection.Font.Name :='黑体';
WordApplication1.Selection.Font.Size := 16;
WordApplication1.Selection.ParagraphFormat.Alignment := wdAlignParagraphCenter;
WordApplication1.Selection.TypeText('自定义表头内容');
WordApplication1.Selection.TypeParagraph;
WordApplication1.Selection.TypeParagraph;
WordApplication1.Selection.Font.Name := '宋体';
WordApplication1.Selection.Font.Size :=12;
WordApplication1.Selection.ParagraphFormat.Alignment := wdAlignParagraphRight;
WordApplication1.Selection.TypeText('日期'+formatdatetime('yyyy"年"mm"月"dd"日"',now));
WordApplication1.Selection.TypeParagraph;
WordApplication1.Selection.TypeParagraph;//回车
WordApplication1.Selection.ParagraphFormat.Alignment := wdAlignParagraphLeft;
end;
form上放置以下控件:一个Tadoquery组件,名称为ADOQuery1;
一个TWordFont组件,名称为WordFont1;
一个TWordApplication组件,名称为WordApplication1;
一个TWordDocument1组件,名称为Doc;
一个TWordParagraphFormat组件,名称为ParaFmt;
一个TIMAGE组件,名称为IMAGE1;
一个TBUTTON组件,名称为Button1;
procedure TFrm_TravilRDXL.EnterText;//自定义函数
var
S: Selection;
MyFormat : Word;
// Bitmap : TBitMap;
AData :cardinal;
APalette : hpalette;begin
S := WordApplication1.Selection;
WordFont1.ConnectTo(S.Font); S.TypeText('Word demo');
//加回车键,形成第一个段落:Doc.Paragraphs.Item(1) S.TypeParagraph; //输入文字
S.TypeText(txt_DateFrom.Text+'至'+txt_DateTo.text);
//加回车键,形成第二个段落:Doc.Paragraphs.Item(2)
S.TypeParagraph; S.TypeText('使用部门:'+'销售部'+#13);
S.TypeText('时间范围:'+'2002-8-8至2002-8-28'+#13 );
S.TypeText('线路类型:'+'团体线'+#13);
s.TypeText('线路等级:'+'豪华线'+#13);
//加回车键,形成第三个段落:Doc.Paragraphs.Item(3)
S.TypeParagraph;
//--------------------------设置段落1属性-------------------//
ParaFmt.ConnectTo(Doc.Paragraphs.Item(1).Format);
//绑定WordFont1与Doc.Paragraphs.Item(1).Range.Font WordFont1.ConnectTo(Doc.Paragraphs.Item(1).Range.Font);
//设置段落对齐方式
ParaFmt.Alignment := wdAlignParagraphCenter;
//设置段落行距(磅)
ParaFmt.SpaceAfter := 24; //画单水平线
ParaFmt.Borders.Item(3).LineStyle := wdLineStyleSingle;
WordFont1.Size := 18;
WordFont1.Name := 'Arial';
WordFont1.Bold := integer(True);
WordFont1.ColorIndex:=5; //粉红色字体 //--------------------------设置段落2属性-------------------//
ParaFmt.ConnectTo(Doc.Paragraphs.Item(2).Format);
//绑定WordFont1与Doc.Paragraphs.Item(1).Range.Font WordFont1.ConnectTo(Doc.Paragraphs.Item(2).Range.Font);
//设置段落对齐方式
ParaFmt.Alignment := wdAlignParagraphCenter;
//设置段落行距(磅)
ParaFmt.SpaceAfter := 12;
WordFont1.Size := 18;
WordFont1.Name := 'Arial';end;
procedure TFrm_TravilRDXL.Button1Click(Sender: TObject);
var
i,j:integer;
begin
i:=2;//初始化
j:=1; WordApplication1.Connect; Doc.ConnectTo(WordApplication1.Documents.Add(EmptyParam, EmptyParam));
WordApplication1.Visible := True;//显示word文档 EnterText;//自定义函数---添加文本
WordApplication1.Selection.SetRange(100,100);//设定段落范围
doc.Tables.Add(WordApplication1.Selection.Range,ADOQuery1.RecordCount+1,5);//创建表格 doc.Tables.Item(1).Columns.Item(1).Width:=120;//设定第一列宽度//--------------------------设定第一列字体属性-----------------------// while j<6 do begin
doc.Tables.item(1).cell(1,j).Range.Bold:=integer(true);
WordFont1.ConnectTo(doc.Tables.item(1).cell(1,j).Range.Font);
WordFont1.ColorIndex:=10;
j:=j+1;
end;
//--------------------------向表格中添加数据----------------------------------------//
doc.Tables.Item(1).Cell(1,1).Range.Text:='线路名称';
doc.Tables.Item(1).cell(1,2).Range.text:='人数';
doc.Tables.item(1).cell(1,3).Range.text:='销售额(元)';
doc.Tables.item(1).cell(1,4).Range.text:='毛利润';
doc.Tables.Item(1).cell(1,5).Range.text:='毛利润率';
while not ADOQuery1.Eof do begin doc.Tables.Item(1).Cell(i,1).Range.Text:=ADOQuery1.fieldbyname('linename').asstring;
doc.Tables.Item(1).cell(i,2).Range.text:=ADOQuery1.Fieldbyname('STUFFNUM').asstring;
doc.Tables.Item(1).cell(i,3).Range.text:=ADOQuery1.Fieldbyname('TOTALACCOUNT').asstring;
doc.Tables.Item(1).cell(i,4).Range.text:=ADOQuery1.Fieldbyname('TOTAL').asstring;
doc.Tables.Item(1).cell(i,5).Range.text:=ADOQuery1.Fieldbyname('ration').asstring;
ADOQuery1.Next;
i:=i+1; end;//----------------------------------------------------------------------// WordApplication1.Selection.SetRange(350,350);//设定段落范围
ParaFmt.ConnectTo(WordApplication1.Selection.Paragraphs.item(1).Format);
ParaFmt.Borders.Item(3).ColorIndex:=6;
ParaFmt.Borders.Item(3).LineStyle:=wdLineStyleSingle;//画底线//-----------设置段落字体----------------------------------------//
WordFont1.ConnectTo(WordApplication1.Selection.Paragraphs.Item(1).Range.Font);
WordFont1.Bold:=integer(true);
WordFont1.Size:=16; //-----------------------------粘贴图形-------------------------//
Image1.Picture.SaveToClipboardFormat(MyFormat,AData,APalette);
Clipboard.SetAsHandle(MyFormat,AData);
doc.Sentences.Last.Paste;
//--------------------------插入记录-------------------------------------//
doc.Range.InsertAfter(#13+'操作员:'+ G_username);//G_username为全局变量
end;
Try
ExcelApplication1.Connect;
Except
MessageDlg('Excel may not be installed',
mtError, [mbOk], 0);
Abort;
End;
ExcelApplication1.Workbooks.Open('C:\Program Files\Microsoft Office\Templates\unit.xlt',EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,0);
ExcelApplication1.Visible[0]:=True;
ExcelApplication1.Caption:='Excel报表';
//ExcelApplication1.Workbooks.Add(Null,0);
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _Worksheet);
row := 5;
while not (query1.eof) do
begin
for i := 1 to query1.RecordCount do
begin
ExcelWorkSheet1.Cells.Item [row,1] := query1.Fields[0].AsString ;
ExcelWorkSheet1.Cells.Item [row,2] := query1.Fields[1].AsString ;
ExcelWorkSheet1.Cells.Item [row,3] := query1.Fields[2].AsString ;
ExcelWorkSheet1.Cells.Item [row,4] := query1.Fields[3].AsFloat ;
ExcelWorkSheet1.Cells.Item [row,5] := query1.Fields[4].AsFloat ;
row := row + 1;
query1.Next ;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
ExcelApplication1.Quit ;//释放掉变量
close;
end;