电竞比分网-中国电竞赛事及体育赛事平台

分享

C++builder 用OLE操作Excel(目前最全的資料)

 louis.sun 2010-09-26

C++builder 用OLE操作Excel(目前最全的資料)

 

用OLE操作Excel(目前最全的資料)


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

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

要在應用程序中控制Excel的運行,首先必須在編制自動化客戶程序時包含Comobj.hpp
#include \\\"Comobj.hpp\\\"

C++ Builder把Excel自動化對象的功能包裝在下面的四個Ole Object Class函數(shù)中,應用人員可以很方便地進行調(diào)用。
設置對象屬性: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)建應用對象★
 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ù)

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

◎ 設置行高
 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.
 // 摘自:http://www./doc/go.asp?id=529

★操作單元格★

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

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

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

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

◎ 設定單元格的文本為自動換行
 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);
}

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多