VFP中利用EXCEL製作資料報(bào)表 筆者在工作中總結(jié)出了在VFP運(yùn)行中利用Excel試算表製作資料庫(kù)報(bào)表的方法。編程中主要使用了CreateObject()函數(shù),它可從類定義或支援OLE自動(dòng)化的應(yīng)用程式中創(chuàng)建物件,並將物件引用賦給變數(shù)或陣列元素;若使用用戶自定義類,則在創(chuàng)建物件之前,用戶自定義類必須先用 Define Class 來創(chuàng)建,或者用 SET Classlib 打開的 .VCX 可視類庫(kù)中的類。 假定在一個(gè)VFP專案中有資料表:table1.dbf(其中總分暫為0): 我們希望在VFP的這個(gè)項(xiàng)目運(yùn)行時(shí),調(diào)用Excel來處理這個(gè)資料表,並將處理結(jié)果存檔。下麵的程式excel01.prg實(shí)現(xiàn)了這些要求,程式中用CreateObject()函數(shù)啟動(dòng)Excel,並新建一個(gè)Excel工作簿,然後打開資料表table1.dbf,取得該表的記錄數(shù),並將表table1.dbf的記錄資料逐條送到這個(gè)工作簿的工作表Sheet1中(同時(shí)計(jì)算各記錄的總分),稍加修改(例如設(shè)置字體、字型大小,畫表格線等)作出這個(gè)資料表的報(bào)表,並用temp.xls檔案名存檔。excel01.prg根源程式如下: SET DEFAULT TO d:\myvfp\kwsjk Clear oleApp = CREATEOBJECT(″Excel.Application″) oleApp.Visible=.T. && 顯示 Excel。 oleApp.Workbooks.Add ?。?設(shè)置單格的值(報(bào)表標(biāo)題): oleApp.Cells(1,1).value=″貴州大學(xué)電腦軟體與理論研究所″ oleApp.Cells(2,1).value=″學(xué)生成績(jī)表″ ** oleApp.Cells(4,1).value=″姓名″ oleApp.Cells(4,2).value=″數(shù)學(xué)″ oleApp.Cells(4,3).value=″網(wǎng)路″ oleApp.Cells(4,4).value=″資料庫(kù)″ oleApp.Cells(4,5).value=″英語(yǔ)″ oleApp.Cells(4,6).value=″人工智慧″ oleApp.Cells(4,7).value=″總分″ ?。?打開資料表,取得該表的記錄數(shù) use table1.dbf jl=RECCOUNT()-1 ** 將資料表中的記錄資料放入Excel工作簿的單格中 FOR i=0 TO jl go i+1 && 第i+1條記錄 oleApp.Cells(5+i,1).value=table1.姓名 oleApp.Cells(5+i,2).value=table1.數(shù)學(xué) oleApp.Cells(5+i,3).value=table1.網(wǎng)路 oleApp.Cells(5+i,4).value=table1.資料庫(kù) oleApp.Cells(5+i,5).value=table1.英語(yǔ) oleApp.Cells(5+i,6).value=table1.人工智慧 ** 計(jì)算總分: oleApp.Cells(5+i,7).value=table1.數(shù)學(xué)+table1.網(wǎng)路+table1.資料庫(kù)+ table1.英語(yǔ)+table1.人工智慧 ENDFOR OleApp.ActiveWorkbook.SaveAs(″D:\myvfp\kwsjk\temp.XLS″) |
|
回頂端 |
|
|
Ruey
註冊(cè)時(shí)間: 2003-03-12 文章: 1700 來自: tunglo
第 2 樓
|
發(fā)表於: 星期日 五月 04, 2003 3:17 pm 文章主題: |
|
|
在VFP中全面控制EXCEL VFP和Excel都可以用來進(jìn)行處理資料庫(kù)表格,如果巧妙地將二者的優(yōu)點(diǎn)結(jié)合起來,將會(huì)大大方便我們的工作。比如我們可以利用VFP進(jìn)行處理資料,而利用Excel的預(yù)覽列印功能進(jìn)行報(bào)表列印。這就需要我們?cè)赩FP中直接來控制Excel。下面就在開發(fā)VFP應(yīng)用專案時(shí)對(duì)Excel的控制作一下介紹: 1.創(chuàng)建Excel對(duì)象 eole=CREATEOBJECT(′Excel.application′) 2.添加新工作簿 eole.Workbooks.add 3.設(shè)置第3個(gè)工作表為啟動(dòng)工作表 eole.Worksheets(″sheet3″).Activate 4.打開指定工作簿 eole.Workbooks.Open(″c:\temp\ll.xls″) 5.顯示Excel視窗 eole.visible=.t. 6.更改Excel標(biāo)題欄 eole.Caption=″VFP應(yīng)用程式調(diào)用Microsoft Excel″ 7.給單格賦值 eole.cells(1,4).value=XM(XM為資料庫(kù)欄位名) 8.設(shè)置指定列的寬度(單位:字元個(gè)數(shù)) eole.ActiveSheet.Columns(1).ColumnWidth=5 9.設(shè)置指定行的高度(單位:磅) eole.ActiveSheet.Rows(1).RowHeight=1/0.035 (設(shè)定行高為1釐米,1磅=0.035釐米) 10.在第18行之前插入分頁(yè)符 eole.Worksheets(″Sheet1″).Rows(1.PageBreak=1 11.在第4列之前刪除分頁(yè)符 eole.ActiveSheet.Columns(4).PageBreak=0 12.指定邊框線寬度(Borders參數(shù)如下) ole.ActiveSheet.Range(″b3:d3″).Borders(2).Weight=3 13.設(shè)置四個(gè)邊框線條的類型 eole.ActiveSheet.Range(″b3:d3″).Borders(2).LineStyle=1 (其中Borders參數(shù):1-左、2-右、3-頂、4-底、5-斜、6-斜/;LineStyle值:1與7-細(xì)實(shí)、2-細(xì)虛、4-點(diǎn)虛、9-雙細(xì)實(shí)線) 14.設(shè)置頁(yè)眉 eole.ActiveSheet.PageSetup.CenterHeader=″報(bào)表1″ 15.設(shè)置頁(yè)腳 eole.ActiveSheet.PageSetup.CenterFooter=″第&P頁(yè)″ 16.設(shè)置頁(yè)眉到頂端邊距為2釐米 eole.ActiveSheet.PageSetup.HeaderMargin=2/0.035 17.設(shè)置頁(yè)腳到底邊距為3釐米 eole.ActiveSheet.PageSetup.FooterMargin=3/0.035 18.設(shè)置頂邊距為2釐米 eole.ActiveSheet.PageSetup.TopMargin=2/0.035 19.設(shè)置底邊距為4釐米 eole.ActiveSheet.PageSetup.BottomMargin=4/0.035 20.設(shè)置左邊距為2釐米 veole.ActiveSheet.PageSetup.LeftMargin=2/0.035 21.設(shè)置右邊距為2釐米 eole.ActiveSheet.PageSetup.RightMargin=2/0.035 22.設(shè)置頁(yè)面水平居中 eole.ActiveSheet.PageSetup.CenterHorizontally=.t. 23.設(shè)置頁(yè)面垂直居中 eole.ActiveSheet.PageSetup.CenterVertically=.t. 24.設(shè)置頁(yè)面紙張大小(1-窄行8511 39-寬行1411) eole.ActiveSheet.PageSetup.PaperSize=1 25.列印單格網(wǎng)線 eole.ActiveSheet.PageSetup.PrintGridlines=.t. 26.拷貝整個(gè)工作表 eole.ActiveSheet.UsedRange.Copy 27.拷貝指定區(qū)域 eole.ActiveSheet.Range(″A1:E2″).Copy 28.粘貼 eole.WorkSheet(″Sheet2″).Range(″A1″).PasteSpecial 29.在第2行之前插入一行 eole.ActiveSheet.Rows(2).Insert 30.在第2列之前插入一列 eole.ActiveSheet.Columns(2).Insert 31.設(shè)置字體 eole.ActiveSheet.Cells(2,1).Font.Name=″黑體″ 32.設(shè)置字體大小 eole.ActiveSheet.Cells(1,1).Font.Size=25 33.設(shè)置字體為斜體 eole.ActiveSheet.Cells(1,1).Font.Italic=.t. 34.設(shè)置整列字體為粗體 eole.ActiveSheet.Columns(1).Font.Bold=.t. 35.清除單格公式 eole.ActiveSheet.Cells(1,4).ClearContents 36.列印預(yù)覽工作表 eole.ActiveSheet.PrintPreview 37.列印輸出工作表 eole.ActiveSheet.PrintOut 38.工作表另為 eole.ActiveWorkbook.SaveAs(″c:\temp\22.xls″) 39.放棄存檔 eole.ActiveWorkbook.saved=.t. 40.關(guān)閉工作簿 eole.Workbooks.close 41.退出Excel eole.quit 以上控制調(diào)用語(yǔ)句在中文VFP5.0企業(yè)版下運(yùn)行通過,運(yùn)行環(huán)境為Excel 97及中文Windows 98 _________________ ############################# 快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡(jiǎn)單!!
學(xué)會(huì)VFP使用者社區(qū)的搜尋,Code才會(huì)更有趣~ ############################# |
|
回頂端 |
|
|
Ruey
註冊(cè)時(shí)間: 2003-03-12 文章: 1700 來自: tunglo
第 3 樓
|
發(fā)表於: 星期日 五月 04, 2003 3:18 pm 文章主題: |
|
|
VFP調(diào)用EXCEL的補(bǔ)充方法 下面是我使用 VFP CALL EXCEL的部分例子: 這是本人從書本上抄的片斷和我的小小經(jīng)驗(yàn),可以讓你很方便的在 VFP 中調(diào)用 EXCEL,所有的常式我都試驗(yàn)過。 用Visual Foxpro 設(shè)計(jì)用Excel表格的程式 利用OLE Automation 設(shè)計(jì)Excel 應(yīng)用程式 Excel支援的物件說明: (a) VBA 對(duì)象: 物件名稱 意義 Application Excel應(yīng)用程式物件 WorkBooks Excel活頁(yè)薄對(duì)象 (b)所使用的Method 物件名稱 Method 執(zhí)行意義 Application Cells 設(shè)定或傳回來某個(gè)網(wǎng)格的內(nèi)容 Range 傳回或設(shè)定某一個(gè)範(fàn)圍的網(wǎng)格 Charts 傳回或設(shè)定活頁(yè)簿的單一統(tǒng)計(jì)表 Quit 結(jié)束 Excel Application Save 啟動(dòng)存儲(chǔ)檔對(duì)話方塊 WorkBooks Add 新增一個(gè)工作簿 Charts Add 新增一個(gè)統(tǒng)計(jì)圖 (c)所使用的Property 物件名稱 Property 設(shè)定意義 Application Visible 是否現(xiàn)實(shí)再 SCREEN上 .T. , .F. value 傳回或者設(shè)定存儲(chǔ)檔的內(nèi)容 ActiveSheet 回應(yīng)Excel Application 執(zhí)行工作表物件 實(shí)例說明: 啟動(dòng)Excel: MyExcel=CreateObject('Excel.Application') &&建立Excel物件 MyExcel.Visible=.T. &&讓Excel物件再螢?zāi)簧巷@示出來 如何增加工作簿: MyExcel.WorkBooks.Add &&在Excel物件中增加一份工作簿(WorkBook) 如何在工作簿中增加Sheet(工作表) MyExcel.Sheets.Add &&增加工作表(在當(dāng)前工作簿中) 如何刪除工作表 MyExcel.ActiveWorkBooks.Sheets(1).Delete &&把工作簿中的BOOK(1) 刪除 向指定的工作簿中的工作表(Sheet)中存儲(chǔ)資料 *Excel.application Object *Excel.application.ActiveWorkBook Property *WorkBOoks Object *WorkBOoks Object的Add Method. *Sheets對(duì)象 *Sheets(Index)物件指定索引工作表 *Excel.Application物件的Cells Method結(jié)合value屬性 Example: CLEAR ALL SET PATH TO SYS(2004)+'SAMPLES\DATE' USE CUSTOMER MYEXCEL=CREATEOBJEXT('EXCEL.APPLICATION') MYEXCEL.VISIBLE=.T. MYEXCEL.WORKBOOKS.ADD MYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(1,1).value='客戶編號(hào)' MYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(1,2).value='公司行號(hào)' SELECT CUSTOMER R=2 C=1 GOTO TOP FOR I=1 TO 20 MYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(R,C).value=CUSTOMER.CUST_ID MYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(R,C+1).value=CUSTOMER.COMPANY R=R+1 SKIP ENDFOR 調(diào)整單格寬度: MYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(1,1).columnwidth=30 調(diào)整單格對(duì)齊方式: MYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(1,1).horizontalalig=1 1為默認(rèn)方式,2為左對(duì)齊,3為中對(duì)齊,4為右對(duì)齊。 如何將資料存儲(chǔ): MYEXCEL.SAVE() 注:可以用Save(FileName)指定預(yù)存儲(chǔ)檔案名, 則可不用啟動(dòng)SAVE AS 窗口 如何列印表格: MYEXCEL.ActiveWorkBook.PrintOut &&默認(rèn)列印增個(gè)Sheet 如何指定列印表格: MYEXCEL.ActiveWorkBook.PrintOut(1,1,1,.T.) &&默認(rèn)列印增個(gè)Sheet PrintOut有四個(gè)參數(shù) A. 數(shù)值:,表示指定的工作簿中進(jìn)行列印的Sheet 的開始編號(hào) B. 數(shù)值:,表示指定的工作簿中進(jìn)行列印的Sheet 的結(jié)束編號(hào) C.列印分?jǐn)?shù). D.是否進(jìn)行 Preview, .T.,預(yù)覽, .F.列印 如何產(chǎn)生統(tǒng)計(jì)圖 CURROW=MYEXCEL.ACTIVESHEET.ROWS.COUNT RANGESTRING='A1:'+'B'+ALLTRIM(STR(CURROW)) MYEXCEL.RANGE(RANGESTRING).SELECT MYEXCEL.CHARTS.ADD 結(jié)束EXCEL MYEXCEL.QUIT EXCEL.ActiveWindow.SelectedSheets.PrintPreview &&預(yù)覽列印 EXCEL.ActiveWorkbook.SaveAs("C:\My Documents\Book1.xls") &&另存為 EXCEL.ActiveWorkbook.Close &&關(guān)閉一個(gè)工作表,如果有修改則提示 EXCEL.ActiveWorkbook.Close(.t.) &&提示另存為 EXCEL.ActiveWorkbook.Close(.f.) &&關(guān)閉一個(gè)工作表不用提示是否存檔 _________________ ############################# 快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡(jiǎn)單!!
學(xué)會(huì)VFP使用者社區(qū)的搜尋,Code才會(huì)更有趣~ ############################# |
|
回頂端 |
|
|
Ruey
註冊(cè)時(shí)間: 2003-03-12 文章: 1700 來自: tunglo
第 4 樓
|
發(fā)表於: 星期日 五月 04, 2003 3:19 pm 文章主題: |
|
|
VFP下的SQL和EXCEL技術(shù) 我們都知道在 EXCEL 中有很多很多的計(jì)算公式、靈活多變的計(jì)算方式、方便快捷的圖表處理、和功能強(qiáng)大的 VBA 語(yǔ)言,可以說 EXCEL 可能是最好用的表格處理軟體。我敢說:微軟的產(chǎn)品中大概就 EXCEL 最好! 但是,怎樣用 Foxpro 快速產(chǎn)生統(tǒng)計(jì)表,並將資料送到 Excel表格中,從而代替 Foxpro 的報(bào)表工具呢? 我們大家都知道,在 Visual Foxpro 3.0及以後版本中提供了一個(gè)調(diào)用Ole Automation 的函數(shù) CREATEOBJECT,用該函數(shù)可以讓 Visual Foxpro 很方便的和其他可以提供 Ole Automation 服務(wù)的程式進(jìn)行通訊。而 Excel 更是一個(gè)標(biāo)準(zhǔn)的 Ole Automation 伺服器程式,我們可以在前端將資料傳送到後端的 Excel 服務(wù)程式,用後端服務(wù)程式進(jìn)行表格處理,從而彌補(bǔ) Visual Foxpro的不足。 由於歷史原因,我們作報(bào)表都習(xí)慣用 Total、Count、Sum 或者直接在報(bào)表中工具中計(jì)算,速度最快的大概也就是 Total 了,但不知道還有多少人還在堅(jiān)持使用 Total 命令進(jìn)行計(jì)算,有沒有更好的計(jì)算方法呢?當(dāng)然有啦!我在實(shí)際使用中積累有一定的經(jīng)驗(yàn)但願(yuàn)能給各位起到小小的啟發(fā)。 假設(shè)有一表:Table1 是一個(gè)人員檔案,裏面的表結(jié)構(gòu)如下: ----- 欄位名 -- 類型及長(zhǎng)度--------- 編號(hào) C,2 部門 C,10 姓名 C,10 性別 C,2 出生日期 D 職務(wù) C,10 文化程度 C,10 內(nèi)容大概如下 TABLE1.DBF --------------------------------- 編號(hào) 部門 姓名 性別 出生日期 職務(wù) 文化程度 --------------------------------- 1 工程部 張三 男 1971-01-11 工程師 大學(xué)本科 2 銷售部 李四 男 1967-02-23 經(jīng)理 大學(xué)本科 3 工程部 王武 1954-03-14 技術(shù)員 大學(xué)??啤? 4 總經(jīng)理室 趙潔雅 女 1975-04-05 秘書 碩士研究生 5 銷售部 ?。 ?977-05-09 銷售經(jīng)理 高中 6 工程部 大文 1969-03-30 總工程師 大學(xué)??啤? 7 銷售部 ?。 ?961-10-10 銷售經(jīng)理 大學(xué)??啤? 8 總經(jīng)理室 莊稼 1961-10-10 總經(jīng)理 大學(xué)專科 當(dāng)然實(shí)際的資料應(yīng)該比這裏多很多,要不還用統(tǒng)計(jì)幹嗎,我不過是舉例說明而已。我不知道你們?cè)谑褂?SQL 語(yǔ)句時(shí)有沒有用使用函數(shù)的習(xí)慣,反正我是相當(dāng)願(yuàn)意在 SQL 中使用函數(shù),我認(rèn)為使用函數(shù)的 SQL 語(yǔ)句雖然語(yǔ)句長(zhǎng)一點(diǎn),但是可以讓你的程式看起來更清晰、簡(jiǎn)潔。 說道這裏我要感謝當(dāng)初發(fā)明出 IIF 函數(shù)那位元高人,要沒有他(她)我也沒有機(jī)會(huì)在這裏囉嗦這麼久,在後面提到的快速產(chǎn)生統(tǒng)計(jì)表中將大量的運(yùn)用 IIF 函數(shù)。也許你會(huì)覺得奇怪,你統(tǒng)計(jì)的時(shí)候用那麼多 IIF 幹嗎?別急,下面就讓我慢慢的告訴你。 看看我們前面描述的表,我們可能要統(tǒng)計(jì)各個(gè)部門的“性別|職務(wù)|文化程度”等的分佈情況,簡(jiǎn)單一點(diǎn)我給畫了一個(gè)表個(gè)出來,可能表格更能說明白:
各部門人員分佈情況表 單位:人 --------------------------------- 部門 ?。∧校∨”究啤。?疲夹g(shù)人員|管理人員|秘書 --------------------------------- 工程部?。 。 。 。 。 。 。 ? 銷售部 | ?。 。 。 。 。 。 ? 總經(jīng)理室| | ?。 。 。 。 。 ? ?。 。 。 。 。 。 。 ? ?。 。 。 。 。 。 。 ? --------------------------------- 上面這張表說複雜也不複雜,但是用常給的處理方法可能也要耗掉我們不少的時(shí)間,因?yàn)槟悴坏貌会槍?duì)不同的項(xiàng)目進(jìn)行單獨(dú)反復(fù)的計(jì)算,可能還要生成一大堆的臨時(shí)表真煩!下面的計(jì)算公司可讓你輕鬆完成上面的表格,當(dāng)然程式還是要寫的不可能什麼也不動(dòng)不想就能達(dá)到的,立即輸入下列程式: 第一步:轉(zhuǎn)換 Select 部門,; iif(性別='男',1,0) as 男,; iif(性別='女',1,0) as 女,; iif(文化程度='大學(xué)本科',1,0) as 大學(xué)本科,; iif(文化程度='大學(xué)???,1,0) as 大學(xué)專科,; iif(inlist(職務(wù),'工程師','技術(shù)員','總工程師'),1,0) as 技術(shù)人員,; iif(inlist(職務(wù),'總經(jīng)理','經(jīng)理','銷售經(jīng)理'),1,0) as 管理人員,; iif(inlist(職務(wù),'總經(jīng)理','經(jīng)理','銷售經(jīng)理'),1,0) as 管理人員,; iif(inlist(職務(wù),'秘書'),1,0) as 秘書; from table into cursor query1 第二步:轉(zhuǎn)換並計(jì)算 Select 部門 as 部門,; sum(男) as 男,; sum(女) as 女,; sum(大學(xué)本科) as 大學(xué)本科,; sum(大學(xué)??? as 大學(xué)專科,; sum(技術(shù)人員) as 技術(shù)人員,; sum(管理人員) as 管理人員,; sum(管理人員) as 管理人員,; sum(秘書) as 秘書; from query1 into cursor query1; group by 部門 不要以為我把“from query1 into cursor query1”寫錯(cuò)了,這樣寫的語(yǔ)句確實(shí)可以使用。 到這一步,統(tǒng)計(jì)表就計(jì)算出來了,不信用 BROWSE 看看。往下面我們應(yīng)該說說怎樣把現(xiàn)在統(tǒng)計(jì)出的資料輸出到 EXCEL 中了(當(dāng)然什麼樣子的資料都可以)。 首先用 CreateObject 函數(shù)建立一個(gè) Excel automation 物件,程式如下: local excel,o define windows WaitWin at 0,0 size 10,60 system ; font 'times new roman',12 ; title '提示' close float zoom &&用於處理提示資訊的視窗 move windows waitWin center acti windows waitwin set color to w+/n clear excel=createobject('excel.application') if type('excel')='U' &&未能產(chǎn)生EXCEL物件 '啟動(dòng) EXCEL 失敗...' release windows WaitWin return endif ReportTitle='XXXX公司人員分佈情況' ExcelFile="xls1.xls" excel.caption=ReportTitel select query1 if not file(ExcelFile) export to (ExcelFile) type xls endif excel.workbooks.open(ExcelFile) o=excel.activeworkbook.activesheet &&用物件代替這麼長(zhǎng)的一串字 o.cells(1,1).value=ReportTitle * * 第一行是標(biāo)題,故從第二行開始 * scan for recno()>1 &&每一行 '正在將資料轉(zhuǎn)換到 Excel 表格中...',recno() for i=1 to fcount() &&每一列 fld=field(i) if type(fld)='C'&&如果欄位太寬,Excel可能不能正確接受資料 o.cells(recno()+3,i).value=trim(&fld) else o.cells(recno()+3,i).value=&fld endif endfor endscan o.cells(1,1).select excel.ActiveWindow.windowstate=2 excel.ActiveWorkbook.save() excel.visible=.t. clear startTime=time() set cursor off * * 等待 Excel 處理完畢後再繼續(xù) * do while .t. @1,4 say '已啟動(dòng)後臺(tái) Excel 表格處理程式,處理中...' @2,4 say 'Ctrl+End 繼續(xù)處理...' @4,4 say '開始時(shí)間:' starttime @5,4 say '現(xiàn)在時(shí)間:' time() &&VFP會(huì)在此等待,除非你從 EXCEL中退出或按下 Ctrl+End鍵 if inkey(0.5)=23 or type('o.name')='U' exit endif enddo set cursor>release o,excel release FindWindow '處理完畢...' =inkey(0.5) release windows WaitWin end note _________________ ############################# 快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡(jiǎn)單!!
學(xué)會(huì)VFP使用者社區(qū)的搜尋,Code才會(huì)更有趣~ ############################# |
|
回頂端 |
|
|
garfield Site Admin
註冊(cè)時(shí)間: 2003-01-30 文章: 1926
第 5 樓
|
發(fā)表於: 星期三 七月 02, 2003 1:23 am 文章主題: |
|
|
VFP與EXCEL的幾種交互編程方法
一、EXECL驅(qū)動(dòng)VFP EXECL內(nèi)置的VBA語(yǔ)言(Visual Basic For Application)爲(wèi)EXECL功能的擴(kuò)展提供了便利的手段,用戶可使用該語(yǔ)言直接驅(qū)動(dòng)VFP完成資料檢索等功能。 程式首先生成一個(gè)VFP物件,然後用VFP的DoCmd方法執(zhí)行VFP摸索命令串,其摸索結(jié)果再借助於VFP的DateToClip方法拷貝至剪切板,最後VBA將其粘貼至工作表的正確位置。 Sub FoxTest()
Dim oFox As Object Dim SLesson As String Dim SCommand As String
Set oFox = CreateObject("VisualFoxPro.Application") '啓動(dòng)VFP,生成VFP物件 Sheets("查詢").Select SLesson = Range("課程名") '在名爲(wèi)“課程名”的單格中得到欲查詢的課程名稱 Sheets.Add '産生新的工作表單 ActiveSheet.Name = Slesson '指定工作表單的名稱與課程名稱相同
SCommand = "SELECT 學(xué)號(hào),語(yǔ)文,數(shù)學(xué) FROM d:\vfp\學(xué)生成績(jī)表 WHERE "+ SLesson + "<60 INTO CURSOR TEMP" '形成VFP查詢命令串 oFox.DoCmd Scommand '執(zhí)行VFP命令串 oFox.DataToClip "temp", , 3 '將搜索結(jié)果以文本方式拷貝至剪切板 Range("a1:a1").Select '指向拷貝目標(biāo)區(qū)域左上角單元 ActiveSheet.Paste '粘貼搜索結(jié)果
End Sub
爲(wèi)便於使用,作者在EXECL中自製了一名爲(wèi)“搜索”的工具欄及一名爲(wèi)“開始搜索”的按鈕,並將上述巨集程式段與自製按鈕相關(guān)聯(lián),按下此按鈕即可運(yùn)行程式並在EXCEL中得到要求的資料。 製作工具欄及按鈕的方法如下: 1. 選“工具”/“自定義”功能表,出現(xiàn)自定義對(duì)話方塊; 2. 選擇“工具欄”頁(yè)框,然後按下“新建”按鈕; 3. 在工具欄對(duì)話方塊中輸入“搜索”作爲(wèi)新建工具欄的名稱; 4. 選擇“命令”頁(yè)框,在“類別”列表中選“宏”,在“命令”列表中選“自定義按鈕”並將其拖放至新建的“搜索”工具欄; 5. 按下“更新所選內(nèi)容”按鈕,首先在“命名”欄中填入按鈕名稱“開始搜索”,然後選擇“指定宏”,在隨後出現(xiàn)的“指定宏”列表中選擇上述巨集程式FoxTest()即可實(shí)現(xiàn)爲(wèi)該巨集指定一個(gè)工具欄按鈕。
二、VFP使用OLE功能驅(qū)動(dòng)EXECL OLE(Object Linking and Embedding)物件鏈結(jié)與嵌入,是WINDOWS應(yīng)用程式間相互傳遞和共用資料的一種有效方法。VFP借助於OLE不僅可共用其他應(yīng)用程式的資料,而且還能以物件方式直接控制其他應(yīng)用程式的運(yùn)行,從而進(jìn)一步擴(kuò)展VFP的功能。VFP支援直接在程式中創(chuàng)建、使用和控制OLE物件,實(shí)現(xiàn)OLE自動(dòng)化。作爲(wèi)OLE客戶VFP與作爲(wèi)OLE伺服器的EXCEL具有良好的編程介面,下述程式段用OLE方式實(shí)現(xiàn)所要求的功能。 程式首先生成一個(gè)EXCEL的OLE物件OleApp以便對(duì)其進(jìn)行操作,然後利用OLE功能從EXCEL表單中獲取欲查詢的課程名,並控制EXCEL生成新的工作表,VFP的查詢結(jié)果仍然使用剪切板的方式傳遞至EXCEL工作表。
OleApp=CREATEOBJECT("Excel.Application") && 打開EXCEL,産生OLE物件 OleApp.Application.Caption="VFP交互編程" && 指定標(biāo)題欄名稱 OleApp.Application.Visible=.T. && 置EXCEL可見 OleApp.Application.WorkBooks.Open("d:\vfp\VFP交互.xls") && 打開EXCEL工作簿
DO WHILE .T. WITH OleApp.Application nAnswer = MESSAGEBOX("開始搜索?", 32+4, "搜索指定資料") &&産生資訊框 IF (.NOT.(nAnswer=6)) && 如按下“Yes"按鈕,則開始搜索,反之退出 EXIT ENDIF
.Sheets("查詢").Select && 選擇“查詢”工作表單 SLesson = OleApp.Application.Range("課程名").value && 得到欲查詢的課程名稱 .Sheets.Add && 新建一工作表單 .ActiveSheet.Name = Slesson && 指定工作表單的名稱 SCommand = "SELECT 學(xué)號(hào),語(yǔ)文,數(shù)學(xué) FROM d:\vfp\學(xué)生成績(jī)表 WHERE " +ALLTrim(SLesson) + "<60 INTO CURSOR TEMP" && 形成VFP查詢命令串 &Scommand && 執(zhí)行VFP命令串 _VFP.DataToClip("TEMP",,3) && 將搜索結(jié)果以文本方式拷貝至剪切板 .Range("a1:a1").Select && 指向拷貝目標(biāo)區(qū)域左上角單元 .ActiveSheet.Paste && 粘貼搜索結(jié)果 ENDWITH ENDDO
OleApp.Quit && 關(guān)閉EXCEL,保存更新後的工作簿文件 三、VFP使用DDE功能驅(qū)動(dòng)EXECL DDE(Dynamic Data Exchange)動(dòng)態(tài)資料交換,是WINDOWS應(yīng)用程式間相互傳遞和共用資料的另一種有效方法,DDE用共用記憶體在應(yīng)用程式間交換資料。DDE會(huì)話發(fā)生在DDE客戶與DDE伺服器應(yīng)用程式之間,客戶應(yīng)用程式向伺服器應(yīng)用程式請(qǐng)求資料和服務(wù),而伺服器回應(yīng)客戶應(yīng)用程式對(duì)資料與服務(wù)的請(qǐng)求。DDE的資料交換可分三種方式: * 冷鏈結(jié):客戶應(yīng)用程式請(qǐng)求資料時(shí),伺服器應(yīng)用程式才發(fā)送資料給客戶應(yīng)用程式; * 暖鏈結(jié):伺服器應(yīng)用程式在每次資料項(xiàng)目的值變化時(shí)都向客戶應(yīng)用程式發(fā)送通告,但它並不直接發(fā)送值給客戶應(yīng)用程式,而由客戶應(yīng)用程式?jīng)Q定是否取得該資料; * 熱鏈結(jié):伺服器應(yīng)用程式在每次值變化時(shí)都發(fā)送資料項(xiàng)目的新值給客戶應(yīng)用程式。 VFP與EXCEL均支援DDE客戶與伺服器。下述程式段由作爲(wèi)DDE客戶的VFP應(yīng)用程式與作爲(wèi)DDE伺服器的EXCEL用DDE方式實(shí)現(xiàn)所要求的功能。 程式首先啓動(dòng)EXCEL,然後在VFP應(yīng)用程式與“查詢”工作表單的“課程名”單格之間形成“熱鏈結(jié)”,當(dāng)“課程名”單格內(nèi)容改變時(shí),將自動(dòng)執(zhí)行 “GetData”過程。在該過程中首先直接獲取DDE資料,如果該資料爲(wèi)“空”,則關(guān)閉EXCEL,程式結(jié)束;反之,利用DDEPOKE功能向EXCEL發(fā)送鍵盤命令串,以形成新的工作表,最後VFP將查詢結(jié)果通過剪切板送EXCEL形成要求的工作表。
PUBLIC ExcelChan PUBLIC SheetChan
RUN /N3 C:\Program Files\Microsoft Office\Office\EXCEL.EXE && 以“活動(dòng)”與“最大化方式啓動(dòng)EXCEL ExcelChan = DDEInitiate("Excel",'SYSTEM') && 初始化DDE通道ExcelChan = DDEExecute(ExcelChan,'[Open("d:\vfp\VFP交互.xls")]') && 打開“VFP交互.xls”
SheetChan = DDEInitiate('Excel', '查詢') && 初始化DDE通道SheetChan = DDEAdvise(SheetChan, '課程名', 'GetData', 2) && 在VFP應(yīng)用程式與“查詢”工作表單的“課程名”單格之間形成“熱鏈結(jié)”!如果該單元數(shù)值改變,則執(zhí)行“GetData”過程。
PROCEDURE GetData PARAMETERS Channel, Action, Item, Data, Format, Advise IF Action = 'ADVISE' .AND. Item = '課程名' && 伺服器提供的鏈結(jié)名爲(wèi)“課程名” SLesson = Data && 直接獲取DDE伺服器提供的資料 SLesson = LEFT(SLesson,LEN(SLesson)-2) && 去掉原始資料尾部的格式字元 IF (LEN(SLesson)=0) && 如果指定單格內(nèi)容爲(wèi)“空”,則退出 = DDETerminate(SheetChan) && 終止DDE通道SheetChan = DDEExecute(ExcelChan,'[Quit]') && 退出EXCEL = DDETerminate(ExcelChan) && 終止DDE通道ExcelChan ELSE = DDEExecute(ExcelChan,'[Formula.Goto("課程名")]') && 指定名爲(wèi)“課程名” 的單格爲(wèi)活動(dòng)單格 = DDEExecute(ExcelChan,'[Copy]') && 將指定單格內(nèi)容拷貝至剪切板 SKey="'%IW%OHR^V{enter}'" && 鍵盤命令字串,表示“插入(I)|工作表(W);格式(O)|工作表(H)|重命名(R);粘貼” = DDEExecute(ExcelChan,&SKey) && 通過DDE通道將命令串送EXCEL WAIT WINDOW TIMEOUT 2 && 等待2秒鐘以實(shí)現(xiàn)上述命令串 SCommand = "SELECT 學(xué)號(hào),語(yǔ)文,數(shù)學(xué) FROM d:\vfp\學(xué)生成績(jī)表 WHERE " +ALLTRIM(SLesson) + "<60 INTO CURSOR TEMP" && 形成VFP查詢命令串 &Scommand && 執(zhí)行VFP命令串 _VFP.DataToClip("TEMP",,3) && 將搜索結(jié)果以文本方式拷貝至剪切板
SheetChan1 = DDEInitiate("Excel",'&SLesson') && 初始化DDE通道SheetChan1 指向新生成的工作表 = DDEExecute(SheetChan1,'[Paste]') && 粘貼搜索結(jié)果 = DDETerminate(SheetChan1) && 終止DDE通道SheetChan1 ENDIF _________________ 利用>>搜尋<<的功能會(huì)比問的還要快得到答案. 臺(tái)灣筷樂 |
|
|