TADOQuery 包括空行

TADOQuery Including blank rows

将“while not TADOQuery.Eof”与 Microsoft Excel 工作簿一起使用时,它包含完全为空的行。有没有办法停止包含完全空白的行,因为我不需要它们?

您可以排除用于打开电子表格的 SQL 中的空行。如果第一行包含 'Column1'、'Column2' 等列标题,则以下 SQL 将不会 return 行,其中第一列中的值为空白

select * from [sheet1$] 
where Column1 <> ''

显然,SQL 可以更具体一些(就列值而言)您认为构成空白行的内容。

您会发现有多种方法可以处理列 headers 中的内容变化,但正如另一个答案所示,这些方法可能比简单地跳过空白要冗长得多主 while not EOF 循环的 body 内的行读取 table 内容,所以我真的看不到不通过跳过空白行不这样做有任何好处。

顺便说一句,通过 SQL 访问的 Excel 数据表现得好像查询自动限制在 Excel COM 接口中的 UsedRange 范围内。

原回答:

如果我理解正确并且您想在打开查询后排除空行,​​那么下一种方法可能会有所帮助(但我认为,您应该使用 SQL 语句排除这些行,如 @ MartynA 的回答)。这里,空行是所有行,所有字段都有 Null 值。

procedure TForm1.btnDataClick(Sender: TObject);
var
   i: Integer;
   empty: Boolean;
begin

   qry.First;
   while not qry.Eof do begin
      // Check for empty row. Row is empty if all fields have NUull value.
      empty := True;
      for i := 0 to qry.FieldCount - 1 do begin
         if not qry.Fields[i].IsNull then begin
            empty := False;
            Break;
         end{if};
      end{for};
      // Read record data if record is not empty
      if not empty then begin
         // Your code here ...
      end{if};
      // Next record
      qry.Next;
   end{while};

end;

更新:

这是为了改进我的回答。如果不知道table结构,可以查询tablewith always false WHERE子句得到这个结构,动态生成SQL语句:

procedure TForm1.btnDataClick(Sender: TObject);
var
    i: Integer;
    where: string;
begin
    // Get column names
    qry.Close;
    qry.SQL.Clear;
    qry.SQL('SELECT * FROM [SheetName] WHERE 1 = 0');
    try
       qry.Open;
    except
       ShowMessage('Error');
    end{try};
    where := '';
    for i := 0 to qry.FieldCount - 1 do begin
        where := where + '(' + qry.Fields[i].FieldName + ' <> '''') AND ';
    end{for};
    where := 'WHERE ' + Copy(where, 1, Length(where) - 5);

    // Read data without "empty" rows
    qry.Close;
    qry.SQL.Clear;
    qry.SQL('SELECT * FROM [SheetName] ' + where);
    try
       qry.Open;
    except
       ShowMessage('Error');
    end{try};

end;