用TOleContainer控件直接读,或者用流。

解决方案 »

  1.   

    用OLE的方法做吧,给你个例子看看procedure TstartForm.SpeedButton10Click(Sender: TObject);
      var MSExcel:Variant;
      begin
      MSExcel:=CreateOLEObject('Excel.Application');
      MSExcel.WorkBooks.Add;
      MSExcel.Visible:=True;  for i:=5 to Query1.RecordCount+4 do
      begin
      MsExcel.Cells[i,1].value:=Query1.FieldByName('cpxhno').Asstring;
      MsExcel.Cells[i,2].value:=Query1.FieldByName('cpname').Asstring;
      MsExcel.Cells[i,3].value:=Query1.FieldByName('cpunit').Asstring;
      MsExcel.Cells[i,4].value:=Query1.FieldByName('htnumber').Asstring;
      MsExcel.Cells[i,5].value:=Query1.FieldByName('number').Asstring;
      MsExcel.Cells[i,6].value:=Query1.FieldByName('ljno').Asstring;
      end;
      end;退出Excel:
    MSExcel.Quit;
    MSExcel:=Unassigned; //释放VARIANT变
    ***************
    先加入ExcelApplication1;ExcelWorkbook1;ExcelWorksheet1;
    procedure TForm1.n1Click(Sender: TObject);
    var
      row,brea:integer;
      a,b,c,d,e:shortstring;
    begin
      if table1.active = True then begin
        try
          ExcelApplication1.Connect;
        Except
          ExcelApplication1.free;
          Abort;
        end;
        brea := strtoint(inputbox('输入需导入行数!','行数','10'));
        if brea<1 then brea := 10;
        ProgressBar1.Visible := True;
        ProgressBar1.Max := brea;
        ExcelApplication1.Visible[0] := true;
        for row := 2 to brea do
        begin
          a := ExcelWorksheet1.Cells.Item[row,2];
          b := ExcelWorksheet1.Cells.Item[row,1];
          c := ExcelWorksheet1.Cells.Item[row,3];
          d := ExcelWorksheet1.Cells.Item[row,4];
          e := ExcelWorksheet1.Cells.Item[row,5];
          form1.show;
          table1.AppendRecord([a,b,c,d,e]);
          ProgressBar1.Position := row-1;
        end;
        ProgressBar1.Hide;
      end;
    end;
    *****************
    var
    MSExcel: Variant;
    i: Integer;
    begin
    OpenDialog1.Filter:='*.XLS|*.XLS';
    OpenDialog1.DefaultExt:='XLS';
    if OpenDialog1.Execute then
    begin
      MSExcel:=CreateOLEObject('Excel.Application');
      MSExcel.WorkBooks.Open(OpenDialog1.FileName);
      MSExcel.Visible:=False;
      //从有数据的行逐行读入数据
      for i:=1 to MSExcel.ActiveSheet.UsedRange.Rows.Count do
      begin
        Edit2.Text:=Edit2.Text+MSExcel.Cells[i,1].Value;
      end;
      MSExcel.ActiveWorkBook.Close;
      MSExcel.Quit;
    end;
    end;
      

  2.   

    在座各位的方法,我会一一试过,分一定会给?
    不过用OLE的方法是不是EXCEL97和EXCEL2000汇不兼容
      

  3.   

    wangxd1976(西门吹雪) 
    ADO通过什么来连接EXCEL,不会是ODBC吧!
    你可否提供CONNECTIONSTRING?
      

  4.   

    Excel IISAM不知道大家是否了解?
      

  5.   

    我这里也有一个读入EXCEL数据的例子!
    里面有些函数和过程我都不贴了,相信你看得懂!procedure TPPms010.LoadExcelFile(FileName:string);
    var
      i,j: integer;
      rows,cols:integer;
      ExcelApp, WorkBook, WorkSheet : Variant;
      strLst:Tstringlist;
    begin
      inherited;
      cols:=41;
      strLst:= TstringList.Create ;
      try
        ExcelApp := CreateOleObject('Excel.Application');
      except
        on E:EolesysError do
        begin
          DispErr(E.Message);
          abort;
        end
        else
        begin
          DispErr('PPMS010-04  Could not Create Excel Application!');
          abort;
        end;
      end;
      try
        try
          ExcelApp.WorkBooks.Open(edtDir.text,,True);
          WorkBook:=ExcelApp.ActiveWorkbook;
          WorkSheet:=WorkBook.ActiveSheet;
        except
          DispInf('PPMS010-05 Can''t open file!', MB_OK + MB_ICONINFORMATION);
          abort;
        end;
        dmppms010.QryAm_Allocation_head.Append ;
        SetHeadValues;
        rows:=GetSheetRows(WorkSheet);
        PrgrsBar.Max:=rows;
        PrgrsBar.step:=1;
        PrgrsBar.Show;
        for i:=1 to rows do
        begin
          strLst.Clear ;
          for j:=1 to cols do
            strLst.Add(string(WorkSheet.Cells[i,j]));
          dmppms010.QryAm_Allocation_Line.Append;
          SetLineValues(strLst,FileType);
          PrgrsBar.StepIt ;
        end;
      finally
        strLst.free;
        WorkBook.Close;
        ExcelApp.Quit;
        ExcelApp:= unassigned;
        PrgrsBar.Hide ;
      end;
    end;
      

  6.   

    用ado非常方便,
    connectstring:
      Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data Source=F:\Leewei\Books\Delphi5\Book3\ADODemos\Excel\forcast.xls;Mode=Share Deny None;Extended Properties=Excel 8.0;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=35;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False
    用adotable,直接设置adotable.tabledirect:=true,就可以了。
    或者在excel中选择所需数据设置一个名称作为一个表名。
      

  7.   

    jianping0(ljp) 
    有点疑问,我用你的方法
    测试连接没有问题,但adotable.active:=true时,提示"sql的from子句出错"
    我想可能是excel每一个表即为一个sheet,但sheet的名为sheet1$,sheet2$
    这样会造成sql的语法出错:select * from sheet1$
    我将excel的sheet1改为a,但还是有一个后缀a$
    还是select * from a$,还是from子句出错
      

  8.   

    to ghz2000(浩中):
      jianping0(ljp)的方法是正确的,你是用tadoquery还是tadotable.如果用tadotable的话看清jianping0(ljp)所请的adotable.tabledirect:=true了吗?还有的是在connectstring中的data source=path 路径写相对路径比较好这样就不怕路径出错了。  你试试吧,如有需要我邮你一份啦!:) 
     
      

  9.   

    //adotable.tabledirect:=true
    感谢say(),我的确没有注意到这点,
    不过我用adoquery好像不可以
      

  10.   

    to ghz2000(浩中):
       用adoquery也是没问题的.
      

  11.   

    to say()
    我也试过用adoquery真的不行,提示from子句出错,请指教,多谢