用Delphi打开Excel文件后,怎样知道其中有多少行有效数据?

解决方案 »

  1.   

    用ADO把Excel文件当成表打开,表的记录数即有效行数
      

  2.   

    给你发个例子,你看一看。unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons, ExcelXP, OleServer, ComObj, Grids;type
      TForm1 = class(TForm)
        ExcelApplication1: TExcelApplication;
        ExcelWorksheet1: TExcelWorksheet;
        ExcelWorkbook1: TExcelWorkbook;
        ExcelQueryTable1: TExcelQueryTable;
        BitBtn1: TBitBtn;
        Memo1: TMemo;
        btnClear: TBitBtn;
        BitBtn2: TBitBtn;
        BitBtn3: TBitBtn;
        StringGrid1: TStringGrid;
        btnNames: TBitBtn;
        procedure BitBtn1Click(Sender: TObject);
        procedure btnClearClick(Sender: TObject);
        procedure BitBtn2Click(Sender: TObject);
        procedure BitBtn3Click(Sender: TObject);
        procedure StringGrid1Click(Sender: TObject);
        procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
          var CanSelect: Boolean);
        procedure btnNamesClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.BitBtn1Click(Sender: TObject);
    var
      AExcel, ABook, ASheet: Variant;
      i: Integer;
      ATime: Double;
    begin
      Memo1.Lines.Add(DateTimeToStr(Now));
      ATime := Now;
      AExcel := CreateOleObject('Excel.Application');
      ABook := AExcel.WorkBooks.Open('D:\123.xls', 0);
      AExcel.Visible := False;
      for i := 1 to ABook.Worksheets.Count do
      begin
        Memo1.Lines.Add(ABook.Worksheets[i].Name);
      end;
      ATime := now - atime;
      Memo1.Lines.Add(DateTimeToStr(Now));
      Memo1.Lines.Add('用时:' + FloatToStr(ATime));  ABook.Close;
      AExcel.Quit;
    end;procedure TForm1.btnClearClick(Sender: TObject);
    begin
      Memo1.Lines.Clear;
    end;procedure TForm1.BitBtn2Click(Sender: TObject);
    var
      i: Integer;
      ATime: Double;
    begin
      Memo1.Lines.Add(DateTimeToStr(Now));
      ATime := Now;
      ExcelApplication1.Connect;
      ExcelApplication1.Visible[0] := False;
      ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Open('D:\123.xls', EmptyParam, EmptyParam,
        EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
        EmptyParam, EmptyParam, EmptyParam, EmptyParam, 0));  for i := 1 to ExcelWorkbook1.Worksheets.Count do
      begin
        Memo1.Lines.Add((ExcelWorkbook1.Worksheets.Item[i] as _WorkSheet).Name);
      end;
      ATime := now - atime;
      Memo1.Lines.Add(DateTimeToStr(Now));
      Memo1.Lines.Add('用时:' + FloatToStr(ATime));
      ExcelWorkbook1.Disconnect;
      ExcelApplication1.Quit;
      ExcelApplication1.Disconnect;end;procedure TForm1.BitBtn3Click(Sender: TObject);
    var
      AExcel: Variant;
      i, j: Integer;
      ATime: Double;
    begin
      Memo1.Lines.Add(DateTimeToStr(Now));
      ATime := Now;
      AExcel := CreateOleObject('Excel.Application');
      AExcel.WorkBooks.Open('D:\123.xls');
      AExcel.Visible := False;
      for i := 0 to StringGrid1.ColCount - 1 do
        StringGrid1.Cols[i].Clear;
      StringGrid1.ColCount := AExcel.ActiveSheet.UsedRange.Columns.Count;
      StringGrid1.RowCount := AExcel.ActiveSheet.UsedRange.Rows.Count;
      if StringGrid1.ColCount > 0 then
        StringGrid1.ColWidths[0] := 16;
      for i := 1 to AExcel.ActiveSheet.UsedRange.Rows.Count do
      begin
        StringGrid1.Cells[0, i] := IntToStr(i);
        for j := 1 to AExcel.ActiveSheet.UsedRange.Columns.Count do
          StringGrid1.Cells[j, i] := AExcel.Cells[i, j].Value;
      end;  AExcel.ActiveWorkBook.Close;
      AExcel.Quit;
      Memo1.Lines.Add(DateTimeToStr(Now));
      Memo1.Lines.Add('用时:' + FloatToStr(ATime));
    end;procedure TForm1.StringGrid1Click(Sender: TObject);
    var
      i: Integer;
      ACaption: string;
    begin
      for i := 0 to StringGrid1.ColCount - 1 do
      begin
        ACaption := StringGrid1.Cells[i, 0];    ACaption := StringReplace(ACaption, '*', '', [rfReplaceAll]);
        StringGrid1.Cells[i, 0] := ACaption;
      end;
      StringGrid1.Cells[StringGrid1.Selection.Left, 0] := '*' + StringGrid1.Cells[StringGrid1.Selection.Left, 0]
    end;procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
      ARow: Integer; var CanSelect: Boolean);
    var
      ASelectCol: TGridRect;
    begin
      ASelectCol.Top := 1;
      ASelectCol.Left := ACol;
      ASelectCol.Right := ACol;
      ASelectCol.Bottom := StringGrid1.RowCount;
      CanSelect := False;
      StringGrid1.Selection := ASelectCol;end;procedure TForm1.btnNamesClick(Sender: TObject);
    var
      AExcel, ABook, ASheet: Variant;
      i: Integer;
      ATime: Double;
    begin
      Memo1.Lines.Add(DateTimeToStr(Now));
      ATime := Now;
      AExcel := CreateOleObject('Excel.Application');
      ABook := AExcel.WorkBooks.Open('D:\123.xls', 0);
      AExcel.Visible := False;
      ABook.Activate;  for i := 1 to ABook.Names.Count do
      begin
        Memo1.lines.Add(ABook.ActiveSheet.Names[i].Name);
        Memo1.Lines.Add(ABook.Name);
      end;
      ATime := now - atime;
      Memo1.Lines.Add(DateTimeToStr(Now));
      Memo1.Lines.Add('用时:' + FloatToStr(ATime));  ABook.Close;
      AExcel.Quit;end;end.这个例子可以获得工作表、行数、以及工作表内的所有数据
      

  3.   

    这是我以前用EXCEL时写的一个小测试程序
      

  4.   

    AExcel.ActiveSheet.UsedRange.Columns.Count;列数
    AExcel.ActiveSheet.UsedRange.Rows.Count;行数
      

  5.   

    我试过上面的代码,但没有看见应有的结果。用ADO该如何设置与Excel的连接?