程式中使用EXCEL的關鍵是利用COM(Common Objext Model), 這是一種規範,
而實作的方法是使用OLE(Object Linking and Embedding)。
微軟將以上技術統稱為ActiveX。
另外,以下是EXCEL各個版本中,
每個工作表可容納的儲存格數量限制:
EXCEL 97/2000/2002/2003:256欄(A~IV),65536列
EXCEL 2007/2010/2013/365: 16384欄(A~XFD),1048576列。
以下是我針對Borland C++ Builder 6.0寫的一個簡單範例程式:
(2013/07/08 Update)
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include "Unit1.h"
#include <ComObj.hpp>//COM專用標頭檔
/*For ActiveX (EXCEL OLE)*/
#define PG OlePropertyGet //取出屬性值
#define PS OlePropertySet //設定屬性值
#define FN OleFunction //呼叫有回傳值的函數
#define PR OleProcedure //呼叫無回傳值的函數
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int LastRow;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
//以下這個按鈕可載入任一EXCEL檔案,
//然後將其第一張工作表的第一欄資料匯入ComboBox(下拉式選單)中的選項
void __fastcall TForm1::Button_LoadClick(TObject *Sender)
{
Variant ExcelAp,Workbook,Sheet1,Cell; //宣告Variant變數
int i,j;
if(OpenDialog1->Execute())
{
ExcelAp=CreateOleObject("Excel.Application"); //開啟EXCEL應用程式
ExcelAp.PS("Visible",false); //設定EXCEL可視屬性為TRUE
Workbook=ExcelAp.PG("Workbooks").FN("Open",OpenDialog1->FileName.c_str()); //開啟Excel檔,並取得活頁簿
Sheet1=Workbook.PG("Sheets").PG("Item",1); //取得第一個工作表
LastRow=Sheet1.PG("UsedRange").PG("EntireRow").PG("Count");//取得最後一列
for(i=2;i<=LastRow;i++)
{
//Load REG Name
Cell = Sheet1.PG("Cells",i,1);//取得工作表上的某一儲存格
ComboBox_Name->Items->Add(Cell.PG("Text"));//取得儲存格內的文字資料,並加入下拉式選單
//Name[i-2]=Cell.PG("Text");//站名暫存陣列
Name[i-2]=Sheet1.PG("Cells",i,1);//站名暫存陣列
Code[i-2]=Sheet1.PG("Cells",i,2);//代碼暫存陣列
ProgressBar1->Position=i*100/LastRow;
}
Workbook.PR("Close",true);//關閉活頁簿
ExcelAp.PR("Quit");//結束EXCEL應用程式
//Initialize GUI
ComboBox_Name->ItemIndex=0;
Edit_Code->Text=Code[0];
Label1->Enabled=true;
Label2->Enabled=true;
ComboBox_Name->Enabled=true;
Edit_Code->Enabled=true;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button_CloseClick(TObject *Sender)
{
Form1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox_NameSelect(TObject *Sender)
{
Edit_Code->Text=Code[ComboBox_Name->ItemIndex];
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Label1->Enabled=false;
Label2->Enabled=false;
ComboBox_Name->Enabled=false;
Edit_Code->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button_SaveClick(TObject *Sender)
{
Variant ExcelAp,Workbook,Sheet1; //宣告Variant變數
String filename,filename_time;
SYSTEMTIME st;//宣告一個系統時間參數
GetLocalTime(&st);//取得系統時間
if(SaveDialog1->Execute())
{
filename=SaveDialog1->FileName;
ExcelAp=CreateOleObject("Excel.Application"); //開啟EXCEL應用程式
ExcelAp.PS("Visible",true); //設定EXCEL可視屬性為TRUE
Workbook=ExcelAp.PG("Workbooks").PG("Add"); //開啟新活頁簿
Sheet1=Workbook.PG("WorkSheets").FN("Add"); //開啟新工作表
//設定欄位名稱
Sheet1.PG("Cells",1,1).PS("Value","站名");//在位置(1,1)的儲存格填上"站名"字串
Sheet1.PG("Cells",1,2).PS("Value","代碼");
for (int i=2;i<=LastRow;i++)
{
Sheet1.PG("Cells",i,1).PS("Value",Name[i-2].c_str()); //在位置(i,1)的儲存格依序填入站名
Sheet1.PG("Cells",i,2).PS("Value",Code[i-2]); //在位置(i,2)的儲存格依序填入代碼
}
//使用 Local Time作為檔名的一部分
filename_time=String(st.wYear)
+(st.wMonth<=9?"0"+String(st.wMonth):String(st.wMonth))
+(st.wDay<=9?"0"+String(st.wDay):String(st.wDay))
+"_"+st.wHour+st.wMinute;
filename+="_"+filename_time;
Workbook.PR("SaveAs",filename.c_str()); //自動存檔到指定路徑
Workbook.PR("Close",true);//關閉活頁簿
ExcelAp.PR("Quit");//結束EXCEL應用程式
}
}
//---------------------------------------------------------------------------
======================================
注意:
1.本範例在OpenDialog1和SaveDialog1的Properties中,
設定了Filter的內容來過濾副檔名,這樣開檔案時,就只會看到EXCEL檔案。
2.Unit1.h宣告了兩個資料暫存陣列,
String Name[NData];
Word Code[NData];
範例程式專案檔案下載:
http://www.adrive.com/public/d2zcbf/01_EXCEL_TEST....
參考文件: http://www.scribd.com/doc/362189/BCBOleExcel
留言列表