OLE経由でExcelファイルにアクセスするサンプルです。
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//コンボボックスにシート名表示
AnsiString strPath = ExtractFilePath(Application->ExeName) + "Book1.xls";
ComboBox1->Items->Clear();
ListBox1->Items->Clear();
CtlExcelSheetAdd(ComboBox1,strPath);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
//コンボボックスにタイトル名表示
AnsiString strPath = ExtractFilePath(Application->ExeName) + "Book1.xls";
ComboBox2->Items->Clear();
CtlExcelTitleAdd(ComboBox2,strPath,ComboBox1->Text);
ComboBox2->ItemIndex = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox2Change(TObject *Sender)
{
//リストボックスにデータ表示
AnsiString strPath = ExtractFilePath(Application->ExeName) + "Book1.xls";
ListBox1->Items->Clear();
CtlExcelDataAdd(ListBox1,strPath,ComboBox1->Text,ComboBox2->Text);
}
//---------------------------------------------------------------------------
bool TForm1::CtlExcelSheetAdd(TObject *Sender ,AnsiString strPath)
{
bool bRet = false;
Variant vXLS;
Variant vWorkBooks;
Variant vWorkBook;
Variant vWorkSheets;
Variant vWorkSheet;
int iSheetsCount;
AnsiString str;
TListBox* lstb = (TListBox*)Sender;
vXLS = Variant::CreateObject("Excel.Application");
vWorkBooks = vXLS.Exec(PropertyGet("Workbooks"));
vWorkBook = vWorkBooks.Exec(Function("Open") << strPath);
vWorkSheets = vWorkBook.Exec(PropertyGet("Sheets"));
iSheetsCount = vWorkSheets.Exec(PropertyGet("Count"));
for (int i=1;i<iSheetsCount+1;i++){
vWorkSheet = vWorkSheets.Exec(PropertyGet("item")<<i);
str = vWorkSheet.Exec(PropertyGet("Name"));
lstb->Items->Add(str);
}
vWorkBooks.Exec(Function("Close"));
vXLS.Exec(Function("Quit"));
bRet = true;
return bRet;
}
bool TForm1::CtlExcelTitleAdd(TObject *Sender, AnsiString strPath, AnsiString strSheet)
{
bool bRet = false;
Variant vXLS;
Variant vWorkBooks;
Variant vWorkBook;
Variant vWorkSheets;
Variant vWorkSheet;
int iSheetsCount;
AnsiString str;
TListBox* lstb = (TListBox*)Sender;
vXLS = Variant::CreateObject("Excel.Application");
vWorkBooks = vXLS.Exec(PropertyGet("Workbooks"));
vWorkBook = vWorkBooks.Exec(Function("Open") << strPath);
vWorkSheets = vWorkBook.Exec(PropertyGet("Sheets"));
vWorkSheet = vWorkSheets.Exec(PropertyGet("item")<< strSheet );
int i = 0;
while (1){
i++;
str = vWorkSheet.Exec(PropertyGet("Cells") << 1 << i); //1列目を検索
if (str==""){
break;
}
lstb->Items->Add(str);
}
vWorkBooks.Exec(Function("Close"));
vXLS.Exec(Function("Quit"));
bRet = true;
return bRet;
}
bool TForm1::CtlExcelDataAdd(TObject *Sender, AnsiString strPath, AnsiString strSheet, AnsiString strTitle)
{
bool bRet = false;
Variant vXLS;
Variant vWorkBooks;
Variant vWorkBook;
Variant vWorkSheets;
Variant vWorkSheet;
Variant vRow;
Variant vRange;
Variant vColumn;
AnsiString str;
int iCol;
TListBox* lstb = (TListBox*)Sender;
vXLS = Variant::CreateObject("Excel.Application");
vWorkBooks = vXLS.Exec(PropertyGet("Workbooks"));
vWorkBook = vWorkBooks.Exec(Function("Open") << strPath);
vWorkSheets = vWorkBook.Exec(PropertyGet("Sheets"));
vWorkSheet = vWorkSheets.Exec(PropertyGet("item")<< strSheet );
//ワークシートの先頭行から、選択された列名が入力されている列を検索します
vRow = vWorkSheet.Exec(PropertyGet("Rows") << 1);
vRange = vRow.Exec(Function("Find") << strTitle);
iCol = vRange.Exec(PropertyGet("Column"));
//その列への参照を設定します。
vColumn = vWorkSheet.Exec(PropertyGet("Columns") << iCol);
int i = 1; //2行目から(1行目はタイトル)
while (1){
i++;
str = vColumn.Exec(PropertyGet("Cells") << i << 1); //1列目を検索
if (str==""){
break;
}
lstb->Items->Add(str);
}
vWorkBooks.Exec(Function("Close"));
vXLS.Exec(Function("Quit"));
bRet = true;
return bRet;
}
//---------------------------------------------------------------------------
DownLoad bcbtips078.lzh 4KB(BCB5)