posts - 0, comments - 77, trackbacks - 0, articles - 356
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          文檔標(biāo)題:用OLE操作Excel(目前最全的資料)(04.2.19更新)  作者:?ccrun

          關(guān)?鍵?字:Office,Excel,Sheet,Cell,OLE,CreateObject,Merge,工作簿,工作表,單元格,合并,自動(dòng)化

          本文轉(zhuǎn)自?C++Builder?研究?-?http://www.ccrun.com/article/go.asp?i=529&d=0iezy5
          用OLE操作Excel(目前最全的資料)(04.2.19更新)
          本文檔部分資料來自互聯(lián)網(wǎng),大部分是ccrun(老妖)在Excel中通過錄制宏-->察看宏代碼-->轉(zhuǎn)為CB代碼而來.本文檔不斷更新中.歡迎大家關(guān)注.

          要在應(yīng)用程序中控制Excel的運(yùn)行,首先必須在編制自動(dòng)化客戶程序時(shí)包含Comobj.hpp
          #include?\\\"Comobj.hpp\\\"

          C++?Builder把Excel自動(dòng)化對(duì)象的功能包裝在下面的四個(gè)Ole?Object?Class函數(shù)中,應(yīng)用人員可以很方便地進(jìn)行調(diào)用。
          設(shè)置對(duì)象屬性:void OlePropertySet(屬性名,參數(shù)……);
          獲得對(duì)象屬性:Variant ?OlePropertyGet(屬性名,參數(shù)……);
          調(diào)用對(duì)象方法:1)?Variant OleFunction(函數(shù)名,參數(shù)……);
          ?2)?void ?OleProcedure(過程名,參數(shù)……);

          在程序中可以用宏定義來節(jié)省時(shí)間:

          #define ?PG ?OlePropertyGet
          #define ?PS ?OlePropertySet
          #define ?FN ?OleFunction
          #define ?PR ?OleProcedure

          舉例:
          ExcelApp.OlePropertyGet(\\\"workbooks\\\").OleFunction(\\\"Add\\\");
          可寫為
          ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\");

          C++?Builder中使用OLE控制Excel2000,必須掌握Excel2000的自動(dòng)化對(duì)象及Microsoft?Word?Visual?Basic幫助文件中的關(guān)于Excel的對(duì)象、方法和屬性。對(duì)象是一個(gè)Excel元素,屬性是對(duì)象的一個(gè)特性或操作的一個(gè)方面,方法是對(duì)象可以進(jìn)行的動(dòng)作。
          首先定義以下幾個(gè)變量:
          Variant?ExcelApp,Workbook1,Sheet1,Range1;

          1、Excel中常用的對(duì)象是:Application,Workbooks,Worksheets等。

          ★創(chuàng)建應(yīng)用對(duì)象★
          ?Variant?ExcelApp;
          ?ExcelApp?=?Variant::CreateObject?(\\\"Excel.Application\\\");
          ?或者
          ?ExcelApp?=?CreateOleObject?(\\\"Excel.Application\\\");

          ★創(chuàng)建工作簿對(duì)象★
          ?Variant?WorkBook1;
          ?WorkBook1?=?ExcelApp.PG(\\\"ActiveWorkBook\\\");

          ★創(chuàng)建工作表對(duì)象★
          ?Variant?Sheet1;
          ?Sheet1?=?WorkBook1.PG(\\\"ActiveSheet\\\");

          ★創(chuàng)建區(qū)域?qū)ο蟆?br />?Variant?Range;
          ?Range?=?Sheet1.PG(\\\"Range\\\",\\\"A1:A10\\\");
          ?或者使用
          ?Excel.Exec(PropertyGet(\\\"Range\\\")<<\\\"A1:C1\\\").Exec(Procedure(\\\"Select\\\"));

          2、常用的屬性操作:

          ★使Excel程序不可見★
          ?ExcelApp.PS(\\\"Visible\\\",?(Variant)false);

          ★新建EXCEL文件★

          ◎?新建系統(tǒng)模板的工作簿
          ?ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\") //默認(rèn)工作簿
          ?ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\",?1) ?//單工作表
          ?ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\",?2) ?//圖表
          ?ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\",?3) ?//宏表?
          ?ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\",?4) ?//國(guó)際通用宏表
          ?ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\",?5) ?//與默認(rèn)的相同
          ?ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\",?6) ?//工作簿且只有一個(gè)表
          ?或者使用ExcelApp的Exec方法
          ?Excel.Exec(PropertyGet(\\\"Workbooks\\\")).Exec(Procedure(\\\"Add\\\"));
          ◎?新建自己創(chuàng)建的模板的工作簿
          ?ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\",?\\\"C:\\\\\\\\Temp\\\\\\\\result.xlt\\\");

          ★打開工作簿★
          ?ExcelApp.PG(\\\"workbooks\\\").FN(\\\"open\\\",?\\\"路徑名.xls\\\")

          ★保存工作簿★
          ?WorkBook1.FN(\\\"Save\\\"); //保存工作簿
          ?WorkBook1.FN(\\\"SaveAs\\\",?\\\"文件名\\\");//工作簿保存為,路徑注意用\\\"\\\\\\\\\\\"

          ★退出EXCEL★
          ?ExcelApp.FN?(\\\"Quit\\\");
          ?ExcelApp?=?Unassigned;
          ?或者
          ?ExcelApp.Exec(Procedure(\\\"Quit\\\"));

          ★操作工作表★

          ◎?選擇選擇工作表中第一個(gè)工作表
          ?Workbook1.PG(\\\"Sheets\\\",?1).PR(\\\"Select\\\");
          ?Sheet1?=?Workbook1.PG(\\\"ActiveSheet\\\");

          ◎?重命名工作表
          ?Sheet1.PS(\\\"Name\\\",?\\\"Sheet的新名字\\\");

          ◎?當(dāng)前工作簿中的工作表總數(shù)
          ?int?nSheetCount=Workbook1.PG(\\\"Sheets\\\").PG(\\\"Count\\\"); ?

          ★操作行和列★
          ?
          ◎?獲取當(dāng)前工作表中有多少行和多少列:
          ?Sheet1.PG(\\\"UsedRange\\\").PG(\\\"Columns\\\").PG(\\\"Count\\\");?//列數(shù)
          ?Sheet1.PG(\\\"UsedRange\\\").PG(\\\"Rows\\\").PG(\\\"Count\\\"); //行數(shù)

          ◎?設(shè)置列寬
          ?ExcelApp.PG(\\\"Columns\\\",?1).PS(\\\"ColumnWidth\\\",?22);
          ?或者
          ?Range?=?ExcelApp.PG(\\\"Cells\\\",?1,?3);
          ?Range.PS(\\\"ColumnWidth\\\",?22);

          ◎?設(shè)置行高
          ?ExcelApp.PG(\\\"Rows\\\",?2).PS(\\\"RowHeight\\\",?25);
          ?或者
          ?Range?=?ExcelApp.PG(\\\"Cells\\\",?2,?1);
          ?Range.PS(\\\"RowHeight\\\",?25); ?

          ◎?在工作表最前面插入一行
          ?Sheet1.PG(\\\"Rows\\\",?1).PR(\\\"Insert\\\");

          ◎?刪除一行
          ?ExcelApp.PG(\\\"Rows\\\",?2).PR(\\\"Delete\\\");?//將第2行刪除

          ?//?本文作者:ccrun?,如轉(zhuǎn)載請(qǐng)保證本文檔的完整性,并注明出處。
          ?//?歡迎光臨?C++?Builder?研究?www.ccrun.com
          ?//?摘自:http://www.ccrun.com/doc/go.asp?id=529

          ★操作單元格★

          ◎?設(shè)置單元格字體
          Sheet1.PG(\\\"Cells\\\",?1,?1).PG(\\\"Font\\\").PS(\\\"Name\\\",?\\\"隸書\\\");?//字體
          Sheet1.PG(\\\"Cells\\\",?2,?3).PG(\\\"Font\\\").PS(\\\"size\\\",?28); ?//大小

          ◎?設(shè)置所選區(qū)域字體
          ?Range.PG(\\\"Cells\\\").PG(\\\"Font\\\").PS(\\\"Size\\\",?28);
          ?Range.PG(\\\"Cells\\\").PG(\\\"Font\\\").PS(\\\"Color\\\",?RGB(0,?0,?255));
          ?其中參數(shù)的設(shè)置:
          ?Font ?Name?:?\\\"隸書\\\" ?//字體名稱
          Size?:?12 ?//字體大小
          ?Color?:?RGB(*,*,*) ?//顏色
          ?Underline?:?true/false ?//下劃線
          ?Italic:?true/false ?//斜體

          ◎?設(shè)置單元格格式為小數(shù)百分比
          ?Sheet1.PG(\\\"Cells\\\",?1,?1).PS(\\\"NumberFormatLocal\\\",?\\\"0.00%\\\");

          ◎?設(shè)定單元格的垂直對(duì)齊方式
          ?Range?=?ExcelApp.PG(\\\"Cells\\\",?3,?4);
          ?//?1=靠上?2=居中?3=靠下對(duì)齊?4=兩端對(duì)齊?5=分散對(duì)齊
          ?Range.PS(\\\"VerticalAlignment\\\",?2); ?

          ◎?設(shè)定單元格的文本為自動(dòng)換行
          ?Range?=?ExcelApp.PG(\\\"Cells\\\",?3,?4);
          ?Range.PS(\\\"WrapText\\\",?true);
          ?
          ★單元格的合并★

          ◎?Range?=?Sheet1.PG(\\\"Range\\\",?\\\"A1:A2\\\"); //A1和A2單元格合并
          ?String?strRange?=?\\\"A\\\"?+?IntToStr(j)?+?\\\":\\\"?+?\\\"C\\\"?+?IntToStr(j);?//比如:A1:C5
          ?Range1=Sheet1.PG(\\\"Range\\\",?strRange.c_str());?//可以用變量控制單元格合并
          ?Range1.FN(\\\"Merge\\\",?false);

          ★讀寫單元格★

          ◎?指定單元格賦值
          ?String?strValue?=?\\\"abcdefg\\\";
          ?Sheet1.PG(\\\"Cells\\\",?3,?6).PS(\\\"Value\\\",?strValue.c_str());?
          ?Sheet1.PG(\\\"Cells\\\",?j,?1).PS(\\\"Value\\\",?\\\"總記錄:\\\"?+?String(j-6));
          ?或者使用
          ?Excel.Exec(PropertyGet(\\\"Cells\\\")<<1<<3).Exec(PropertySet(\\\"Value\\\")<<15);

          ◎?所選區(qū)域單元格賦值
          ?Range.PG(\\\"Cells\\\").PS(\\\"Value\\\",?10); ?

          ◎?所選區(qū)域行賦值
          ?Range.PG(\\\"Rows\\\",1).PS(\\\"Value\\\",?1234);

          ◎?工作表列賦值
          ?Sheet1.PG(\\\"Columns\\\",1).PS(\\\"Value\\\",?1234);?

          ◎?讀取取值語句:
          ?String?strValue?=?Sheet1.PG(\\\"Cells\\\",?3,?5).PG(\\\"Value\\\");

          ★窗口屬性★

          ◎?顯示屬性
          ?ExcelApp.PS(\\\"Windowstate\\\",?3); ?//最大化顯示
          1---------xlNormal //正常顯示
          2---------xlMinimized ?//最小化顯示
          3---------xlMaximized ?//最大化顯示

          ◎?狀態(tài)欄屬性
          ?ExcelApp.PS(\\\"StatusBar\\\",?\\\"您好,請(qǐng)您稍等。正在查詢!\\\");
          ?ExcelApp.PS(\\\"StatusBar\\\",?false); ?//還原成默認(rèn)值

          ◎?標(biāo)題屬性:
          ?ExcelApp.PS(\\\"Caption\\\",?\\\"查詢系統(tǒng)\\\");
          ?
          3、操作圖表

          ★添加圖表
          ?
          ?Variant?Chart;
          ?Chart?=?ExcelApp.Exec(PropertyGet(\\\"Charts\\\")).Exec(Function(\\\"Add\\\"));
          ?ExcelApp.Exec(PropertySet(\\\"Visible\\\")?<<?true);
          ?Chart.Exec(PropertySet(\\\"Type\\\")?<<?-4100);

          ★滾動(dòng)圖表

          ?for(int?nRotate=5;?nRotate?<=?180;?nRotate?+=?5)
          ?{
          Chart.Exec(PropertySet(\\\"Rotation\\\")?<<?nRotate);
          ?}
          ?for?(int?nRotate?=?175;?nRotate?>=?0;?nRotate?-=?5)
          ?{
          Chart.Exec(PropertySet(\\\"Rotation\\\")?<<?nRotate);
          ?}
          ?
          另外,為保證程序能正常運(yùn)行,需要在程序中判斷目標(biāo)機(jī)器是否安裝了Office;
          try
          {
          ExcelApp?=?Variant::CreateObject?(\\\"Excel.Application\\\");
          }
          catch(...)
          {
          ShowMessage(\\\"運(yùn)行Excel出錯(cuò),請(qǐng)確認(rèn)安裝了Office\\\");
          return;
          }?


          #include?\\\"comobj.hpp\\\"
          //---------------------------------------------------------------------------
          //?對(duì)指定Excel文件中的指定列進(jìn)行排序
          //?strExcelFileName?:?excel文件名
          //?nCol?:?指定的列號(hào)
          //?nSortStyle?:?1:升序,2:降序
          void?SortExcelColumn(String?strExcelFileName,?int?nCol,?int?nSortStyle)
          {
          Variant?vExcelApp,?vWorkbook,?vRange;
          vExcelApp?=?Variant::CreateObject(\\\"Excel.Application\\\");
          vExcelApp.OlePropertySet(\\\"Visible\\\",?false);
          vExcelApp.OlePropertyGet(\\\"WorkBooks\\\").OleProcedure(\\\"Open\\\",?strExcelFileName.c_str());
          vWorkbook?=?vExcelApp.OlePropertyGet(\\\"ActiveWorkbook\\\");
          vExcelApp.OlePropertyGet(\\\"Columns\\\",?nCol).OleProcedure(\\\"Select\\\");
          vExcelApp.OlePropertyGet(\\\"ActiveSheet\\\").OlePropertyGet(\\\"Cells\\\",?1,?nCol).OleProcedure(\\\"Select\\\");
          vRange?= vExcelApp.OlePropertyGet(\\\"Selection\\\");
          vRange.Exec(Function(\\\"Sort\\\")<<vExcelApp.OlePropertyGet(\\\"Selection\\\")<<nSortStyle);
          vWorkbook.OleProcedure(\\\"Save\\\");
          vWorkbook.OleProcedure(\\\"Close\\\");
          vExcelApp.OleFunction(\\\"Quit\\\");
          vWorkbook?=?Unassigned;
          vExcelApp?=?Unassigned;
          ShowMessage(\\\"ok\\\");
          }

          void?__fastcall?TForm1::Button1Click(TObject?*Sender)
          {
          //?對(duì)C:\\\\123\\\\123.xls文件中第一個(gè)Sheet的第四列進(jìn)行升序排序
          SortExcelColumn(\\\"C:\\\\\\\\123\\\\\\\\123.xls\\\",?4,?1);
          }
          //---------------------------------------------------------------------------

          ?

          評(píng)論

          # re: 用OLE操作Excel(目前最全的資料)  回復(fù)  更多評(píng)論   

          2007-11-16 10:48 by liy
          太好了,謝謝!

          # re: 用OLE操作Excel(目前最全的資料)[未登錄]  回復(fù)  更多評(píng)論   

          2009-05-05 17:13 by dy
          有多點(diǎn)關(guān)于圖表的 操作麼有啊
          都只有添加個(gè)空的 有什么用啊
          主站蜘蛛池模板: 金山区| 永兴县| 广南县| 望都县| 洛浦县| 镇赉县| 修武县| 民勤县| 桐乡市| 桦南县| 贵定县| 营山县| 盈江县| 甘德县| 富蕴县| 阿瓦提县| 徐州市| 松江区| 家居| 英吉沙县| 阜城县| 威信县| 汉川市| 海丰县| 新蔡县| 土默特右旗| 阳谷县| 桓台县| 通辽市| 应城市| 孟村| 赣州市| 工布江达县| 福州市| 成安县| 上杭县| 常宁市| 崇阳县| 古丈县| 正安县| 黔西县|