C++Builder Tips


Excelファイルの読み込み(OLE)


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)