我用的ADOConnection1,ADOTable1,DataSource1,DBGrid1。
DBGrid1指向DataSource1,DataSource1指向ADOTable1,ADOTable1指向ADOConnection1。ADOConnection1连接Excel文件的连接语句如下:
ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source=' + sFileName + ';Extended Properties=Excel 8.0;Persist Security Info=True';
然后我写如下语句:
  ADOConnection1.Connected := True;
    ADOTable1.Active:= False;
    ADOTable1.TableName:= ‘Sheet1$’ //Sheet1是工作簿的名字
    ADOTable1.Active:= True;问题出来了,一般来说Excel文件中第一个工作簿的名字为Sheet1,但是有些文件工作簿的名字是改了的,比如改为“学生成绩统计”,那么我该怎么写,让它自动读取ADOConnection1连接Excel文件成功后取得的工作薄名字:
 ADOTable1.TableName:= ???????

解决方案 »

  1.   

    可以先取得表名,見下段代碼。
    procedure TfrmAccessExcel.btnLoadClick(Sender: TObject);
    var
      MSExcel : Variant;
      i :integer;
    begin
      if OpenDialog1.Execute then
        AFileName := OpenDialog1.FileName
      else
      begin
        Showmessage('未打開文件!');
        exit;
      end;
     //下段程序是打開一個EXCEL文件,並取得文件中的表名。
      try
        MSExcel := CreateOleObject('Excel.Application');   //建立OLE對象;
        MSExcel.Workbooks.Open(AFileName);  //打開EXCEL文件;
        ComboBox1.Items.Clear;  //清除下拉列表框中項;
        for i := 1 to MSExcel.WorkSheets.Count do
          ComboBox1.Items.Add(MSExcel.WorkSheets[i].Name);  //取得EXCEL文件中的表名,並加到下拉列表框中;
        ComboBox1.Text := ComboBox1.Items.Strings[0]; //下拉列表框中顯示第一個表名;
      finally
        MSExcel.Workbooks.Close;
        MSExcel.Quit;
        MSExcel := Unassigned;
      end;
    end;
      

  2.   

    var
      strList: TStrings;
      intI: Integer;
    begin
      self.ADOConnection1.Connected:= false;
      self.ADOConnection1.ConnectionString:= 'Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source=' + sFileName + ';Extended Properties=Excel 8.0;Persist Security Info=True';;
      self.ADOConnection1.Connected:= true;
      strList:= TStringList.Create;
      self.ADOConnection1.GetTableNames(strList);//表名就在这个list里面
      for intI:=0 to strList.count-1 do  
        showmessage(strList.Strings[intI]);
      //.............
      strList.free;end;
      

  3.   

    如果有几个工作簿,该怎么表示?如Excel中第一个工作簿为“源表”,第二个为“统计1”,第三个为“统计2”,表名变量为stable,表个数变量为scount,我怎么给这两个变量赋值?得到我想要的结果:如我想把“统计1”传给stable,Excel中工作簿个数传给scount?
    还有GetTableNames(ts,false)中的false有什么用?
      

  4.   

    var
      strList: TStrings;
      intI: Integer;
    begin
      self.ADOConnection1.Connected:= false;
      self.ADOConnection1.ConnectionString:= 'Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source=' + sFileName + ';Extended Properties=Excel 8.0;Persist Security Info=True';;
      self.ADOConnection1.Connected:= true;
      strList:= TStringList.Create;
      self.ADOConnection1.GetTableNames(strList);//表名就在这个list里面
      for intI:=0 to strList.count-1 do  
        showmessage(strList.Strings[intI]);
      //.............
      strList.free;end;