[BCB] 怎樣用C++Builder存取Excel |
|
axsoft
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
怎樣用C Builder存取Excel江蘇儀征化纖公司二廠 楊華 何激越 資料來源:計算機世界日報 http://www2.ccw.com.cn/tips/2k02/022504_03.asp ---- C Builder是Borland公司繼Delphi之後又一成功的產品,她集VB、VC 及 Delphi 的優點於一體而深得C語言愛好者的青睞。由於多數操作者愛用 MicroSoft公司的Excel組織數據,為此本文介紹了用C Builder存取Excel 文件的兩種方法。 ---- 一.用OLE技術操縱Excel ---- OLE(對象鏈接與嵌入)是微軟提出的標準,是應用程序間交換數據、相互操作的一種方式,MS OFFICE 提供了很強的 OLE 服務功能,VB、Delphi 及C Builder等語言都可以以客戶方式向Excel提交命令,以存取其數據,其中VB和Delphi最為簡單,在語法上就採用類VBA的語句,本報九九年第48期的《在Delphi中操作Excel》一文曾介紹了Delphi的做法。我們原以為C Builder照搬Delphi,結果語法編譯都未能通過,查不到這方面具體介紹的資料。經反復試驗方知:原來C Builder採用間接的辦法,利用變體類Variant所提供的四個“方法”向OLE服務程序提交操縱命令: Variant Variant::OlePropertyGet(屬性名,參數….); // 取對象屬性 Void Variant::OlePropertySet(屬性名,參數….); // 設置對象屬性 Variant Variant::OleFunction(函數名,參數….); // 運行對象的函數 void Variant::OleProcedure(過程名,參數….); // 運行對象的過程 其頭文件“vcl\utilcls.h”必須嵌在用戶程序中, 對於這四個長長的方法名可在程序中用宏語句重新定義一下: #define PG OlePropertyGet #define PS OlePropertySet #define FN OleFunction #define PR OleProcedure 例如對於VB的提交語句: Ex.ActiveWorkBook.ActiveSheet.Cells(1,2).Value=3 為便於理解在C Builder對應的語句可分解為如下四句: Variant t1=Ex.OlePropertyGet("ActiveWorkBook"); Variant t2=t1.OlePropertyGet("ActiveSheet"); Variant t3=t2.OlePropertyGet("Cells,1,2); t3.OlePropertySet("Value",3); 可去掉中間變量將這四句合為一句,就是: Ex.PG("ActiveWorkBook").PG("ActiveSheet"). PG("Cells",1,2).PS("Value",3); 我們將下面的VB程序片段改成對應的C Builder程序以供參考: Private Sub Command1_Click() ' Visual Basic程序片段 Dim Ex As Object,Wb As Object, Sh1 As Object Set Ex = CreateObject("Excel.Application") Ex.WorkBooks.Open("c:\book1.xls") Set Wb = Ex.Activeworkbook Set Sh1 = Wb.ActiveSheet Text1.Text = Sh1.Cells(1, 1).Value For i = 1 To 10: For j = 1 To 10 Sh1.Cells(i, j).Value = i * 100 j Next j: Next i Wb.save: Wb.Close: Ex.Quit End Sub ' - - - - - -- - - - - - - - - - - #include "Unit1.h" // C Builder程序片段 #include "vcl\utilcls.h" // util classes實用類說明 // …省寫此處原一段代碼 // 請在此處插入上面提及的四個宏定義語句 void __fastcall TForm1::Button1Click(TObject *Sender) { Variant Ex,Wb,Sh1; Ex=Variant::CreateObject("Excel.Application"); Ex.PG("WorkBooks").PR("Open","c:\\book1.xls"); Wb=Ex.PG("ActiveWorkBook"); Sh1=Wb.PG("ActiveSheet"); Edit1->Text=Sh1.PG("Cells",1,1).PG("Value"); for (int i=1;i<=10;i ) for (int j=1;j<=10;j ) Sh1.PG("Cells",i,j).PS("Value",i*100 j); Wb.PR("Save"); Wb.PR("Close"); } ---- 使用這種方法的程序運行時,必須保證系統中同時有MS OFFICE﹔下面我們再介紹另一種脫離MS OFFICE也能存取Excel表格的方法。 ---- 二.用ODBC數據庫技術存取Excel ---- ODBC就是開放式數據庫鏈接標準,不同種類的數據庫只需提供各自的ODBC 驅動程序就可按相同的命令操縱,微軟同樣為Excel提供了ODBC驅動程序,我 們可在程序中象數據庫一樣存取Excel表格。定義好ODBC數據源後,實際試驗 中並沒有如想象的那樣簡單,在控件Table的屬性TableName中總是檢索不到 表名,同樣也沒有相關的資料可供查閱。通過對Excel的分析,終於發現了問 題的關鍵所在:ODBC的表名並不就是Excel的工作表名(如Sheet1),在Excel 表格中必須對要求操作的行列區域定義一個“名稱”作為數據庫的表名,該區 域的首行各列必須是字段名(否則首行數據會當成字段名),可以定義多個表名。 具體操作步驟如下: ---- 1.在Excel上定義“表名”: ---- 運行Excel程序,打開或新建一表格,按下鼠標左鍵選擇一片區域(起始 行先填上字段名),再將鼠標位置點到左上角的地址欄,輸入一表名如ABC,或 者在菜單上選:“插入(I)”-“名稱(N)”-“定義(D)”,再輸入表名(若已定義, 可在此處刪除掉),存盤退出(假定文件名取為c:\Book.xls),若嫌字段名行 多餘,存盤前可隱藏掉﹔ ---- 2.定義ODBC數據源: ---- 從Windows桌面“我的電腦"進入“控制面板”,雙擊“32位ODBC”圖標,運 行“用戶DSN”中的“添加(D)"後選“Excel Driver(*.xls)", 再點“完成”便彈出 對話框,在“數據源名(N)"右邊填一名稱,如:excel01,在“版本(V)"上選“Excel97", 點中“選項”取消“只讀”,在“選定工作目錄”中,選定Excel文件名(本例 c:\Book1.xls),再點“確定”直至退出﹔ ---- 3.設置Database控件避免登錄檢查: ---- 運行C Builder,在Form1中加上Data Access的三個控件:Database1、 DataSource1、Table1,加入Database1的目的是為了避免打開數據庫時出 現登錄框,為此雙擊此控件彈出一對話框,在Alias name中選ODBC數據源名(本 例為Excel01),在Name中填上一新的別名(本例取Excel02),再點“Defaults” 出現一批參數缺省值,最後取消Options中的兩項“Login prompt"與"Keep inactive connect”,點OK退出﹔ ---- 4.設置其它控件屬性: ---- 將Table1的屬性DatabaseName選為步驟3中的新別名Excel02,再將另一 屬性TableName選為步驟1的表名(本例為ABC);將控件DataSource1的屬性 DataSet選為Table1﹔雙擊Form1,在FormCreate事件子程序內加上一句 Table1- >Open( )﹔ ---- 5.查看數據庫內容: ---- 為了直接看到Excel數據,在Form1中再加上Data Controls的控件DBGrid1 和DBNavigator1,將兩者的屬性DataSource都選為DataSource1,雙擊Table1 的屬性Active將值改為true,等待數秒就可看到DBGrid1中出現數據,最後恢 復Tabel1- >Active為false﹔ ---- 注意:程序編譯前,必須將剛打開的表關閉,即:使Table1- >Active為false, 否則程序運行時報告出錯,因為Excel表總是被ODBC以“獨佔”方式打開﹔ ---- 我們使用的是C Builder 4.0專業版,電子表格為Excel 97。 ________________________________________________________________________![]() |
jackkcg
站務副站長 ![]() ![]() ![]() ![]() ![]() 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
http://www.ccidnet.com/tech/guide/2001/02/16/58_1685.html 如何在Delphi中操作Excel
(作者:穆永 2001年02月16日 14:55) 在資料庫應用軟體的開發過程中,經常需要把資料轉換成Excel文件,讓用戶作進一步的資料處理。而Delphi是開發資料庫應用系統的常用工具,那?,如何在Delphi中操作Excel呢? 我們知道,在Microsoft Office軟體中有一種內嵌的編程語言VBA,它是一種巨集語言,利用它,你可以編寫出功能強大的代碼,如打開文件、修改資料、保存資料和設置字體等。另一方面,Microsoft Office軟體中的巨集能以VBA代碼的形式記錄下你的操作過程。因此借助宏操作,可以很輕鬆地實現某一功能,並把這些代碼稍作修改嵌入到你的軟體中。但是VBA也存在一個缺點,它必須有Microsoft Office作平臺,在哪里編寫,必須在哪里執行。例如在Excel下編寫的一段VBA代碼,則它只有在Excel下才能運行。因此,筆者的方法就是把VBA代碼嵌入到Delphi中,從而實現用Delphi操作Excel。 下面,我們以Delphi程式?例,說明這種調用方法: Unit excel; interface uses Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,ComObj; //ComObj是操作OLE物件的函數集 type TForm1 =class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var eclApp,WorkBook:Variant; //聲明?OLE Automation 物件 xlsFileName:string;begin xlsFileName:='ex.xls'; try //創建OLE物件Excel Application與 WorkBook eclApp:=CreateOleObject('Excel.Application'); WorkBook:=CreateOleobject('Excel.Sheet'); except ShowMessage('您的機器裏未安裝Microsoft Excel。'); Exit; end; try ShowMessage('下面演示:新建一個XLS文件,並寫入資料,最後關閉它。'); workBook:=eclApp.workBooks.Add; eclApp.Cells(1 , 1):='字元型'; eclApp.Cells(2 , 1):='Excel文件'; eclApp.Cells(1 , 2):='Money型'; eclApp.Cells(2 , 2):=10.01; eclApp.Cells(1 , 3):='日期型';eclApp.Cells(2 , 3):=Date; WorkBook.saveas(xlsFileName); WorkBook.close; ShowMessage('下面演示:打開剛創建的XLS文件,並修改其中的內容,然後,由用戶決定是否保存。'); WorkBook:=eclApp.workBooks.Open(xlsFileName); eclApp.Cells(2 , 1):='Excel文件類型'; if MessageDlg(xlsFileName '文件已被修改,是否保存?',mtConfirmation, [mbYes, mbNo], 0) = mrYes then WorkBook.save else workBook.Saved := True; //放棄修改 WorkBook.Close; eclApp.Quit; //退出Excel Application //釋放VARIANT變數 eclApp:=Unassigned; except ShowMessage('不能正確操作Excel文件。可能是該文件已被其他程式打開,或系統錯誤。'); WorkBook.close; eclApp.Quit; //釋放VARIANT變數 eclApp:=Unassigned; end; end; end. 經過上述操作過程後,我們就可以很放心地將資料庫中的資料轉換成Excel文件了。 如何在Delphi中操作Excel
(作者:穆永 2001年02月16日 14:55) 在?据??用?件的???程中,?常需要把?据??成Excel文件,?用?作?一步的?据?理。而Delphi是???据??用系?的常用工具,那么,如何在Delphi中操作Excel呢? 我?知道,在Microsoft Office?件中有一种?嵌的?程?言VBA,它是一种宏?言,利用它,你可以??出功能?大的代?,如打?文件、修改?据、保存?据和?置字体等。另一方面,Microsoft Office?件中的宏能以VBA代?的形式??下你的操作?程。因此借助宏操作,可以很?松地??某一功能,并把?些代?稍作修改嵌入到你的?件中。但是VBA也存在一?缺?,它必?有Microsoft Office作平台,在哪里??,必?在哪里?行。例如在Excel下??的一段VBA代?,?它只有在Excel下才能?行。因此,?者的方法就是把VBA代?嵌入到Delphi中,?而??用Delphi操作Excel。 下面,我?以Delphi程序?例,?明?种?用方法: Unit excel; interface uses Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,ComObj; //ComObj是操作OLE?象的函?集 type TForm1 =class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var eclApp,WorkBook:Variant; //?明?OLE Automation ?象 xlsFileName:string;begin xlsFileName:='ex.xls'; try //?建OLE?象Excel Application与 WorkBook eclApp:=CreateOleObject('Excel.Application'); WorkBook:=CreateOleobject('Excel.Sheet'); except ShowMessage('您的机器里未安?Microsoft Excel。'); Exit; end; try ShowMessage('下面演示:新建一?XLS文件,并?入?据,最后??它。'); workBook:=eclApp.workBooks.Add; eclApp.Cells(1 , 1):='字符型'; eclApp.Cells(2 , 1):='Excel文件'; eclApp.Cells(1 , 2):='Money型'; eclApp.Cells(2 , 2):=10.01; eclApp.Cells(1 , 3):='日期型';eclApp.Cells(2 , 3):=Date; WorkBook.saveas(xlsFileName); WorkBook.close; ShowMessage('下面演示:打???建的XLS文件,并修改其中的?容,然后,由用??定是否保存。'); WorkBook:=eclApp.workBooks.Open(xlsFileName); eclApp.Cells(2 , 1):='Excel文件?型'; if MessageDlg(xlsFileName '文件已被修改,是否保存?',mtConfirmation, [mbYes, mbNo], 0) = mrYes then WorkBook.save else workBook.Saved := True; //放?修改 WorkBook.Close; eclApp.Quit; //退出Excel Application //?放VARIANT?量 eclApp:=Unassigned; except ShowMessage('不能正确操作Excel文件。可能是?文件已被其他程序打?,或系???。'); WorkBook.close; eclApp.Quit; //?放VARIANT?量 eclApp:=Unassigned; end; end; end. ??上述操作?程后,我?就可以很放心地??据?中的?据??成Excel文件了。 如何在Delphi中操作Excel
(作者:穆永 2001年02月16日 14:55) 在資料庫應用軟體的開發過程中,經常需要把資料轉換成Excel文件,讓用戶作進一步的資料處理。而Delphi是開發資料庫應用系統的常用工具,那?,如何在Delphi中操作Excel呢? 我們知道,在Microsoft Office軟體中有一種內嵌的編程語言VBA,它是一種巨集語言,利用它,你可以編寫出功能強大的代碼,如打開文件、修改資料、保存資料和設置字體等。另一方面,Microsoft Office軟體中的巨集能以VBA代碼的形式記錄下你的操作過程。因此借助宏操作,可以很輕鬆地實現某一功能,並把這些代碼稍作修改嵌入到你的軟體中。但是VBA也存在一個缺點,它必須有Microsoft Office作平臺,在哪里編寫,必須在哪里執行。例如在Excel下編寫的一段VBA代碼,則它只有在Excel下才能運行。因此,筆者的方法就是把VBA代碼嵌入到Delphi中,從而實現用Delphi操作Excel。 下面,我們以Delphi程式?例,說明這種調用方法: Unit excel; interface uses Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,ComObj; //ComObj是操作OLE物件的函數集 type TForm1 =class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var eclApp,WorkBook:Variant; //聲明?OLE Automation 物件 xlsFileName:string;begin xlsFileName:='ex.xls'; try //創建OLE物件Excel Application與 WorkBook eclApp:=CreateOleObject('Excel.Application'); WorkBook:=CreateOleobject('Excel.Sheet'); except ShowMessage('您的機器裏未安裝Microsoft Excel。'); Exit; end; try ShowMessage('下面演示:新建一個XLS文件,並寫入資料,最後關閉它。'); workBook:=eclApp.workBooks.Add; eclApp.Cells(1 , 1):='字元型'; eclApp.Cells(2 , 1):='Excel文件'; eclApp.Cells(1 , 2):='Money型'; eclApp.Cells(2 , 2):=10.01; eclApp.Cells(1 , 3):='日期型';eclApp.Cells(2 , 3):=Date; WorkBook.saveas(xlsFileName); WorkBook.close; ShowMessage('下面演示:打開剛創建的XLS文件,並修改其中的內容,然後,由用戶決定是否保存。'); WorkBook:=eclApp.workBooks.Open(xlsFileName); eclApp.Cells(2 , 1):='Excel文件類型'; if MessageDlg(xlsFileName '文件已被修改,是否保存?',mtConfirmation, [mbYes, mbNo], 0) = mrYes then WorkBook.save else workBook.Saved := True; //放棄修改 WorkBook.Close; eclApp.Quit; //退出Excel Application //釋放VARIANT變數 eclApp:=Unassigned; except ShowMessage('不能正確操作Excel文件。可能是該文件已被其他程式打開,或系統錯誤。'); WorkBook.close; eclApp.Quit; //釋放VARIANT變數 eclApp:=Unassigned; end; end; end. 經過上述操作過程後,我們就可以很放心地將資料庫中的資料轉換成Excel文件了。 發表人 - jackkcg 於 2002/10/04 10:07:01
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |