程式中使用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

http://www.programmer-club.com/ShowSameTitleN/cb/1...

文章標籤
創作者介紹
創作者 sky 的頭像
sky

skybow

sky 發表在 痞客邦 留言(2) 人氣()


留言列表 (2)

發表留言
  • superbug
  • 缺少一些package,所以編譯不成功。
    jack23912gmail .com
  • 請確認一下最前面有沒有加上這行
    #include <ComObj.hpp>//COM專用標頭檔
    另外,你用啥編譯器? 這是Borland C++ Builder 6.0的專案喔! 用Visual C++或Dev C編譯都會有問題的! 如果你沒有BCB6.0,請了解用法後再自行重寫吧~

    sky 於 2014/04/08 15:28 回覆

  • kuanhungwu
  • 請問這些指令、語法的使用、整個程式架構要看哪本書才會呢
    目前是從零開始@@
  • 您的從零開始是指? 您完全不會寫程式? 沒有學過C?

    sky 於 2014/10/28 23:41 回覆