Excelデータ読み込みについて

解決


ガオ~  2020-08-28 19:51:40  No: 149054

毎々お世話になりありがとうございます。
以下の環境でプログラム作成しています初心者です。

フォームにADODataSet、DataSourceを貼り付けて
  ADODataSet1.CommandText := 'テスト$';
  ADODataSet1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source='C:\TMP\TMP.XLS';Extended Properties=Excel 8.0;Persist Security Info=True';
  ADODataSet1.Close;
  ADODataSet1.Open;
  with DataSourceS1.DataSet do
  begin
    First;
    while not Eof do
    begin
          s:1=DataSourceS1.DataSet.Fields[0].AsString;
          s:1=DataSourceS1.DataSet.Fields[1].AsString;
          s:1=DataSourceS1.DataSet.Fields[2].AsString;
      Next;
    end;
end;

とコーディングしました。
しかし、Excelのセルには数字がはいっているのですが
読み取りデータは NULLになってしまします。
何が原因なのでしょうか。

アドバイスを頂けましたらとっても助かります。
よろしくお願いいたします。

Delphi Tokyo Enter 64bit
Windows 10 PRO


igy  2020-08-28 20:33:05  No: 149055

詳しくないのですが、

> ADODataSet1.CommandText := 'テスト$'; 

これは、正しいですか?


ガオ~  2020-08-29 07:19:47  No: 149057

igyさんいつもご指導ありがとうございます。
とっても助かっており感謝しております。
ご指摘の
ADODataSet1.CommandText := 'テスト$';
ですが、Excelファイルの対象シート名を明記しています。
これは大丈夫かなと思っています・・・・・


takana  2020-08-29 11:58:14  No: 149059

  ADODataSet1.CommandText := 'select * from [テスト$]';
としてください

他にも提示のコードそのままでは構文エラーとなるところがあったので、実際に動いたコードを提示します。
以下のコードではDataSourceは必要ありません。
procedure TForm1.Button1Click(Sender: TObject);
var
  s1,s2,s3: string;
begin
  ADODataSet1.CommandText := 'select * from [テスト$]';
  ADODataSet1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source="z:\TMP.XLS";Extended Properties=Excel 8.0;Persist Security Info=True';
  ADODataSet1.Close;
  ADODataSet1.Open;
  with ADODataSet1 do
  begin
    First;
    while not Eof do
    begin
      s1:=Fields[0].AsString;
      s2:=Fields[1].AsString;
      s3:=Fields[2].AsString;
      ShowMessage(s1+s2+s3);
      Next;
    end;
end;
end;


ガオ~  2020-08-29 14:25:18  No: 149060

takanaさん
ご丁寧にコードを記載ありがとうございます。
ご指導通りにしたのですが
やはり、s1変数にはデータは入りませんでした。
どうしよう・・・・・


takana  2020-08-30 08:01:53  No: 149068

ファイル名を
z:\TMP.XLS
から、ご自身のファイルに変えましたか?

念のため実際に、実行されたコード全てを記載されてはどうでしょうか?
私が最初に試した提示されたコードでは、
s:1=DataSourceS1.DataSet.Fields[0].AsString;
の部分など、構文エラーがあったため


Mr.XRAY  2020-09-05 00:05:11  No: 149129

> ご指導通りにしたのですが
> やはり、s1変数にはデータは入りませんでした。
> どうしよう・・・・・

えっ !? どういうことなのか ? と思ってしまいますよね.
質問された方がテストしているコードではそうなることだと思います.
質問者が最初に掲載したコードは,明からにコンパイルエラーとなるハズですか,

> 読み取りデータは NULLになってしまします。

と書いています.このことから,実際のコードの掲載は期待できないかも知れません.
つまり,質問された方の問題に対して,解決方法を提供するのは困難と言えます. 

CommandText を使用したコードではありませんが,
私のサイトに以下の記事を掲載しています.他の方に参考になれば.
※ [注意] 私のサイトには,CommandText を使用したサンプルはありません.

[ 590_ADO でエクセルに接続 ]
http://mrxray.on.coocan.jp/Delphi/plSamples/590_ADO_Excel.htm


Mr.XRAY  2020-09-05 21:32:31  No: 149130

> つまり,質問された方の問題に対して,解決方法を提供するのは困難と言えます. 

インターネットの向こう側で,質問者が操作しているコードを覗き見ることができる,
エスパーとししての能力を持つプログラマーであれば可能性はあると思います.
私の知る限りでは,この掲示板でレスする方に,そのような方はいないと思います.

本来であれば,折角教えてくれたサンプルですから,それを確認して,
自分のコードに生かすのが手順とは思います.
しかし,今回のように,そのような手順を踏まない方もいます.

igy さんのようなレスにすれば,後は質問者が自分で調べて・・・,
と思ったのですが,予想外でした.

[ Data.Win.ADODB.TCustomADODataSet.CommandText ]
http://docwiki.embarcadero.com/Libraries/Sydney/ja/Data.Win.ADODB.TCustomADODataSet.CommandText


Mr.XRAY  2020-09-06 10:49:47  No: 149131

> ADODataSet1.CommandText := 'テスト$';
> ですが、Excelファイルの対象シート名を明記しています。   

その場合は TADODataSet.CommandType を cmdTable にします.

  ADODataSet1.CommandType := cmdTable;
  ADODataSet1.CommandText := '[テスト$]';


take  2020-09-07 09:41:36  No: 149132

Delphiの視点ではなくExcel視点での話ですが
Excelのシート名に「$」を使った場合、Excelのリンク接続子と混同するので
シート名は「'」シングルコーテーションで囲う必要があるのですが
それが影響していないでしょうか?


Mr.XRAY  2020-09-07 14:27:57  No: 149133

ADO で Excel のシート名を指定する場合,末尾の $ はセルの範囲です.
$ を省略するとエラーが発生して接続できません.
[テスト$A5:D20] のように使用します.ただし,選択クエリでは使用できません.
$ 以降を省略するとシート全体ですが,対象はデータがある行,例だけです.

[ データ領域と最終セルの位置 ]
http://mrxray.on.coocan.jp/Delphi/plExcelEx/E160_LastRange.htm 

> ご指導通りにしたのですが 

このご指導通りが何を意味するのか不明です.
そもそも,実際のテストコードが不明です.
ガオ~さんがご自分の世界に浸っているだけだと思いますが・・・

※ 勉強不足で「リンク接続子」に関する知識はありません.
※ takana さんが提示されたコートは正常に動作します.


ガオ~  2020-09-11 17:42:27  No: 149142

皆様、いつもお世話になっています。
色々やっていたら、出来ました。
ありがとうございました。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加