Excel和table控件当成一个表时操作时出现的奇怪问题(200分)

  • 主题发起人 主题发起人 淡淡的笑
  • 开始时间 开始时间

淡淡的笑

Unregistered / Unconfirmed
GUEST, unregistred user!
Excel数据如下

房号 业主 电话
101 张三 139
102 李四 133
A03 王五 199

直接用
datamodule1.ADOTable1.ConnectionString := (..省略..就是连接excel的字串..);
datamodule1.ADOTable1.TableDirect:=true;
datamodule1.ADOTable1.TableName :='sheet1'+'$';
datamodule1.ADOTable1.open;
...循环体...
temp:=vartostr(datamodule1.ADOTable1.FieldValues['房号']);
............

运行,发现 temp在 101,102时没问题,但记录指针到了A03时,temp取出来就是Null.
如果随便改101或102其中一条为 A01或A02.则变成A**的能取出来.而10*的读出来为Null

后面经过实验,发现.只要此Excel中,房号的类型(纯数字型和数字+字母混合型)超过一半时,那一种类型的房号就能取出来.另外一种类型的房号则取出来都为Null..

请问如何解决?
 
你读到dbgrid中看也这样吗?
 
对excel表中每一列进行单元格属性设置
 
temp:=datamodule1.ADOTable1.Fieldbyname('房号').asstring
这样呢?
 
to newmoonfaw:
怎么样才能快速的读到dbgrid?
 
to yuzk2005: 设置过了...啥方法都用了.包括"常规","文本",,在内容的前面加上"'"符号...

to weichao9999: 一样..
 
你用adoquery
//连接
function TMyForm.ConnecteXLSDataSource(AdoConnection:TAdoConnection;
DataSource,UserID,pswd:string;var ErrMsg:string;IsHeed:boolean= true):boolean;
const
connectionstr='Provider=%s;User ID=%s;Password=%s;Persist Security Info=False;Data Source=%s;Extended Properties=%s';
var
Extended_Properties,Provider:string;
begin
try
Provider:='Microsoft.Jet.OLEDB.4.0';
if IsHeed then
Extended_Properties:='"Excel 8.0;HDR=YES;IMEX=1"'
else
Extended_Properties:='"Excel 8.0;HDR=NO;IMEX=1"';
ADOConnection.Close;
ADOConnection.ConnectionString :=format(connectionstr,[Provider,UserID,pswd,DataSource,Extended_Properties]);
ADOConnection.Open;
result:=true;
ErrMsg:='';
except
on e:exception do
begin
result:=false;
ErrMsg:=e.Message;
end;
end;
end;


//取数
var
sql:string;
begin
try
FExcelADOQuery.Close;
FExcelADOQuery.SQL.Clear;
//sql:='select top 10 * from [excel 8.0;database=' + ExcelFileEdit.Text + '].['+SheetComboBox.Text+']';
sql:='select * from Sheet$';
FExcelADOQuery.Parameters.Clear;
FExcelADOQuery.ParamCheck := false;
FExcelADOQuery.SQL.Add(sql);
FExcelADOQuery.Open;
//ExcelGrid.Columns.RebuildColumns;
//SetColWidth(ExcelGrid);
//ReSetcolTitle(ExcelGrid);
except
on e:exception do
begin
Application.MessageBox(pchar(e.Message),MsgCaption,mb_ok+mb_IconError);
end;
end;
end;
//这个时我平时用的,没发现什么问题
 
通过AdoQuery连接Excel,然后把TDatasource指向AdoQuery。然后把dbgrid的数据源设置成DataSource,
连接AdoQuery到Excel的串是这样的(比如文件名为demo.xls):
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=demo.xls;Mode=Read|Write;Extended Properties=Excel 8.0;Persist Security Info=False
然后
AdoQuery.close;
AdoQuery.sql.text:='select * from [sheet1$]';
{sheet1为你Excel文件的表名}
AdoQuery.open;这样就能把Excel文件的内容读到Dbgrid中了。
 
后退
顶部