Posted on 2006-05-12 15:03
semovy 閱讀(3245)
評論(2) 編輯 收藏 所屬分類:
C++ Builder相關(guān)
文檔標題:用OLE操作Excel(目前最全的資料)(04.2.19更新) 作者:?ccrun
關(guān)?鍵?字:Office,Excel,Sheet,Cell,OLE,CreateObject,Merge,工作簿,工作表,單元格,合并,自動化
本文轉(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的運行,首先必須在編制自動化客戶程序時包含Comobj.hpp
#include?\\\"Comobj.hpp\\\"
C++?Builder把Excel自動化對象的功能包裝在下面的四個Ole?Object?Class函數(shù)中,應(yīng)用人員可以很方便地進行調(diào)用。
設(shè)置對象屬性:void OlePropertySet(屬性名,參數(shù)……);
獲得對象屬性:Variant ?OlePropertyGet(屬性名,參數(shù)……);
調(diào)用對象方法:1)?Variant OleFunction(函數(shù)名,參數(shù)……);
?2)?void ?OleProcedure(過程名,參數(shù)……);
在程序中可以用宏定義來節(jié)省時間:
#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的自動化對象及Microsoft?Word?Visual?Basic幫助文件中的關(guān)于Excel的對象、方法和屬性。對象是一個Excel元素,屬性是對象的一個特性或操作的一個方面,方法是對象可以進行的動作。
首先定義以下幾個變量:
Variant?ExcelApp,Workbook1,Sheet1,Range1;
1、Excel中常用的對象是:Application,Workbooks,Worksheets等。
★創(chuàng)建應(yīng)用對象★
?Variant?ExcelApp;
?ExcelApp?=?Variant::CreateObject?(\\\"Excel.Application\\\");
?或者
?ExcelApp?=?CreateOleObject?(\\\"Excel.Application\\\");
★創(chuàng)建工作簿對象★
?Variant?WorkBook1;
?WorkBook1?=?ExcelApp.PG(\\\"ActiveWorkBook\\\");
★創(chuàng)建工作表對象★
?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\\\") //默認工作簿
?ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\",?1) ?//單工作表
?ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\",?2) ?//圖表
?ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\",?3) ?//宏表?
?ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\",?4) ?//國際通用宏表
?ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\",?5) ?//與默認的相同
?ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\",?6) ?//工作簿且只有一個表
?或者使用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\\\"));
★操作工作表★
◎?選擇選擇工作表中第一個工作表
?Workbook1.PG(\\\"Sheets\\\",?1).PR(\\\"Select\\\");
?Sheet1?=?Workbook1.PG(\\\"ActiveSheet\\\");
◎?重命名工作表
?Sheet1.PS(\\\"Name\\\",?\\\"Sheet的新名字\\\");
◎?當前工作簿中的工作表總數(shù)
?int?nSheetCount=Workbook1.PG(\\\"Sheets\\\").PG(\\\"Count\\\"); ?
★操作行和列★
?
◎?獲取當前工作表中有多少行和多少列:
?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)載請保證本文檔的完整性,并注明出處。
?//?歡迎光臨?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è)定單元格的垂直對齊方式
?Range?=?ExcelApp.PG(\\\"Cells\\\",?3,?4);
?//?1=靠上?2=居中?3=靠下對齊?4=兩端對齊?5=分散對齊
?Range.PS(\\\"VerticalAlignment\\\",?2); ?
◎?設(shè)定單元格的文本為自動換行
?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\\\",?\\\"您好,請您稍等。正在查詢!\\\");
?ExcelApp.PS(\\\"StatusBar\\\",?false); ?//還原成默認值
◎?標題屬性:
?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);
★滾動圖表
?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);
?}
?
另外,為保證程序能正常運行,需要在程序中判斷目標機器是否安裝了Office;
try
{
ExcelApp?=?Variant::CreateObject?(\\\"Excel.Application\\\");
}
catch(...)
{
ShowMessage(\\\"運行Excel出錯,請確認安裝了Office\\\");
return;
}?
#include?\\\"comobj.hpp\\\"
//---------------------------------------------------------------------------
//?對指定Excel文件中的指定列進行排序
//?strExcelFileName?:?excel文件名
//?nCol?:?指定的列號
//?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)
{
//?對C:\\\\123\\\\123.xls文件中第一個Sheet的第四列進行升序排序
SortExcelColumn(\\\"C:\\\\\\\\123\\\\\\\\123.xls\\\",?4,?1);
}
//---------------------------------------------------------------------------
?