delphi操做word

delphi操做word
1、Delphi程序啓動Word
採用CreateOleObjects的方法來啓動Word,調用VBA代碼,具體實現過程爲:
首先使用GetActiveOleObject('Word.Application')判斷當前內存中是否存在Word程序,若是存在,
則直接鏈接,若是沒有Word程序,則使用CreateOleObject('Word.Application')啓動Word
2、Delphi程序新建Word文稿
格式:WordDocuments.Add(Template,NewTemplate,DocumentType,Visible)
Template: 使用模板的名稱,
NewTemplate: 新建文檔的類型,True表示爲模板,False表示爲文檔
DocumentType: 文檔類型,默認爲空白文檔
Visible: 打撈的窗口是否可見
舉例:Doc_Handle:=Word_Ole.Documents.Add(Template:='C:\Temlate.dot',NewTemplate:=False);
3、Delphi程序打開Word文稿
格式:WordDocuments.Open(FileName,ConfirmConversions,ReadOnly,PassWordDocument,
PasswordTemplate,Revent,WritePasswordDocument,WritePassWordTemplate,
Format,Encoding,Visible)
FileName: 文檔名(包含路徑)
Confirmconversions: 是否顯示文件轉換對話框
ReadOnly: 是否以只讀方式打開文檔
AddToRecentFiles: 是否將文件添加到"文件"菜單底部的最近使用文件列表中
PassWordDocument: 打開此文檔時所須要的密碼
PasswordTemplate: 打開此模板時所須要的密碼
Revert: 若是文檔已經,是否從新打開文檔
WritePasswordDocument: 保存對文檔更改時所須要的密碼
WritePasswordTemplate: 保存對模板進行更改時所須要的密碼
Format: 打開文檔時所需使用的文件轉換器
Encoding: 所使用的文檔代碼頁
Visible: 打開文檔的窗口是否可見
舉例:
Doc_Handle:=Word_Ole.Documents.open(FileName:=Doc_File,ReadOnly:=False,
AddToRecentFiles:=False);
4、Delphi程序保存Word文稿
格式:WordDocuments.SaveAs(FileName, FileFormat, LockComments, Password,
AddToRecentFiles, WritePassword, ReadOnlyRecommended,
EmbedTrueTypeFonts, SaveNativePictureFormat, SaveFormsData,
SaveAsAOCELetter)
FileName: 文件名。默認爲當前文件夾和文件名。
FileFormat 文檔保存的格式。
LockComments 若是爲 True,則此文檔只容許進行批註。
Password 打開文檔時的口令。
AddToRecentFiles 若是爲True,則將文檔添至"文件"菜單中最近使用的文檔列表中。
WritePassword 保存對文檔的修改所需的口令。
ReadOnlyRecommended 若是爲 True,在每次打開文檔時,Word 將建議用戶採用只讀方式。
EmbedTrueTypeFonts 若是爲 True,則將文檔與 TrueType 字體一塊兒保存。
SaveNativePictureFormat 若是爲 True,則從其餘系統平臺(例如 Macintosh)導入的圖形僅保存其 Windows 版本。
SaveFormsData 若是爲 True,則將窗體中用戶輸入的數據存爲一條數據記錄。
SaveAsAOCELetter 若是文檔包含一個附加,當此屬性值爲 True 時,將文檔存爲一篇 AOCE 信箋(同時保存郵件)。
舉例:
Word_Ole.Documents.SaveAs(FileName:=Doc_File,FileFormat=wdFormatDocument,
AddToRecentFiles=False);
5、從數據庫讀取文件到本地硬盤和從本地硬盤讀取文件到數據庫
在數據庫上使用Image二進制字段保存,使用Stream流的方式。
建立文件流:
Word_FileStream:=TFileStream.Create(Target_Name,fmOpenWrite or fmCreate);
Word_FileStream.Position:=0;
保存到數據庫的Image字段:
TBlobField(AdoQuery1.FieldByName(Column_Name)).SaveToStream(Word_FileStream);
從數據庫讀取文件到本地硬盤:
TBlobField(ADOQuery1.FieldByName(Column_Name)).loadfromStream(Word_FileStream);
釋放文件流:
Word_FileStream.Free;
6、全局消息的定義
由於word和Delphi程序是兩個軟件,相互之間通信比較麻煩,因此使用全局消息的方法進行。
全局消息必須首先註冊,Windows返回系統空閒的消息號,當註冊的消息相同時,
Windows系統返回同一個值,這樣就保證了使用這個消息號在兩個程序之間通信。
定義消息的辦法:
szMessageString: pchar = 'XIDIAN_11_Stone';
FMyJoinMessage := RegisterWindowMessage(szMessageString);
發送消息的方法:
SendMessage(對方句柄,消息,消息附帶短變量,消息附帶長變量)
7、Delphi程序接收消息的方法
Delphi接收消息有兩種,一是重載特定消息,二是重載WndProc函數,在裏面選擇相應消息進行處理。
法一,每次只能處理一條消息,而法二可以同時處理多條消息。
對於法二,聲明以下:
procedure WndProc(var Message: TMessage);override
必須注意,使用時須要在處理完本身消息處理後繼承WndProc(Message)函數,不然系統會崩潰!
8、Word中Combo對話框的動態生成以及Change事件
創建類模塊Combohander,在內部定義事件
Public WithEvents ComboBoxEvent As Office.CommandBarComboBox
定義Combo控件產生事件的模塊
Dim ctlComboBoxHandler As New ComboBoxHandler
產生Combo對話框
Set Cbo_ChooseDoc = CommandBars("添加的菜單").Controls.Add(Type:=msoControlComboBox, Temporary:=True)
進行文件句柄設置,以產生Combo_Change事件
Set ctlComboBoxHandler.ComboBoxEvent = Cbo_ChooseDoc
產生事件後,在類模塊Combohander內選擇ComboBoxEvent的Change事件,便可書寫事件代碼
Sub ComboBoxEvent_Change(ByVal Ctrl As Office.CommandBarComboBox)
9、一些Word的事件
VBA代碼中處理的Word事件有:Document_Close
Application事件中須要處理的有:DocumentBeforeClose,DocumentChange。
Document_Close:事件在文檔關閉時產生事件
DocumentBeforeClose:在文檔被關閉之前先於Word判斷文檔是否保存,給出相應提示並進行相應處理。
DocumentChange:文檔切換,在文檔從本身修改的文稿和其餘人修改的文稿之間切換產生事件,
主要處理設置文檔權限等。
在Dephi 5中提供了一組Servers組件,實現了與Office的無縫結合
  一、在當前程序目錄下創建以標題字段命名的Word文件
  exepath:=application.ExeName;
  for index:=1 to length(exepath) do
  if exepath[index]='\' then
  i:=index;
  exepath:=copy(exepath,1,i);
  doc_file:=exepath+mc+'.doc';
  以標題字段「mc」命名Word文件
  try
  Wordapplication1.connect;
  except
  messagedlg('沒有安裝Word',mterror,[mbok],0);
  abort;
  end;
  Wordapplication1.Caption := 'XX計劃書';
  Wordapplication1.visible := true;
  Worddocument1.activate;
  二、設置紙張大小
  Wordapplication1.ActiveDocument.PageSetup.PageWidth:=XXX;
  Wordapplication1.ActiveDocument.PageSetup.PageHeight:=XXX;
  Wordapplication1.ActiveDocument.PageSetup.LeftMargin := XX;
  //設置左邊距
  Wordapplication1.ActiveDocument.PageSetup.rightMargin := XX; 
  //設置右邊距
  三、插入頁碼
  var fpage,pagea:olevariant;
  fpage:=true;
  pagea:=wdAlignPageNumberCenter;
  Wordapplication1.activedocument.sections.item(1).Footers.item(1).PageNumbers.Add(pagea,fpage);
  四、設置頁面橫向打印
  s:=Wordapplication1.selection.start;
  e:=Wordapplication1.selection.start;
  aa:=wdSectionBreakNextPage;
  Wordapplication1.ActiveDocument.Range(s,e).InsertBreak(aa);
  Wordapplication1.Selection.Start:=Wordapplication1.Selection.Start + 1;
  s:=Wordapplication1.Selection.start;
  e:=Wordapplication1.ActiveDocument.Content.End_;
  Wordapplication1.ActiveDocument.Range(S,e).PageSetup.Orientation:=wdOrientLandscape;
  五、設置字體、字號
  Wordapplication1.Selection.Font.Size:=18;
  Wordapplication1.Selection.Font.Name := '黑體';
  Wordapplication1.Selection.TypeParagraph;
  Wordapplication1.Selection.ParagraphFormat.Alignment:= wdAlignParagraphCenter;
  Wordapplication1.Selection.TypeParagraph;
  Wordapplication1.Selection.TypeText(dbedit4.text);
  //標題 
  Wordapplication1.Selection.Font.Size := 14;
  Wordapplication1.Selection.Font.Name := '宋體';
  Wordapplication1.Selection.TypeParagraph;
  Wordapplication1.Selection.TypeParagraph;
  Wordapplication1.Selection.ParagraphFormat.Alignment := wdAlignParagraphJustify;
  Wordapplication1.Selection.TypeText(' '+trim(dbmemo1.text));
  //正文
   ... ...
  六、插入表格
  Wordapplication1.Selection.Font.Size :=10;
  adoquery2.Active:=false;
  adoquery2.active:=true;
  doc:=Wordapplication1.activedocument;
  counts:=adoquery2.RecordCount;
  //記錄數決定表格的行數
  t:=doc.tables.Add(Wordapplication1.selection.range,counts+1,5);//5列
  t.cell(1,1).range.text:= '單位';
  t.Cell(1,1).Width:=120;
  t.cell(1,1).range.Paragraphs.Alignment:= wdAlignParagraphCenter;
  t.cell(1,2).range.text:= '姓名';
   ... ...
  //依次寫入其餘字段的表頭
  for i:=2 to counts+1 do
  begin
  t.cell(i,1).range.text:=adoquery2.field
  byname('dw').asstring;
  t.Cell(i,1).Width:=120;
  t.cell(i,1).range.Paragraphs.Alignment:=
   wdAlignParagraphCenter;
  t.cell(i,2).range.text:=adoquery2.field
  byname('xm').asstring;
  ... ...
  Adoquery2.next;
  End;
  使用Dephi將Word與數據庫結合,實現了用戶文檔的自動生成,大大地方便了用戶。
相關文章
相關標籤/搜索