将 ' while not TADOQuery.Eof
' 与 Microsoft Excel 工作簿一起使用时,它包括完全为空的行。有没有办法停止包含任何完全空白的行,因为我不需要它们?
问问题
223 次
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 回答