0

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

4

2 回答 2

1

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

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

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

您会发现有多种方法可以处理列标题内容的变化,但正如另一个答案所示,这些方法可能比简单地跳过主while not EOF循环主体内的空白行更冗长阅读表格内容,所以我真的看不出跳过空白行不这样做有什么好处。

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

于 2019-07-18T10:58:50.320 回答
1

原答案:

如果我理解正确并且您想在打开查询后排除空行,​​那么下一种方法可能会有所帮助(但我认为,您应该使用 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;

更新:

这是试图改善我的答案。如果不知道表结构,可以用 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;
于 2019-07-18T14:04:07.327 回答