<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 0, comments - 77, trackbacks - 0, articles - 356
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    用C++Builder存取Excel文件[轉載]

    Posted on 2006-05-12 15:05 semovy 閱讀(1164) 評論(0)  編輯  收藏 所屬分類: C++ Builder相關
    文檔標題:用C++Builder存取Excel文件  作者:?佚名

    關?鍵?字:Excel,OLE技術,Variant,ODBC,CreateObject,Cells

    本文轉自?C++Builder?研究?-?http://www.ccrun.com/article/go.asp?i=20&d=8d0grf
    ----?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。?
    ----?經老妖試驗,在win2000,Excel?2000,C++?Builder?6.0中使用正常。
    ?
    主站蜘蛛池模板: 黄色a三级免费看| 亚洲欧洲在线播放| 亚洲色欲色欲www在线丝| 四虎免费久久影院| 国产成人免费a在线视频色戒| 日韩人妻无码免费视频一区二区三区 | 免费在线观看的网站| 久久www免费人成看片| 24小时免费看片| 免费国产成人高清在线观看网站| 日本h在线精品免费观看| 日韩精品无码区免费专区| 人禽杂交18禁网站免费| 午夜高清免费在线观看| 国产精品嫩草影院免费| 亚洲国产一区明星换脸| 91麻豆国产自产在线观看亚洲| 亚洲色婷婷六月亚洲婷婷6月| 亚洲国产精品无码av| 在线电影你懂的亚洲| 亚洲人成在久久综合网站| 亚洲无码一区二区三区 | 国产亚洲婷婷香蕉久久精品| 国产V亚洲V天堂无码| 伊人久久综在合线亚洲2019| 亚洲二区在线视频| 亚洲第一成年免费网站| 免费看一级一级人妻片| 免费观看一区二区三区| 亚洲视频免费播放| 日本无吗免费一二区| 国产亚洲精品免费视频播放| 亚洲VA中文字幕无码一二三区 | 亚洲另类古典武侠| 亚洲av无码专区首页| eeuss在线兵区免费观看| 国产激情免费视频在线观看 | 一级毛片免费视频| 国产精品无码免费播放| 2048亚洲精品国产| 亚洲第一页在线观看|