查遍了论坛上的所有帖子,都是将Delphi中数据导入到Excel中,我想问问如何在Delphi中读取Excel数据啊!
我的想法是用TExcelApplication控件打开制定的Excel文件,然后将数据读入到StringGrid控件中,可是用ExcelApplication.Cells[1,1].values不行啊。总说“Class does not have a default property”
请问一下怎么能够读出Excel数据啊!!!???

解决方案 »

  1.   

    > 全面控制 Excel > 首先?建 Excel ?象,使用ComObj:> var ExcelID: Variant;> ExcelID := CreateOleObject( 'Excel.Application' );> 1) ?示?前窗口:> ExcelID.Visible := True;> 2) 更改 Excel ???:> ExcelID.Caption := '?用程序?用 Microsoft Excel';> 3) 添加新工作簿:> ExcelID.WorkBooks.Add;> 4) 打?已存在的工作簿:> ExcelID.WorkBooks.Open( 'C:ExcelDemo.xls' );> 5) ?置第2?工作表?活?工作表:> ExcelID.WorkSheets[2].Activate;  > 或 > ExcelID.WorksSheets[ 'Sheet2' ].Activate;> 6) ??元格?值:> ExcelID.Cells[1,4].Value := '第一行第四列';> 7) ?置指定列的?度(?位:字符??),以第一列?例:> ExcelID.ActiveSheet.Columns[1].ColumnsWidth := 5;> 8) ?置指定行的高度(?位:磅)(1磅=0.035厘米),以第二行?例:> ExcelID.ActiveSheet.Rows[2].RowHeight := 1/0.035; // 1厘米> 9) 在第8行之前插入分?符:> ExcelID.WorkSheets[1].Rows[8].PageBreak := 1;> 10) 在第8列之前?除分?符:> ExcelID.ActiveSheet.Columns[4].PageBreak := 0;> 11) 指定?框??度:> ExcelID.ActiveSheet.Range[ 'B3:D4' ].Borders[2].Weight := 3;> 1-左    2-右   3-?    4-底   5-斜(  )     6-斜( / )> 12) 清除第一行第四列?元格公式:> ExcelID.ActiveSheet.Cells[1,4].ClearContents;> 13) ?置第一行字体?性:> ExcelID.ActiveSheet.Rows[1].Font.Name := '??';> ExcelID.ActiveSheet.Rows[1].Font.Color  := clBlue;> ExcelID.ActiveSheet.Rows[1].Font.Bold   := True;> ExcelID.ActiveSheet.Rows[1].Font.UnderLine := True;> 14) ?行?面?置:> a.?眉:>     ExcelID.ActiveSheet.PageSetup.CenterHeader := '?表演示';> b.??:>     ExcelID.ActiveSheet.PageSetup.CenterFooter := '第&P?';> c.?眉到?端?距2cm:>     ExcelID.ActiveSheet.PageSetup.HeaderMargin := 2/0.035;> d.??到底端?距3cm:>     ExcelID.ActiveSheet.PageSetup.HeaderMargin := 3/0.035;> e.??距2cm:>     ExcelID.ActiveSheet.PageSetup.TopMargin := 2/0.035;> f.底?距2cm:>     ExcelID.ActiveSheet.PageSetup.BottomMargin := 2/0.035;> g.左?距2cm:>     ExcelID.ActiveSheet.PageSetup.LeftMargin := 2/0.035;> h.右?距2cm:>     ExcelID.ActiveSheet.PageSetup.RightMargin := 2/0.035;> i.?面水平居中:>     ExcelID.ActiveSheet.PageSetup.CenterHorizontally := 2/0.035;> j.?面垂直居中:>     ExcelID.ActiveSheet.PageSetup.CenterVertically := 2/0.035;> k.打印?元格网?:>     ExcelID.ActiveSheet.PageSetup.PrintGridLines := True;> 15) 拷?操作:> a.拷?整?工作表:>     ExcelID.ActiveSheet.Used.Range.Copy;> b.拷?指定?域:>     ExcelID.ActiveSheet.Range[ 'A1:E2' ].Copy;> c.?A1位置?始粘?:>     ExcelID.ActiveSheet.Range.[ 'A1' ].PasteSpecial;> d.?文件尾部?始粘?:>     ExcelID.ActiveSheet.Range.PasteSpecial;> 16) 插入一行或一列:> a. ExcelID.ActiveSheet.Rows[2].Insert;> b. ExcelID.ActiveSheet.Columns[1].Insert;> 17) ?除一行或一列:> a. ExcelID.ActiveSheet.Rows[2].Delete;> b. ExcelID.ActiveSheet.Columns[1].Delete;> 18) 打印??工作表:> ExcelID.ActiveSheet.PrintPreview;> 19) 打印?出工作表:> ExcelID.ActiveSheet.PrintOut;> 20) 工作表保存:> if not ExcelID.ActiveWorkBook.Saved then>    ExcelID.ActiveSheet.PrintPreview;> 21) 工作表另存?:> ExcelID.SaveAs( 'C:ExcelDemo1.xls' );> 22) 放?存?:> ExcelID.ActiveWorkBook.Saved := True;> 23) ??工作簿:> ExcelID.WorkBooks.Close;> 24) 退出 Excel:> ExcelID.Quit;
      

  2.   

    begin
       ExcelApplication1.Connect;
       ExcelApplication1.Visible[0]:True;
       ExcelApplication1.Workbooks.Add(NULL,0);
       ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);
       ExcelWorkbook1.ConnectTo(ExcelWorkbook1.Sheets[1] as 
          _WorkSheet);
       ExcelSheet1.Cells.Item[X,Y]//就是你要访问的单元格了!!!!!
    end;
      

  3.   

    xlApp.Visible[0] := false;
      xlApp.AlertBeforeOverwriting[0] := False;
      xlbook.ConnectTo(xlApp.Workbooks.Open(FNEdit.Filename,NULL,false,NULL,NULL,NULL,NULL,NULL,NULL,
      NULL,NULL,NULL,NULL,0));
      xlSheet.ConnectTo(xlBook.Sheets[1] as _WorkSheet);
      edit1.Text := format('%d,%d',[xlSheet.UsedRange[0].Rows.Count, xlSheet.UsedRange[0].Columns.Count]);
      rowcount:=xlSheet.UsedRange[0].Rows.Count;
      for i:=3 to rowcount-1 do
      begin
        aaa :=xlsheet.Cells.Item[i,1].value ;
        bbb :=xlsheet.Cells.Item[i,2].value ;
      end;
      

  4.   

    procedure TFrm_ExcelTable_out.N3Click(Sender: TObject);    //  Indata  :TAdoTable;
      i,j:integer;
      q_name,E_name:string;
    begin
      screen.cursor:=crHourGlass ;
      Indata.ConnectionString :=
          'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+filename+';Extended Properties=excel 8.0;Persist Security Info=False';
      Indata.TableName :='Sheet1$';
      Indata.TableDirect :=true;
      try
        Indata.Active :=true;
      except
        application.MessageBox('打开数据表出错!','信息提示',64);
        exit;
      end;
      dm.ADOConnection.BeginTrans ;
      try
        Indata.First ;
        while not Indata.Eof do
        Begin
          Adoquery1.Insert ;
          if Adoquery1.FieldDefList.FieldDefs[0].Name='pro_no' then
            Adoquery1.Fields[0].AsString:=Pro_no
          else
            Adoquery1.Fields[0].Value:=Indata.fieldbyname(Indata.FieldDefList.FieldDefs[0].Name).value;
          i:=1;
          while (i<(Adoquery1.FieldCount -Q_num)) do
          Begin
            if Adoquery1.FieldDefList.FieldDefs[i].Name='rpr_id' then
              i:=i+1
            else begin
              E_name := Indata.FieldDefList.FieldDefs[i].Name;
              q_name:=Adoquery1.FieldDefList.FieldDefs[i].Name;
              if Adoquery1.FieldByName(q_name).DataType= ftDateTime  then
                Adoquery1.FieldByName(q_name).Value :=Indata.fieldbyname(E_name).AsDateTime;
              if Adoquery1.FieldByName(q_name).DataType= ftBoolean then
              begin
                if Indata.fieldbyname(E_name).AsString='FALSE'  then
                  Adoquery1.FieldByName(q_name).Value:=false
                else
                  Adoquery1.FieldByName(q_name).Value:=true;
              end else
                Adoquery1.FieldByName(q_name).Value :=Indata.fieldbyname(E_name).Value;
              i:=i+1;
            end;
          end;
          application.ProcessMessages;
          Indata.Next ;
          Adoquery1.Post ;
        end;
        dm.ADOConnection.CommitTrans ;
        application.MessageBox('数据导入成功!','信息提示',64);
        screen.Cursor := crDefault;
      except
        application.MessageBox('数据导入失败!','信息提示',64);
        dm.ADOConnection.RollbackTrans ;
        screen.Cursor := crDefault;
      end;
    end;