Delphi Programming / Object Pascal
[掲載 2005年05月14日] [更新 2020年09月06日] Delphi サンプルプログラム集 |
590_ADO でエクセルに接続 |
動作確認等 |
Windows 7 U64(SP1) + Delphi XE Pro + Excel 2007 |
|
590_ADO_Excel.zip [3,385 KB] 2013年03月01日版 (EXE 同梱) |
- 2010年05月23日
- テーブル一覧表示ではなく単なる接続のサンプルに変更
- 2013年03月01日
- Windows 7 U64(SP1) + Delphi XE Pro で動作確認
- Extended Properties の余分な(説明用)コードを削除
- 今回の動作確認環境では,データの編集が可能なので,TDBGrid も編集可能にした
- サンプル [04] を追加
- 2020年09月06日
- TADODataSet を使用するサンプルを追加
|
ADO でエクセルに接続する例です.エクセルはブックがデータベース,シートがテーブル (表) ということになります.
エクセルやテキストファイルは本来 Priamry Key (一次キー) の概念がないので,更新 (レコードの追加・削除) 機能は使用できないはずなのですが,2013年03月01日版の動作確認環境では可能となっているようです.そこで,前のバージョンにあった,編集を不可にするコードを削除し,ページのタイトルから「読み出し専用」文字も削除しました.
ただし,レコードの削除はできないようです. |
以下は,サンプルプログラム集の ADO 関係の記事へのリンクです. |
[備考]
エクセルは,セルのデータを排他的に読み込んで表示します.既にエクセルで表示しているブックを更にエクセルで表示すると,読み出し専用で読み込むことになります.
したがって,エクセルで表示しているブックのデータを ADO で接続した場合は,読み出し専用となります.データの変更はできまぜん.
|
TADOTable コンポーネントだけを使用してエクセルに接続する例です.
このサンプルプログラムでは,添付の [Data] フォルダ内にある ADOTestBook.xls という名前のブックを使用してます.
このサンプルでは,Excel 2007 以上で作成した .xlsx 形式のブックは扱えません. |
|
図1
設計時画面 |
|
図2
Button1 クリック
|
|
図3
Button2 クリック
- シートの第 1 行目もデータとして表示する
- 項目名は F1, F2, ... となる
|
|
図4
Button3 クリック
|
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
DBGrid1: TDBGrid;
ADOTable1: TADOTable;
DataSource1: TDataSource;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//=============================================================================
// フォームを閉じる時はテーブルもClose
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ADOTable1.Close;
end;
//=============================================================================
// 指定のブックのシートをデータベースの表としてDBGridに表示
// 対象シートの第1行目を項目名とする場合
//
// オブジェクト・インスペクタで以下を設定
// DataSource1.DataSet := ADOTable1;
// DBGrid1.DataSource := DataSource1;
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
StrProvider : String;
StrDBFile : String;
StrExtended : String;
StrSource : String;
begin
ADOTable1.Close;
//プロバイダ
StrProvider := 'Provider=Microsoft.Jet.OLEDB.4.0;';
//データベース(エクセルの場合はブック)の場所
StrDBFile := 'Data Source=../Data/ADOTestBook.xls;';
StrExtended := 'Extended Properties=Excel 8.0;';
//接続文字列
ADOTable1.ConnectionString := StrProvider + StrDBFile + StrExtended;
ADOTable1.TableName := '[Sheet2$]';
ADOTable1.Open;
//各項目の表示幅を設定
//DBGridの各カラムの幅設定でもいい
//エクセルの場合はスキーマ定義ファイルは利用できない
//この設定がないと数値は15,文字列は255幅となる(エクセルのデフォルト値)
ADOTable1.Fields[0].DisplayWidth := 10;
ADOTable1.Fields[1].DisplayWidth := 5;
ADOTable1.Fields[2].DisplayWidth := 10;
ADOTable1.Fields[3].DisplayWidth := 10;
end;
//=============================================================================
// 指定のブックのシートをデータベースの表としてDBGridに表示
//
// 対象シートの第1行目もデータとして表示する場合
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
StrProvider : String;
StrDBFile : String;
StrExtended : String;
StrSource : String;
begin
ADOTable1.Close;
//プロバイダ
StrProvider := 'Provider=Microsoft.Jet.OLEDB.4.0;';
//データベース(エクセルの場合はブック)の場所
StrDBFile := 'Data Source=../Data/ADOTestBook.xls;';
//Extended PropertiesにHDR=NOを追加してシートの第1行目もデータとする
//ファイル名に空白がある時と同じように"で括ることに注意
StrExtended := 'Extended Properties="Excel 8.0;HDR=NO"';
//接続文字列
ADOTable1.ConnectionString := StrProvider +
StrDBFile +
StrExtended;
ADOTable1.TableName := '[Sheet2$]';
ADOTable1.Open;
//各項目の表示幅を設定
//DBGridの各カラムの幅設定でもいい
//エクセルの場合はスキーマ定義ファイルは利用できない
//この設定がないと数値は15,文字列は255幅となる(エクセルのデフォルト値)
ADOTable1.Fields[0].DisplayWidth := 10;
ADOTable1.Fields[1].DisplayWidth := 5;
ADOTable1.Fields[2].DisplayWidth := 10;
ADOTable1.Fields[3].DisplayWidth := 10;
end;
//=============================================================================
// 指定のブックのシーの指定範囲だけをデータベースの表としてDBGridに表示
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
var
StrProvider : String;
StrDBFile : String;
StrExtended : String;
StrSource : String;
begin
ADOTable1.Close;
//プロバイダ
StrProvider := 'Provider=Microsoft.Jet.OLEDB.4.0;';
//データベース(エクセルの場合はブック)の場所
StrDBFile := 'Data Source=../Data/ADOTestBook.xls;';
//全てデータなのでExtended PropertiesにHDR=NOを追加
//ファイル名に空白がある時と同じように"で括ることに注意
StrExtended := 'Extended Properties="Excel 8.0;HDR=NO"';
//接続文字列
ADOTable1.ConnectionString := StrProvider +
StrDBFile +
StrExtended;
//指定のセル範囲を表として表示(セル範囲の名前も使用可能)
ADOTable1.TableName := '[Sheet2$A15:D24]';
ADOTable1.Open;
//各項目の表示幅を設定
//DBGridの各カラムの幅設定でもいい
//エクセルの場合はスキーマ定義ファイルは利用できない
//この設定がないと数値は15,文字列は255幅となる(エクセルのデフォルト値)
ADOTable1.Fields[0].DisplayWidth := 10;
ADOTable1.Fields[1].DisplayWidth := 5;
ADOTable1.Fields[2].DisplayWidth := 10;
ADOTable1.Fields[3].DisplayWidth := 10;
end;
//=============================================================================
// データの編集
//=============================================================================
procedure TForm1.Button4Click(Sender: TObject);
begin
if ADOTable1.Active = False then exit;
ADOTable1.First;
ADOTable1.Edit;
ADOTable1.Fields[0].Value := 'いも類';
ADOTable1.Post;
end;
end.
TADOQuery コンポーネントだけを使用してエクセルに接続する例です.
このサンプルプログラムでは,添付の [Data] フォルダ内にある ADOTestBook.xls という名前のブックを使用してます.
このサンプルでは,Excel 2007 以上で作成した .xlsx 形式のブックは扱えません. |
|
図5
設計時画面 |
|
図6
Button1 クリック
|
|
図7
Button2 クリック
|
|
図8
Button3 クリック
|
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
Button1: TButton;
Button2: TButton;
Button3: TButton;
ADOQuery1: TADOQuery;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//=============================================================================
// フォームを閉じる時はClose
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ADOQuery1.Close;
end;
//=============================================================================
// 指定のブックのシートをデータベースの表としてDBGridに表示
// 対象シートの第1行目は項目名となる
//
// オブジェクト・インスペクタで以下を設定
// DataSource1.DataSet := ADOQuery1;
// DBGrid1.DataSource := DataSource1;
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
StrProvider : String;
StrDBFile : String;
StrExtended : String;
begin
ADOQuery1.Close;
//プロバイダ
StrProvider := 'Provider=Microsoft.Jet.OLEDB.4.0;';
//データベース(エクセルの場合はブック)の場所
StrDBFile := 'Data Source=../Data/ADOTestBook.xls;';
StrExtended := 'Extended Properties=Excel 8.0;';
//接続文字列
ADOQuery1.ConnectionString := StrProvider + StrDBFile + StrExtended;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM [Sheet2$] ');
ADOQuery1.Open;
//各項目の表示幅を設定
DBGrid1.Columns[0].Width := 70;
DBGrid1.Columns[1].Width := 30;
DBGrid1.Columns[2].Width := 70;
DBGrid1.Columns[3].Width := 60;
end;
//=============================================================================
// 選択クエリーの例 1
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
if ADOQuery1.Active = False then Exit;
ADOQuery1.DisableControls;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM [Sheet2$] ');
ADOQuery1.SQL.Add ('WHERE 食品群=:Param1 ');
ADOQuery1.Parameters.ParamByName('Param1').Value := '野菜類';
ADOQuery1.Open;
ADOQuery1.EnableControls;
//各項目の表示幅を設定
DBGrid1.Columns[0].Width := 70;
DBGrid1.Columns[1].Width := 30;
DBGrid1.Columns[2].Width := 70;
DBGrid1.Columns[3].Width := 60;
end;
//=============================================================================
// 選択クエリーの例 2
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
begin
if ADOQuery1.Active = False then Exit;
ADOQuery1.DisableControls;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM [Sheet2$] ');
ADOQuery1.SQL.Add ('WHERE キロカロリ>=:Param1 AND キロカロリ<=:Param2 ');
ADOQuery1.SQL.Add ('ORDER BY キロカロリ ');
ADOQuery1.Parameters.ParamByName('Param1').Value := 300;
ADOQuery1.Parameters.ParamByName('Param2').Value := 500;
ADOQuery1.Open;
ADOQuery1.EnableControls;
//各項目の表示幅を設定
DBGrid1.Columns[0].Width := 70;
DBGrid1.Columns[1].Width := 30;
DBGrid1.Columns[2].Width := 70;
DBGrid1.Columns[3].Width := 60;
end;
end.
03_エクセルに接続 ( TADOConnection + TADOQuery ) |
TADOConnection と TADOQuery コンポーネントを使用してエクセルに接続します.
TADOConnection を使用すると,詳細な設定やトランザクション等の制御が可能となります.実行結果は前のサンプルと同じです.
このサンプルプログラムでは,添付の [Data] フォルダ内にある ADOTestBook.xls という名前のブックを使用してます.
このサンプルでは,Excel 2007 以上で作成した .xlsx 形式のックは扱えません. |
|
図9
設計時画面 |
リスト3
エクセルに TADOConnection と TADOQuery で接続 |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
DataSource1: TDataSource;
Button1: TButton;
Button2: TButton;
Button3: TButton;
ADOQuery1: TADOQuery;
ADOConnection1: TADOConnection;
DBGrid1: TDBGrid;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//=============================================================================
// フォームを生成したらTADOConnection接続の設定
//
// オブジェクト・インスペクタで以下を設定
// ADOConnection1.LoginPrompt := False;
// ADOQuery1.Connection := ADOConnection1;
// DataSource1.DataSet := ADOQuery1;
// DBGrid1.DataSource := DataSource1;
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
var
StrDBFile : String;
StrExtended : String;
begin
ADOConnection1.Connected := False;
//プロバイダ
ADOConnection1.Provider := 'Microsoft.Jet.OLEDB.4.0;';
//データベース(エクセルの場合はブック)の場所
StrDBFile := 'Data Source=../Data/ADOTestBook.xls;';
StrExtended := 'Extended Properties="Excel 8.0";';
//接続文字列
ADOConnection1.ConnectionString := StrDBFile + StrExtended;
end;
//=============================================================================
// フォームを閉じる時はデータベースも切断
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ADOConnection1.Connected := False;
end;
//=============================================================================
// 指定のブックのシートをデータベースの表としてDBGridに表示
// 対象シートの第1行目は項目名となる
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery1.DisableControls;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM [Sheet2$] ');
ADOQuery1.Open;
ADOQuery1.EnableControls;
//各項目の表示幅を設定
DBGrid1.Columns[0].Width := 70;
DBGrid1.Columns[1].Width := 30;
DBGrid1.Columns[2].Width := 70;
DBGrid1.Columns[3].Width := 60;
end;
//=============================================================================
// 選択クエリーの例 1
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
ADOQuery1.DisableControls;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM [Sheet2$] ');
ADOQuery1.SQL.Add ('WHERE 食品群=:Param1 ');
ADOQuery1.Parameters.ParamByName('Param1').Value := '野菜類';
ADOQuery1.Open;
ADOQuery1.EnableControls;
//各項目の表示幅を設定
DBGrid1.Columns[0].Width := 70;
DBGrid1.Columns[1].Width := 30;
DBGrid1.Columns[2].Width := 70;
DBGrid1.Columns[3].Width := 60;
end;
//=============================================================================
// 選択クエリーの例 2
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
begin
ADOQuery1.DisableControls;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM [Sheet2$] ');
ADOQuery1.SQL.Add ('WHERE キロカロリ>=:Param1 AND キロカロリ<=:Param2 ');
ADOQuery1.SQL.Add ('ORDER BY キロカロリ ');
ADOQuery1.Parameters.ParamByName('Param1').Value := 300;
ADOQuery1.Parameters.ParamByName('Param2').Value := 500;
ADOQuery1.Open;
ADOQuery1.EnableControls;
//各項目の表示幅を設定
DBGrid1.Columns[0].Width := 70;
DBGrid1.Columns[1].Width := 30;
DBGrid1.Columns[2].Width := 70;
DBGrid1.Columns[3].Width := 60;
end;
end.
04_Microsoft Access データベース エンジン 2010 を使用した接続 |
次のマイクロソフトのサイトからダウンロードして,Microsoft Access データベース エンジン 2010 をインストールすると,xls, xlsx どちらの形式のブックにも接続できます.
これは,Windows XP(SP3) 以上で使用可能です.
AccessDatabaseEngine.exe は 32 ビット版の,AccessDatabaseEngine_X64.exe は 64 ビット版の Microsoft Office 用です.Windows のビットバージョンではありません.
Microsoft Office のビットバージョンは,下図のように [ファイル] の [ヘルプ] 項目で確認することができます.
|
|
図10
Excel 2010 のビットバージョンの確認方法 |
Microsoft Access データベース エンジン 2010 を使用してエクセルに接続する場合は,これまでのサンプルコードを以下のように変更します.
この Excel 12.0 または Excel 14.0 というのは,システムにインストールされているエクセルのバージョンではなく,現在アクティブなバージョンで指定します.筆者が確認した限りでは,低いバージョン番号の指定であれば,動作するようですが,機能的に問題が発生するかは確認していません. |
Microsoft.Jet.OLEDB.4.0 を Microsoft.ACE.OLEDB.12.0 に
Excel 2007 の場合は Excel 8.0 の部分を Excel 12.0 に
Excel 2010 の場合は Excel 8.0 の部分を Excel 14.0 に
本サンプルプログラムでは,添付の [Data] フォルダ内にある ADOTestBook.xlsx という名前のブックを使用してます.設計時の画面も,実行結果も最初のサンプルと同じです.
|
[備考 1]
Microsoft Access データベース エンジン 2010 がシステムにインストールされていない環境でこのサンプルを実行すると,下図のように,
「インストール可能な ISAM ドライバが見つかりませんでした。」
というエラーが発生します.このエラーは,接続文字列の 'Excel 12.0' とか 'Excel 14.0' の部分が適切でない場合にも発生します.
|
[備考 2]
以下の記事で,Access 2007 用の JET についての説明とサンプルコードを掲載していますが,接続文字列が Access 2007 の JET と Access 2010 の JET とでは違います.注意が必要です.
Access 2010 用の JET であれば,上記の説明のように,Excel 2007 も扱えます.
|
|
図11
ISAM 関係のエラー |
リスト4
Microsoft Access データベース エンジン 2010 を使用したエクセルのブックへの接続 |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
DBGrid1: TDBGrid;
ADOTable1: TADOTable;
DataSource1: TDataSource;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//=============================================================================
// フォームを閉じる時はテーブルもClose
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ADOTable1.Close;
end;
//=============================================================================
// 指定のブックのシートをデータベースの表としてDBGridに表示
// 対象シートの第1行目を項目名とする場合
//
// オブジェクト・インスペクタで以下を設定
// DataSource1.DataSet := ADOTable1;
// DBGrid1.DataSource := DataSource1;
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
StrProvider : String;
StrDBFile : String;
StrExtended : String;
StrSource : String;
begin
ADOTable1.Close;
//プロバイダ
StrProvider := 'Provider=Microsoft.ACE.OLEDB.12.0;';
//データベース(エクセルの場合はブック)の場所
StrDBFile := 'Data Source=../Data/ADOTestBook.xlsx;';
StrExtended := 'Extended Properties=Excel 12.0;';
//接続文字列
ADOTable1.ConnectionString := StrProvider + StrDBFile + StrExtended;
ADOTable1.TableName := '[Sheet2$]';
ADOTable1.Open;
//各項目の表示幅を設定
//DBGridの各カラムの幅設定でもいい
//エクセルの場合はスキーマ定義ファイルは利用できない
//この設定がないと数値は15,文字列は255幅となる(エクセルのデフォルト値)
ADOTable1.Fields[0].DisplayWidth := 10;
ADOTable1.Fields[1].DisplayWidth := 5;
ADOTable1.Fields[2].DisplayWidth := 10;
ADOTable1.Fields[3].DisplayWidth := 10;
end;
//=============================================================================
// 指定のブックのシートをデータベースの表としてDBGridに表示
//
// 対象シートの第1行目もデータとして表示する場合
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
StrProvider : String;
StrDBFile : String;
StrExtended : String;
StrSource : String;
begin
ADOTable1.Close;
//プロバイダ
StrProvider := 'Provider=Microsoft.ACE.OLEDB.12.0;';
//データベース(エクセルの場合はブック)の場所
StrDBFile := 'Data Source=../Data/ADOTestBook.xlsx;';
//Extended PropertiesにHDR=NOを追加してシートの第1行目もデータとする
//ファイル名に空白がある時と同じように"で括ることに注意
StrExtended := 'Extended Properties="Excel 12.0;HDR=NO"';
//接続文字列
ADOTable1.ConnectionString := StrProvider +
StrDBFile +
StrExtended;
ADOTable1.TableName := '[Sheet2$]';
ADOTable1.Open;
//各項目の表示幅を設定
//DBGridの各カラムの幅設定でもいい
//エクセルの場合はスキーマ定義ファイルは利用できない
//この設定がないと数値は15,文字列は255幅となる(エクセルのデフォルト値)
ADOTable1.Fields[0].DisplayWidth := 10;
ADOTable1.Fields[1].DisplayWidth := 5;
ADOTable1.Fields[2].DisplayWidth := 10;
ADOTable1.Fields[3].DisplayWidth := 10;
end;
//=============================================================================
// 指定のブックのシーの指定範囲だけをデータベースの表としてDBGridに表示
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
var
StrProvider : String;
StrDBFile : String;
StrExtended : String;
StrSource : String;
begin
ADOTable1.Close;
//プロバイダ
StrProvider := 'Provider=Microsoft.ACE.OLEDB.12.0;';
//データベース(エクセルの場合はブック)の場所
StrDBFile := 'Data Source=../Data/ADOTestBook.xlsx;';
//全てデータなのでExtended PropertiesにHDR=NOを追加
//ファイル名に空白がある時と同じように"で括ることに注意
StrExtended := 'Extended Properties="Excel 12.0;HDR=NO"';
//接続文字列
ADOTable1.ConnectionString := StrProvider +
StrDBFile +
StrExtended;
//指定のセル範囲を表として表示(セル範囲の名前も使用可能)
ADOTable1.TableName := '[Sheet2$A15:D24]';
ADOTable1.Open;
//各項目の表示幅を設定
//DBGridの各カラムの幅設定でもいい
//エクセルの場合はスキーマ定義ファイルは利用できない
//この設定がないと数値は15,文字列は255幅となる(エクセルのデフォルト値)
ADOTable1.Fields[0].DisplayWidth := 10;
ADOTable1.Fields[1].DisplayWidth := 5;
ADOTable1.Fields[2].DisplayWidth := 10;
ADOTable1.Fields[3].DisplayWidth := 10;
end;
//=============================================================================
// データの編集
//=============================================================================
procedure TForm1.Button4Click(Sender: TObject);
begin
if ADOTable1.Active = False then exit;
ADOTable1.First;
ADOTable1.Edit;
ADOTable1.Fields[0].Value := 'いも類';
ADOTable1.Post;
end;
end.
05_TADODataSet を使用してエクセルに接続 |
TADODataSet を使用してエクセルに接続するサンプルです.
TADODataSet.CommandType のデフォルト値は cmdText です.この時は TADODataSet.CommandText には SQL 文を指定します.これは,前述の TADOQuery を使用したサンプルに相当します.
TADODataSet.CommandType の値を cmdTable にすると,TADODataSet.CommandText にテーブル名が指定できます.エクセルの場合は,テーブル名はシート名です.これは前述の TADOTable を使用したサンプルに相当します.
このサンプルでは,Excel 2007 以上で作成した .xlsx 形式のックは扱えません.
このサンプルは ZIP 書庫に添付していません.
|
|
図12
設計時画面 |
|
図13
実行画面
- Button1 クリックでも Button2 クリックでも結果は同じ
|
リスト5
TADODataSet を使用してエクセルに接続 |
//=============================================================================
// フォームを閉じる時はデータセットを閉じる
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ADODataSet1.Close;
end;
//=============================================================================
// TADODataSet を使用したエクセルへの接続
// TADODataSet.CommandText に SQL 文を指定する例
//
// オブジェクト・インスペクタで以下の設定にしている
// DBGrid1.DataSource を DataSource1 に
// DataSource1,DataSet を ADODataSet1 に
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LProvider : string;
LDBFile : string;
LExtended : string;
begin
ADODataSet1.Close;
ADODataSet1.CommandText := 'SELECT * FROM [Sheet2$] ';
// プロバイダ
LProvider := 'Provider=Microsoft.Jet.OLEDB.4.0;';
// データベース(エクセルの場合はブック)の場所
LDBFile := 'Data Source=../Data/ADOTestBook.xls;';
LExtended := 'Extended Properties=Excel 8.0;';
// 接続文字列
ADODataSet1.ConnectionString := LProvider + LDBFile + LExtended;
ADODataSet1.Open;
// 各項目の表示幅を設定
// エクセルの場合はスキーマ定義ファイルは利用できない
DBGrid1.Columns[0].Width := 50;
DBGrid1.Columns[1].Width := 35;
DBGrid1.Columns[2].Width := 100;
DBGrid1.Columns[3].Width := 40;
end;
//=============================================================================
// TADODataSet を使用したエクセルへの接続
// TADODataSet.CommandText にテーブル名としてのシート名を指定する例
//
// オブジェクト・インスペクタで以下の設定にしている
// DBGrid1.DataSource を DataSource1 に
// DataSource1,DataSet を ADODataSet1 に
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
LProvider : string;
LDBFile : string;
LExtended : string;
begin
ADODataSet1.Close;
// CommandType を cmdTable にすると CommandText にテーブル名が指定できる
// CommandType のデフォルトは cmdText
ADODataSet1.CommandType := cmdTable;
ADODataSet1.CommandText := '[Sheet2$]';
// プロバイダ
LProvider := 'Provider=Microsoft.Jet.OLEDB.4.0;';
// データベース(エクセルの場合はブック)の場所
LDBFile := 'Data Source=../Data/ADOTestBook.xls;';
LExtended := 'Extended Properties=Excel 8.0;';
// 接続文字列
ADODataSet1.ConnectionString := LProvider + LDBFile + LExtended;
ADODataSet1.Open;
// 各項目の表示幅を設定
// エクセルの場合はスキーマ定義ファイルは利用できない
DBGrid1.Columns[0].Width := 50;
DBGrid1.Columns[1].Width := 35;
DBGrid1.Columns[2].Width := 100;
DBGrid1.Columns[3].Width := 40;
end;
|