分享

VFP & EXCEL

 Alkaid2015 2014-08-13

VFP中利用EXCEL製作資料報表
  筆者在工作中總結出了在VFP運行中利用Excel試算表製作資料庫報表的方法。編程中主要使用了CreateObject()函數,它可從類定義或支援OLE自動化的應用程式中創建物件,並將物件引用賦給變數或陣列元素;若使用用戶自定義類,則在創建物件之前,用戶自定義類必須先用 Define Class 來創建,或者用 SET Classlib 打開的 .VCX 可視類庫中的類。
  假定在一個VFP專案中有資料表:table1.dbf(其中總分暫為0):
  我們希望在VFP的這個項目運行時,調用Excel來處理這個資料表,並將處理結果存檔。下麵的程式excel01.prg實現了這些要求,程式中用CreateObject()函數啟動Excel,並新建一個Excel工作簿,然後打開資料表table1.dbf,取得該表的記錄數,並將表table1.dbf的記錄資料逐條送到這個工作簿的工作表Sheet1中(同時計算各記錄的總分),稍加修改(例如設置字體、字型大小,畫表格線等)作出這個資料表的報表,並用temp.xls檔案名存檔。excel01.prg根源程式如下:
  SET DEFAULT TO d:\myvfp\kwsjk
  Clear
  oleApp = CREATEOBJECT(″Excel.Application″)
  oleApp.Visible=.T. && 顯示 Excel。
  oleApp.Workbooks.Add
  ** 設置單格的值(報表標題):
  oleApp.Cells(1,1).value=″貴州大學電腦軟體與理論研究所″
  oleApp.Cells(2,1).value=″學生成績表″
  **
  oleApp.Cells(4,1).value=″姓名″
  oleApp.Cells(4,2).value=″數學″
  oleApp.Cells(4,3).value=″網路″
  oleApp.Cells(4,4).value=″資料庫″
  oleApp.Cells(4,5).value=″英語″
  oleApp.Cells(4,6).value=″人工智慧″
  oleApp.Cells(4,7).value=″總分″
  ** 打開資料表,取得該表的記錄數
  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.數學
oleApp.Cells(5+i,3).value=table1.網路
   oleApp.Cells(5+i,4).value=table1.資料庫
oleApp.Cells(5+i,5).value=table1.英語
   oleApp.Cells(5+i,6).value=table1.人工智慧
** 計算總分:
  oleApp.Cells(5+i,7).value=table1.數學+table1.網路+table1.資料庫+
table1.英語+table1.人工智慧
  ENDFOR
  OleApp.ActiveWorkbook.SaveAs(″D:\myvfp\kwsjk\temp.XLS″)
回頂端
 
Ruey



註冊時間: 2003-03-12
文章: 1700
來自: tunglo

第 2 樓

發表於: 星期日 五月 04, 2003 3:17 pm    文章主題:

在VFP中全面控制EXCEL
VFP和Excel都可以用來進行處理資料庫表格,如果巧妙地將二者的優點結合起來,將會大大方便我們的工作。比如我們可以利用VFP進行處理資料,而利用Excel的預覽列印功能進行報表列印。這就需要我們在VFP中直接來控制Excel。下面就在開發VFP應用專案時對Excel的控制作一下介紹:
  1.創建Excel對象
  eole=CREATEOBJECT(′Excel.application′)
  2.添加新工作簿
  eole.Workbooks.add
  3.設置第3個工作表為啟動工作表
  eole.Worksheets(″sheet3″).Activate
  4.打開指定工作簿
  eole.Workbooks.Open(″c:\temp\ll.xls″)
  5.顯示Excel視窗
  eole.visible=.t.
  6.更改Excel標題欄
  eole.Caption=″VFP應用程式調用Microsoft Excel″
  7.給單格賦值
  eole.cells(1,4).value=XM(XM為資料庫欄位名)
  8.設置指定列的寬度(單位:字元個數)
  eole.ActiveSheet.Columns(1).ColumnWidth=5
  9.設置指定行的高度(單位:磅)
  eole.ActiveSheet.Rows(1).RowHeight=1/0.035
  (設定行高為1釐米,1磅=0.035釐米)
  10.在第18行之前插入分頁符
  eole.Worksheets(″Sheet1″).Rows(1.PageBreak=1
  11.在第4列之前刪除分頁符
  eole.ActiveSheet.Columns(4).PageBreak=0
  12.指定邊框線寬度(Borders參數如下)
  ole.ActiveSheet.Range(″b3:d3″).Borders(2).Weight=3
  13.設置四個邊框線條的類型
  eole.ActiveSheet.Range(″b3:d3″).Borders(2).LineStyle=1
  (其中Borders參數:1-左、2-右、3-頂、4-底、5-斜、6-斜/;LineStyle值:1與7-細實、2-細虛、4-點虛、9-雙細實線)
  14.設置頁眉
  eole.ActiveSheet.PageSetup.CenterHeader=″報表1″
  15.設置頁腳
  eole.ActiveSheet.PageSetup.CenterFooter=″第&P頁″
  16.設置頁眉到頂端邊距為2釐米
  eole.ActiveSheet.PageSetup.HeaderMargin=2/0.035
  17.設置頁腳到底邊距為3釐米
  eole.ActiveSheet.PageSetup.FooterMargin=3/0.035
  18.設置頂邊距為2釐米
  eole.ActiveSheet.PageSetup.TopMargin=2/0.035
  19.設置底邊距為4釐米
  eole.ActiveSheet.PageSetup.BottomMargin=4/0.035
  20.設置左邊距為2釐米
  veole.ActiveSheet.PageSetup.LeftMargin=2/0.035
  21.設置右邊距為2釐米
  eole.ActiveSheet.PageSetup.RightMargin=2/0.035
  22.設置頁面水平居中
  eole.ActiveSheet.PageSetup.CenterHorizontally=.t.
  23.設置頁面垂直居中
  eole.ActiveSheet.PageSetup.CenterVertically=.t.
  24.設置頁面紙張大小(1-窄行8511 39-寬行1411)
  eole.ActiveSheet.PageSetup.PaperSize=1
  25.列印單格網線
  eole.ActiveSheet.PageSetup.PrintGridlines=.t.
  26.拷貝整個工作表
  eole.ActiveSheet.UsedRange.Copy
  27.拷貝指定區域
  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.設置字體
  eole.ActiveSheet.Cells(2,1).Font.Name=″黑體″
  32.設置字體大小
  eole.ActiveSheet.Cells(1,1).Font.Size=25
  33.設置字體為斜體
  eole.ActiveSheet.Cells(1,1).Font.Italic=.t.
  34.設置整列字體為粗體
  eole.ActiveSheet.Columns(1).Font.Bold=.t.
  35.清除單格公式
  eole.ActiveSheet.Cells(1,4).ClearContents
  36.列印預覽工作表
  eole.ActiveSheet.PrintPreview
  37.列印輸出工作表
  eole.ActiveSheet.PrintOut
  38.工作表另為
  eole.ActiveWorkbook.SaveAs(″c:\temp\22.xls″)
  39.放棄存檔
  eole.ActiveWorkbook.saved=.t.
  40.關閉工作簿
  eole.Workbooks.close
  41.退出Excel
  eole.quit
  以上控制調用語句在中文VFP5.0企業版下運行通過,運行環境為Excel 97及中文Windows 98

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
 
Ruey



註冊時間: 2003-03-12
文章: 1700
來自: tunglo

第 3 樓

發表於: 星期日 五月 04, 2003 3:18 pm    文章主題:

VFP調用EXCEL的補充方法
下面是我使用 VFP CALL EXCEL的部分例子:
這是本人從書本上抄的片斷和我的小小經驗,可以讓你很方便的在 VFP 中調用 EXCEL,所有的常式我都試驗過。
用Visual Foxpro 設計用Excel表格的程式
利用OLE Automation 設計Excel 應用程式
Excel支援的物件說明:
(a) VBA 對象:
物件名稱 意義
Application Excel應用程式物件
WorkBooks Excel活頁薄對象
(b)所使用的Method
物件名稱 Method 執行意義
Application Cells 設定或傳回來某個網格的內容
Range 傳回或設定某一個範圍的網格
Charts 傳回或設定活頁簿的單一統計表
Quit 結束 Excel Application
Save 啟動存儲檔對話方塊
WorkBooks Add 新增一個工作簿
Charts Add 新增一個統計圖
(c)所使用的Property
物件名稱 Property 設定意義
Application Visible 是否現實再 SCREEN上 .T. , .F.
value 傳回或者設定存儲檔的內容
ActiveSheet 回應Excel Application 執行工作表物件
實例說明:
啟動Excel:
MyExcel=CreateObject('Excel.Application') &&建立Excel物件
MyExcel.Visible=.T. &&讓Excel物件再螢幕上顯示出來
如何增加工作簿:
MyExcel.WorkBooks.Add &&在Excel物件中增加一份工作簿(WorkBook)
如何在工作簿中增加Sheet(工作表)
MyExcel.Sheets.Add &&增加工作表(在當前工作簿中)
如何刪除工作表
MyExcel.ActiveWorkBooks.Sheets(1).Delete &&把工作簿中的BOOK(1) 刪除
向指定的工作簿中的工作表(Sheet)中存儲資料
*Excel.application Object
*Excel.application.ActiveWorkBook Property
*WorkBOoks Object
*WorkBOoks Object的Add Method.
*Sheets對象
*Sheets(Index)物件指定索引工作表
*Excel.Application物件的Cells Method結合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='客戶編號'
MYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(1,2).value='公司行號'
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
調整單格寬度:
MYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(1,1).columnwidth=30
調整單格對齊方式:
MYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(1,1).horizontalalig=1
1為默認方式,2為左對齊,3為中對齊,4為右對齊。
如何將資料存儲:
MYEXCEL.SAVE()
注:可以用Save(FileName)指定預存儲檔案名, 則可不用啟動SAVE AS 窗口
如何列印表格:
MYEXCEL.ActiveWorkBook.PrintOut &&默認列印增個Sheet
如何指定列印表格:
MYEXCEL.ActiveWorkBook.PrintOut(1,1,1,.T.) &&默認列印增個Sheet
PrintOut有四個參數
A. 數值:,表示指定的工作簿中進行列印的Sheet 的開始編號
B. 數值:,表示指定的工作簿中進行列印的Sheet 的結束編號
C.列印分數.
D.是否進行 Preview, .T.,預覽, .F.列印
如何產生統計圖
CURROW=MYEXCEL.ACTIVESHEET.ROWS.COUNT
RANGESTRING='A1:'+'B'+ALLTRIM(STR(CURROW))
MYEXCEL.RANGE(RANGESTRING).SELECT
MYEXCEL.CHARTS.ADD
結束EXCEL
MYEXCEL.QUIT
EXCEL.ActiveWindow.SelectedSheets.PrintPreview &&預覽列印
EXCEL.ActiveWorkbook.SaveAs("C:\My Documents\Book1.xls") &&另存為
EXCEL.ActiveWorkbook.Close &&關閉一個工作表,如果有修改則提示
EXCEL.ActiveWorkbook.Close(.t.) &&提示另存為
EXCEL.ActiveWorkbook.Close(.f.) &&關閉一個工作表不用提示是否存檔

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
 
Ruey



註冊時間: 2003-03-12
文章: 1700
來自: tunglo

第 4 樓

發表於: 星期日 五月 04, 2003 3:19 pm    文章主題:

VFP下的SQL和EXCEL技術
  我們都知道在 EXCEL 中有很多很多的計算公式、靈活多變的計算方式、方便快捷的圖表處理、和功能強大的 VBA 語言,可以說 EXCEL 可能是最好用的表格處理軟體。我敢說:微軟的產品中大概就 EXCEL 最好!
  但是,怎樣用 Foxpro 快速產生統計表,並將資料送到 Excel表格中,從而代替 Foxpro 的報表工具呢?
  我們大家都知道,在 Visual Foxpro 3.0及以後版本中提供了一個調用Ole Automation 的函數 CREATEOBJECT,用該函數可以讓 Visual Foxpro 很方便的和其他可以提供 Ole Automation 服務的程式進行通訊。而 Excel 更是一個標準的 Ole Automation 伺服器程式,我們可以在前端將資料傳送到後端的 Excel 服務程式,用後端服務程式進行表格處理,從而彌補 Visual Foxpro的不足。
  由於歷史原因,我們作報表都習慣用 Total、Count、Sum 或者直接在報表中工具中計算,速度最快的大概也就是 Total 了,但不知道還有多少人還在堅持使用 Total 命令進行計算,有沒有更好的計算方法呢?當然有啦!我在實際使用中積累有一定的經驗但願能給各位起到小小的啟發。
假設有一表:Table1 是一個人員檔案,裏面的表結構如下:
----- 欄位名 -- 類型及長度---------
      編號    C,2
      部門    C,10
      姓名    C,10
      性別    C,2
      出生日期  D
      職務    C,10
      文化程度  C,10
內容大概如下
TABLE1.DBF
---------------------------------
編號  部門  姓名  性別  出生日期  職務    文化程度 
---------------------------------
 1  工程部  張三  男  1971-01-11 工程師   大學本科 
 2  銷售部  李四  男  1967-02-23 經理    大學本科 
 3  工程部  王武     1954-03-14 技術員   大學專科 
 4  總經理室 趙潔雅 女  1975-04-05 秘書    碩士研究生
 5  銷售部  ..     1977-05-09 銷售經理  高中   
 6  工程部  大文     1969-03-30 總工程師  大學專科 
 7  銷售部  ..     1961-10-10 銷售經理  大學專科 
 8  總經理室 莊稼     1961-10-10 總經理   大學專科 
  當然實際的資料應該比這裏多很多,要不還用統計幹嗎,我不過是舉例說明而已。我不知道你們在使用 SQL 語句時有沒有用使用函數的習慣,反正我是相當願意在 SQL 中使用函數,我認為使用函數的 SQL 語句雖然語句長一點,但是可以讓你的程式看起來更清晰、簡潔。
  說道這裏我要感謝當初發明出 IIF 函數那位元高人,要沒有他(她)我也沒有機會在這裏囉嗦這麼久,在後面提到的快速產生統計表中將大量的運用 IIF 函數。也許你會覺得奇怪,你統計的時候用那麼多 IIF 幹嗎?別急,下面就讓我慢慢的告訴你。
  看看我們前面描述的表,我們可能要統計各個部門的“性別|職務|文化程度”等的分佈情況,簡單一點我給畫了一個表個出來,可能表格更能說明白:

          各部門人員分佈情況表
                            單位:人
---------------------------------
部門  | 男| 女| 本科 | 專科|技術人員|管理人員|秘書 
---------------------------------
工程部 |  |  |    |   |    |    |   
銷售部 |  |  |    |   |    |    |   
總經理室|  |  |    |   |    |    |   
    |  |  |    |   |    |    |   
    |  |  |    |   |    |    |   
---------------------------------
  上面這張表說複雜也不複雜,但是用常給的處理方法可能也要耗掉我們不少的時間,因為你不得不針對不同的項目進行單獨反復的計算,可能還要生成一大堆的臨時表真煩!下面的計算公司可讓你輕鬆完成上面的表格,當然程式還是要寫的不可能什麼也不動不想就能達到的,立即輸入下列程式:
第一步:轉換
Select 部門,;
    iif(性別='男',1,0) as 男,;
    iif(性別='女',1,0) as 女,;
    iif(文化程度='大學本科',1,0) as 大學本科,;
    iif(文化程度='大學專科',1,0) as 大學專科,;
    iif(inlist(職務,'工程師','技術員','總工程師'),1,0) as 技術人員,;
    iif(inlist(職務,'總經理','經理','銷售經理'),1,0) as 管理人員,;
    iif(inlist(職務,'總經理','經理','銷售經理'),1,0) as 管理人員,;
    iif(inlist(職務,'秘書'),1,0) as 秘書;
from table into cursor query1
第二步:轉換並計算
Select 部門      as 部門,;
    sum(男)    as 男,;
    sum(女)    as 女,;
    sum(大學本科) as 大學本科,;
    sum(大學專科) as 大學專科,;
    sum(技術人員) as 技術人員,;
    sum(管理人員) as 管理人員,;
    sum(管理人員) as 管理人員,;
    sum(秘書)   as 秘書;
from query1 into cursor query1;
group by 部門
  不要以為我把“from query1 into cursor query1”寫錯了,這樣寫的語句確實可以使用。
  到這一步,統計表就計算出來了,不信用 BROWSE 看看。往下面我們應該說說怎樣把現在統計出的資料輸出到 EXCEL 中了(當然什麼樣子的資料都可以)。
首先用 CreateObject 函數建立一個 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' &&未能產生EXCEL物件
   '啟動 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 &&用物件代替這麼長的一串字
o.cells(1,1).value=ReportTitle
*
* 第一行是標題,故從第二行開始
*
scan for recno()>1 &&每一行
  '正在將資料轉換到 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 處理完畢後再繼續
*
do while .t.
  @1,4 say '已啟動後臺 Excel 表格處理程式,處理中...'
  @2,4 say 'Ctrl+End 繼續處理...'
  @4,4 say '開始時間:'
  starttime
  @5,4 say '現在時間:'
  time()
  &&VFP會在此等待,除非你從 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

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
 
garfield
Site Admin


註冊時間: 2003-01-30
文章: 1926


第 5 樓

發表於: 星期三 七月 02, 2003 1:23 am    文章主題:

VFP與EXCEL的幾種交互編程方法

一、EXECL驅動VFP
EXECL內置的VBA語言(Visual Basic For Application)爲EXECL功能的擴展提供了便利的手段,用戶可使用該語言直接驅動VFP完成資料檢索等功能。
程式首先生成一個VFP物件,然後用VFP的DoCmd方法執行VFP摸索命令串,其摸索結果再借助於VFP的DateToClip方法拷貝至剪切板,最後VBA將其粘貼至工作表的正確位置。
Sub FoxTest()

Dim oFox As Object
Dim SLesson As String
Dim SCommand As String

Set oFox = CreateObject("VisualFoxPro.Application") '啓動VFP,生成VFP物件
Sheets("查詢").Select
SLesson = Range("課程名") '在名爲“課程名”的單格中得到欲查詢的課程名稱
Sheets.Add '産生新的工作表單
ActiveSheet.Name = Slesson '指定工作表單的名稱與課程名稱相同

SCommand = "SELECT 學號,語文,數學 FROM d:\vfp\學生成績表 WHERE "+ SLesson + "<60 INTO CURSOR TEMP" '形成VFP查詢命令串
oFox.DoCmd Scommand '執行VFP命令串
oFox.DataToClip "temp", , 3 '將搜索結果以文本方式拷貝至剪切板
Range("a1:a1").Select '指向拷貝目標區域左上角單元
ActiveSheet.Paste '粘貼搜索結果

End Sub

爲便於使用,作者在EXECL中自製了一名爲“搜索”的工具欄及一名爲“開始搜索”的按鈕,並將上述巨集程式段與自製按鈕相關聯,按下此按鈕即可運行程式並在EXCEL中得到要求的資料。
製作工具欄及按鈕的方法如下:
1. 選“工具”/“自定義”功能表,出現自定義對話方塊;
2. 選擇“工具欄”頁框,然後按下“新建”按鈕;
3. 在工具欄對話方塊中輸入“搜索”作爲新建工具欄的名稱;
4. 選擇“命令”頁框,在“類別”列表中選“宏”,在“命令”列表中選“自定義按鈕”並將其拖放至新建的“搜索”工具欄;
5. 按下“更新所選內容”按鈕,首先在“命名”欄中填入按鈕名稱“開始搜索”,然後選擇“指定宏”,在隨後出現的“指定宏”列表中選擇上述巨集程式FoxTest()即可實現爲該巨集指定一個工具欄按鈕。

二、VFP使用OLE功能驅動EXECL
OLE(Object Linking and Embedding)物件鏈結與嵌入,是WINDOWS應用程式間相互傳遞和共用資料的一種有效方法。VFP借助於OLE不僅可共用其他應用程式的資料,而且還能以物件方式直接控制其他應用程式的運行,從而進一步擴展VFP的功能。VFP支援直接在程式中創建、使用和控制OLE物件,實現OLE自動化。作爲OLE客戶VFP與作爲OLE伺服器的EXCEL具有良好的編程介面,下述程式段用OLE方式實現所要求的功能。
程式首先生成一個EXCEL的OLE物件OleApp以便對其進行操作,然後利用OLE功能從EXCEL表單中獲取欲查詢的課程名,並控制EXCEL生成新的工作表,VFP的查詢結果仍然使用剪切板的方式傳遞至EXCEL工作表。

OleApp=CREATEOBJECT("Excel.Application") && 打開EXCEL,産生OLE物件
OleApp.Application.Caption="VFP交互編程" && 指定標題欄名稱
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 學號,語文,數學 FROM d:\vfp\學生成績表 WHERE " +ALLTrim(SLesson) + "<60 INTO CURSOR TEMP" && 形成VFP查詢命令串
&Scommand && 執行VFP命令串
_VFP.DataToClip("TEMP",,3) && 將搜索結果以文本方式拷貝至剪切板
.Range("a1:a1").Select && 指向拷貝目標區域左上角單元
.ActiveSheet.Paste && 粘貼搜索結果
ENDWITH
ENDDO

OleApp.Quit && 關閉EXCEL,保存更新後的工作簿文件
三、VFP使用DDE功能驅動EXECL
DDE(Dynamic Data Exchange)動態資料交換,是WINDOWS應用程式間相互傳遞和共用資料的另一種有效方法,DDE用共用記憶體在應用程式間交換資料。DDE會話發生在DDE客戶與DDE伺服器應用程式之間,客戶應用程式向伺服器應用程式請求資料和服務,而伺服器回應客戶應用程式對資料與服務的請求。DDE的資料交換可分三種方式:
* 冷鏈結:客戶應用程式請求資料時,伺服器應用程式才發送資料給客戶應用程式;
* 暖鏈結:伺服器應用程式在每次資料項目的值變化時都向客戶應用程式發送通告,但它並不直接發送值給客戶應用程式,而由客戶應用程式決定是否取得該資料;
* 熱鏈結:伺服器應用程式在每次值變化時都發送資料項目的新值給客戶應用程式。
VFP與EXCEL均支援DDE客戶與伺服器。下述程式段由作爲DDE客戶的VFP應用程式與作爲DDE伺服器的EXCEL用DDE方式實現所要求的功能。
程式首先啓動EXCEL,然後在VFP應用程式與“查詢”工作表單的“課程名”單格之間形成“熱鏈結”,當“課程名”單格內容改變時,將自動執行
“GetData”過程。在該過程中首先直接獲取DDE資料,如果該資料爲“空”,則關閉EXCEL,程式結束;反之,利用DDEPOKE功能向EXCEL發送鍵盤命令串,以形成新的工作表,最後VFP將查詢結果通過剪切板送EXCEL形成要求的工作表。

PUBLIC ExcelChan
PUBLIC SheetChan

RUN /N3 C:\Program Files\Microsoft Office\Office\EXCEL.EXE && 以“活動”與“最大化方式啓動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應用程式與“查詢”工作表單的“課程名”單格之間形成“熱鏈結”!如果該單元數值改變,則執行“GetData”過程。

PROCEDURE GetData
PARAMETERS Channel, Action, Item, Data, Format, Advise
IF Action = 'ADVISE' .AND. Item = '課程名' && 伺服器提供的鏈結名爲“課程名”
SLesson = Data && 直接獲取DDE伺服器提供的資料
SLesson = LEFT(SLesson,LEN(SLesson)-2) && 去掉原始資料尾部的格式字元
IF (LEN(SLesson)=0) && 如果指定單格內容爲“空”,則退出
= DDETerminate(SheetChan) && 終止DDE通道SheetChan
= DDEExecute(ExcelChan,'[Quit]') && 退出EXCEL
= DDETerminate(ExcelChan) && 終止DDE通道ExcelChan
ELSE
= DDEExecute(ExcelChan,'[Formula.Goto("課程名")]') && 指定名爲“課程名”
的單格爲活動單格
= DDEExecute(ExcelChan,'[Copy]') && 將指定單格內容拷貝至剪切板
SKey="'%IW%OHR^V{enter}'" && 鍵盤命令字串,表示“插入(I)|工作表(W);格式(O)|工作表(H)|重命名(R);粘貼”
= DDEExecute(ExcelChan,&SKey) && 通過DDE通道將命令串送EXCEL
WAIT WINDOW TIMEOUT 2 && 等待2秒鐘以實現上述命令串
SCommand = "SELECT 學號,語文,數學 FROM d:\vfp\學生成績表 WHERE " +ALLTRIM(SLesson) + "<60 INTO CURSOR TEMP" && 形成VFP查詢命令串
&Scommand && 執行VFP命令串
_VFP.DataToClip("TEMP",,3) && 將搜索結果以文本方式拷貝至剪切板

SheetChan1 = DDEInitiate("Excel",'&SLesson') && 初始化DDE通道SheetChan1
指向新生成的工作表
= DDEExecute(SheetChan1,'[Paste]') && 粘貼搜索結果
= DDETerminate(SheetChan1) && 終止DDE通道SheetChan1
ENDIF

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
台灣筷樂

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多