標籤:
http://www.delphifans.com/infoview/Article_730.html
日期:2006年2月20日 瀟瀟2003 人氣:5602 查看:[大字型 中字型 小字型]1.引言在利用Delphi開發應用程式的時候,通常我們要設計出很多各種格式的文檔、報表,經常要進行檔案的建立、編輯及修改,雖然Delphi本身提供了很多設計報表的控制項或方法,但是存在明顯的不足,比如中文輸入,資料格式的控制等操作起來比較麻煩。利用大家都很熟悉的Office工具結合開發,能夠很好的解決這方面的問題。以下就以Delphi為例詳細介紹怎麼利用Office完成各種文檔、報表的製作。2.實現方法利用Delphi和Office結合開發主要有以下三種方法:(1) 通過Delphi的控制項TOleContainer 將Office嵌入,饈親羆虻サ腛le嵌入,能夠直接將Office文檔調用,只需要使用ToleContainer.Run就可以將Office文檔直接啟動。且這樣啟動的Office文檔與Delphi程式是一個整體(從介面上看),但是它存在不可克服的缺點,即不能通過Delphi控制Office文檔,也就不能實現將靈活操縱Office的目的。(2) 使用Delphi提供的Servers控制項調用Office,使用Office的屬性,使用Delphi的Servers控制項來操縱Office,在編程時Delphi能夠實現代碼提示,總體上看能夠較好的實現Delphi對Office的控制,但是還有一些Office的功能不能在Delphi中調用(比如自己編寫的VBA宏代碼)。且實現功能時本來在VBA代碼中可選擇參數在Delphi調用的時候必須添加,否則,連編譯都不能通過。這種方式啟動的Office與Delphi程式分屬兩個表單。(3) 使用CreateOleObject將啟動Office,然後以Ole方式對Office進行控制。這種辦法是使用以CreateOleObjects方式調用Office,實際上還是Ole,但是這種方式能夠真正做到完全控制Office檔案,能夠使用Office的所有屬性,包括自己編寫的VBA宏代碼。與Servers控制項和Com技術相比,本方法能夠真正地使用Office的各種屬性,和在VBA中編寫自己的代碼基本一樣,可以預設的代碼也不需要使用。3.軟體實現3.1 第一種方法:通過Delphi的控制項TOleContainer 將Office嵌入,操作方法如下:(1) 調用Delphi中System頁控制項ToleContainer實現;(2) 雙擊OleContainer,出現如下介面:(3) 這時你可以進行選擇了,選擇“由檔案建立”,選擇相應的文檔,及就簡單的實現了將OFFICE文檔調入的功能。3.2 第二種方法:使用Delphi提供的Servers控制項調用Office;它使得我們很容易地把Office中的應用程式(Word, Excel, PowerPoint, Outlook and Access等)當作一個com應用伺服器進行控制,以Word為例,介紹其實現方法:(1) 調用TwordDocument(建立Word檔案對象)、TwordApplication(啟動Word並建立同Word的串連) 、TwordFont(設定Word檔案的字型)、TwordParagraphFormat(設定Word檔案中的段落格式)控制項;(2) 啟動Word,通過TwordApplication實現;TryWordapplication.Connect;ExceptMessageDlg(‘Word may not be installed‘, mtError, [mbOk], 0);Abort;End;(3)建立一個新的檔案,通過TwordApplication實現;Template := EmptyParam; //表示不使用模板NewTemplate := False; //表示建立建立文檔的類型為文檔,//添加新文檔WordApplication.Documents.Add(Template, NewTemplate);WordDocument.ConnectTo(WordApplication.Documents.Item(ItemIndex));//關閉拼音尋找和文法尋找,以便提高程式啟動並執行效率WordApplication.Options.CheckSpellingAsYouType := False;WordApplication.Options.CheckGrammarAsYouType := False;(3) 插入資料,通過TwordDocument實現;//文本WordDocument.Range.InsertAfter(‘Oracle資料庫‘+ chr(#13));//表格WordDocument1.Tables.Add(WordDocument1.Range,rownum,colnum,template,newtemplate); //其中rownum是表格行數,colnum 是表格列數//向表格中插入資料WordDocument1.Tables.Item(1).Cell(1,1).Range.Text:=‘認證編號‘;WordDocument1.Tables.Item(1).Cell(1,2).Range.Text:=‘社會安全號碼碼‘(4) 格式的設定WordFont.ConnectTo(WordDocument.Sentences.GetLast.Font); //設定某些文字WordFont.ConnectTo(WordDocument.Paragraphs.GetLast.Font); //設定某段文字WordFont.Bold:=1;WordFont.Italic:=1;…………………… WordDocument1.PageSetup.HeaderDistance:=1.5; //設定頁面邊界WordDocument1.PageSetup.FooterDistance:=1.75; //設定頁首頁尾 WordDocument1.ActiveWindow.ActivePane.View.SeekView:=wdSeekCurrentPageFooter; WordDocument1.ActiveWindow.ActivePane.Selection.InsertAfter(‘第‘+inttostr(wdFieldNumPages)+‘頁‘);//讓頁尾向右靠齊WordDocument1.ActiveWindow.ActivePane.Selection.ParagraphFormat.Alignment:=wdAlignParagraphRight;………………………… 3.3第三種方法:使用CreateOleObject將啟動Office,然後以Ole方式對Office進行控制。以Excel表格為例(表格的格式可以是事先設定好的,也可以是自己自由定義的,這裡以事先設定好表格的格式為例),進行說明:(1) 在Uses中添加Comobj類;(2) 申請一個全域變數:FvExcel ,類型為Variant; 表示是Excel對象(3) 定義一個函數用來啟動Excel,如定義function OpenExcel(strFileName : string) : Boolean;Function Tform1. OpenExcel(strFileName : string) : Boolean;beginResult := True;tryFvExcel := CreateOleObject(‘Excel.Application‘);exceptApplication.MessageBox(‘開啟Excel失敗‘,PChar(Application.Title),MB_ICONERROR);Result := False;end;FvExcel.Visible := True;FvExcel.Caption := ‘‘;FvExcel.WorkBooks.Open(strFileName); //開啟活頁簿FvExcel.WorkSheets[1].Activate; //設定第1個工作表為使用中工作表end;(4) 向FvExcel中插入資料FvExcel.cells[row,col].value:="中國"; //row表示行,col表示列;(5) 設定格式fvexcel.rows[row].font.color:=clred; //設定某一行資料的顏色fvexcel.ActiveSheet.PageSetup.LeftMargin:=1;//設定左頁面邊界fvexcel.ActiveSheet.PageSetup. RightMargin:=1;//設定右頁面邊界fvexcel.ActiveSheet.PageSetup.Zoom:=100;//設定顯示比例fvexcel.ActiveSheet.PageSetup.PaperSize:= xlPaperA4;//設定列印紙張大小4.一些體會在程式設計過程中,我們很多時候要設定Office文檔、表格的格式,這時要用到很多屬性、方法和函數等,這些屬性、方法和函數一般是平時很少用到的,如果手上沒有VBA手冊,很難尋找到這些東西,所以,比較好的方法是首先開啟OFFICE,事先做好你要設計的格式,通過OFFICE中的宏記錄,然後開啟OFFICE中的Visual Basic編輯器,查看代碼就可以看到你的操作使用到的屬性、方法或者函數了。通常很多屬性、函數或者方法可以直接搬到Delphi程式中用,一部分也只要稍微修改,也可以在Delphi中使用了。5.結束語通過Delphi可以很完美的和Office結合,設計出各種樣式的表格、文本以及投影片等。同時通過Delphi操作資料庫,把要求的資料插入Office適當的位置,通過Office本身的功能實現預覽、列印和儲存,從而減少節約程式調試和定位調試的時間,簡化的編程的難度,減少了程式員的工作量。對於使用者來講,採用大家熟悉的Office,增加了系統可操作性。該思想已經在“職稱評審管理資訊系統”中大量使用。2006-2-15 9:19:00 發表評語»»» 2006-2-15 9:19:32 //取得Word 表格中的資料procedure getWordCellStr;var WordApp: TWordApplication;WordDoc: TWordDocument;DocInx,oFileName,CfCversions,oReadOnly,AddToRctFiles,PswDocument,PswTemplate,oRevert,WPswDocument,WPswTemplate,oFormat: OleVariant;i,iRow,iCol:integer;myCell:Cell;myRow:Row;beginmemo1.Lines.Clear ;// ===== 建立對象 =====if not Assigned(WordApp) then beginWordApp:= TWordApplication.Create(nil);WordApp.Visible := false;end;if not Assigned(WordDoc) thenWordDoc:= TWordDocument.Create(nil);tryDocInx:=1;oFileName := ‘d:\test.doc‘;oReadOnly:=true;CfCversions := EmptyParam;AddToRctFiles:= EmptyParam;PswDocument:= EmptyParam;PswTemplate:= EmptyParam;oRevert:= EmptyParam;WPswDocument:= EmptyParam;WPswTemplate:= EmptyParam;oFormat:= EmptyParam; // ===== 開啟檔案 ===== WordApp.Documents.open(oFileName,CfCversions,oReadOnly,AddToRctFiles,PswDocument,PswTemplate,oRevert,WPswDocument,WPswTemplate,oFormat);// ===== 關聯檔案 =====WordDoc.ConnectTo(WordApp.Documents.Item(DocInx)); //方法(1)==> 規則表For i := 1 To WordDoc.Tables.Count do //第 i 個表begin //第 iRow 行For iRow := 1 To WordDoc.Tables.Item(i).Rows.Count do begin //第 iCol列For icol := 1 To WordDoc.Tables.Item(i).Columns.Count dobeginmyCell:=WordDoc.Tables.Item(i).Cell(iRow,icol);memo1.Lines.add(myCell.Range.Text);end;end;end;//方法(2)==> 不規則表:只有橫向合并時For i := 1 To WordDoc.Tables.Count do //第 i 個表beginFor iRow := 1 To WordDoc.Tables.Item(i).Rows.Count dobeginmyRow:=WordDoc.Tables.Item(i).Rows.Item(iRow);//第 iRow 行For icol := 1 To myRow.Cells.Count do //第 iCol列beginmyCell:= myRow.Cells.Item(iCol) ;memo1.Lines.add(myCell.Range.Text);end;end;end;//方法(3)==> 不規則:橫向、縱向合并時; 任何錶格For i := 1 To WordDoc.Tables.Count do //第 i 個表begin //第 j 個Cell for j := 1 To WordDoc.Tables.Item(i).Range.Cells.Count dobeginmyCell := WordDoc.Tables.Item(i).Range.Cells.Item(j);memo1.Lines.add(myCell.Range.Text);end;end;finallyif Assigned(WordDoc) then // ===== 關閉檔案 =====beginWordDoc.Close;WordDoc.Disconnect;WordDoc.Destroy;WordDoc := nil;end;if Assigned(WordApp) then // ===== 關閉Word =====beginWordApp.Quit;WordApp.Disconnect;WordApp.Destroy;WordApp := nil;end;end;end; 2006-2-15 9:33:25 巧用VBA自動處理Word表格 http://w… 來源:http://www.52wg.org 更新:12/10/2005 Microsoft Word 97是大家熟悉的文文書處理軟體,強大的功能為我們的工作提供了很大的協助。而Visual Basic for Applications(VBA)的應用更為Word 97增添了不少特色,合理而恰當地使用VBA可為使用者提供極大的方便。下面介紹幾則使用VBA編程自動處理Word表格的例子。 1. 建立表格,插入文字 本例的功能是在文檔開頭插入一張 3 行 4 列的表格。可用For Each...Next 結構來迴圈遍曆表格中的每個儲存格。在 For Each...Next 結構中,InsertAfter 方法用來向表格儲存格添加文字("第 1 儲存格"、" 第 2 儲存格"等等),oTable.AutoFormat屬性用於指定表格套用格式。運行結果1: @@0869600.JPG;圖[email protected]@ Set oDoc = ActiveDocument Set oTable= oDoc.Tables.Add(Range:=oDoc.Range(Start:=0, End:=0), NumRows :=3,NumColumns:=4) iCount = 1 For Each oCell In oTable.Range.Cells oCell.Range.InsertAfter "第 "& iCount & "儲存格" iCount = iCount + 1 Next oCell oTable.AutoFormat Format:=wdTableFormatColorful2,ApplyBorders:=True, App lyFont:=True, ApplyColor:=True 2. 在表格的列、行插入序號 1. 如果需要在表格的第一列插入序號,只需將 For Each...Next 結構中的內容改為下述程式行即可,其中InsertAfter 方法用來向表格儲存格添加序號("第 1 行"、" 第2 行"等等)。 If iCount Mod 4 = 1 Then oCell.Range.InsertAfter"第 " & (iCount - 1) / 4 + 1 & " 行" End If iCount = iCount + 1 2. 如果需要從表格的第二行開始插入序號,應將上述代碼改為: If iCount Mod 4 = 1 And iCount > 4 Then oCell.Range.InsertAfter "第 "& (iCount - 1) / 4 & "行" End If iCount = iCount + 1 3. 在表格的列插入日期 (1) 如需在表格的第一列插入日期, 可用For Each...Next結構來迴圈遍曆表格中的每個儲存格,當判斷某一儲存格為第一列時,插入日期。Formart(Date,...)用於指定日期的格式,下面例子中的日期從Date+1(即當前日期第二天)開始,使用者可以根據需要自訂。 Set oDoc = ActiveDocument Set oTable =oDoc.Tables.Add(Range:=oDoc.Range(Start:=0,End:=0),NumRows:= 4,NumColumns:=4) iCount = 1 For Each oCell In oTable.Range.Cells If iCount Mod 4 = 1 And iCount > 4 Then oCell.Range.InsertAfter Format(Date + (iCount - 1) / 4, "YYYY.MM.DD") End If If iCount Mod 4 = 2 And iCount > 4 Then oCell.Range.InsertAftercWeekName(WeekDay(Date+(iCount - 1) / 4)) End If iCount = iCount + 1 Next oCell oTable.AutoFormat Format:=wdTableFormatColorful1,ApplyBorders:=True, Ap plyFont:=True, ApplyColor:=True @@0869601.JPG;圖[email protected]@ (2) 如果需要在表格的第二列插入星期值,可在上例的For Each...Next結構中插入以下幾行: If iCount Mod 4 = 2 And iCount > 4 Then oCell.Range.InsertAfter cWeekName(WeekDay(Date + (iCount - 1) / 4)) End If 其中,WeekDay(Date)返回一數值(1~7),分別表示"星期日"~"星期六",CWeekName數組需要事先定義為: Dim cWeekName(7) cWeekName(1) = "星期日" cWeekName(2) = "星期一" ...... cWeekName(7) ="星期六" 4. 根據儲存格的內容設定不同的格式 以上例中表格為例,如果需要將所有"星期六"和"星期日"所在行格式改為藍色背景,只要在上常式序之後追加以下幾行即可(表格格式改為wdTableFormatColorful2,行數改為12行)。程式中再次使用For Each...Next結構遍曆表格中的每一行(Rows),如果檢測到某一行滿足條件("星期六"或"星期日"),則選擇一行(Selection.SelectRow),將其屬性改為需要的格式(本例中為藍色背景)。 iCount = 1 For Each Rows In oTable.Range.Rows If (WeekDay(Date + (iCount - 1)) = 7 Or WeekDay(Date + (iCount - 1))= 1) And iCount > 1 Then Selection.SelectRow With Selection.Cells With .Shading .Texture = wdTextureNone .ForegroundPatternColorIndex = wdAuto .BackgroundPatternColorIndex = wdBlue End With End With End If iCount = iCount + 1 Selection.MoveDown Unit:=wdLine, Count:=1 Next Rows @@0869602.JPG;圖[email protected]@ 以上幾例簡要介紹了使用VBA自動處理Word表格的例子(有關Visual Basic事件、方法、對象、屬性的詳細使用方法請參閱Microsoft Word Visual Basic協助)。客戶可將編製的Visual Basic代碼作為Word宏指定到工具列或捷徑,方便以後的使用。
轉:Delphi和Office程式開發 --不錯可查閱