在Microsoft Excel工作簿中使用“ while not TADOQuery.Eof
”时,其中包括完全为空的行。有没有办法停止包含所有不需要的行,因为我不需要它们?
答案 0 :(得分:1)
您可以在用于打开电子表格的SQL中排除空白行。如果第一行包含“ Column1”,“ Column2”等列标题,则以下SQL将不会返回第一列值为空白的行
select * from [sheet1$]
where Column1 <> ''
很显然,对于您认为构成空白行的内容,SQL可能会更具体(就列值而言)。
您已经了解到,有多种方法可以处理列标题内容的变化,但正如其他答案所示,这些方法可能比仅跳过主体内部的空白行更为冗长主要的while not EOF
循环读取表内容,因此我只跳过空白行就看不到没有这样做的任何好处。
顺便说一句,通过SQL可访问的Excel数据的行为就像查询被自动限制为Excel COM界面中的UsedRange
范围一样。
答案 1 :(得分: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;
更新:
这是尝试改善我的答案。如果表结构未知,则可以使用始终为假的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;