delphi7 ADO select 查询 XLS 总是不是找出所有的列???(100分)

  • 主题发起人 主题发起人 bozhilong
  • 开始时间 开始时间
B

bozhilong

Unregistered / Unconfirmed
GUEST, unregistred user!
EXCEL2000文件:
名称 单价1 单价2 单价3 单价四 单价五 单价6 单价7 单价8 单价9
精制棉 10 11 12 13 14 15 16 17 18
玉米淀粉 0 13 14 15 16 17 18
木桨 3 4 5 5

程序原码:
procedure TFmCP.ToolButton1Click(Sender: TObject);

var
bbxls: TStrings;
ExcelApp: Variant;
ADOConn: TADOConnection ;
ADOtemp: TADOQuery;
S : string;
begin
if OpenDialog1.Execute then begin
S := extractfilename(OpenDialog1.FileName);
if (S = '物资转让.xls') or (S = '新型辅料.xls') or (S = '包衣粉.xls') then
begin

ExcelApp := CreateOleObject( 'Excel.Application' );
ExcelApp.WorkBooks.Open(OpenDialog1.FileName);
ExcelApp.ActiveWorkBook.Save;
ExcelApp.Quit;
varclear(ExcelApp);

OpenDialog1.FileName := extractfilename(OpenDialog1.FileName); //去文件路径
OpenDialog1.FileName :=
leftstr(OpenDialog1.FileName,length(WideString(OpenDialog1.FileName))-4); // uses strutils 去文件后缀名
{打开保存一次EXCEL文件,为何要保存一次呢?如果是其它程序用第三方控件导出的EXCEL文件,最好做此步,否则容发生错误}

bbxls :=TStringList.Create;
ADOConn :=TADOConnection.Create(FmCP);
ADOConn.LoginPrompt := False;
ADOtemp :=TADOQuery.Create(FmCP);
ADOtemp.Connection := ADOConn;
{ADOConn是数据库连接控件ADOConnection}
ADOConn.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + OpenDialog1.FileName + ';Extended Properties=excel 8.0;Persist Security Info=true';
ADOConn.Connected := True;
ADOConn.GetTableNames(bbxls);{将EXCEL文件中的表格名单赋值于a_cc变量}


ADOtemp.Close;
ADOtemp.sql.text:='select * from ['+bbxls[0]+']';//得到EXCEL文件中的第一个表格的数据
ADOtemp.open;
while not ADOtemp.Eof do
begin
{adoquery1是操作ACCESS或SQL数据表的,XF_A是姓名 xf_b 是年龄 }
fmData.ADOCP.Append;

fmData.ADOCP.FieldByName('名称').AsString := ADOtemp.FieldValues['名称'];
fmData.ADOCP.FieldByName('类型').AsString := OpenDialog1.FileName;
fmData.ADOCP.FieldByName('单价1').AsFloat := ADOtemp.FieldByName('单价1').AsFloat;
fmData.ADOCP.FieldByName('单价2').AsFloat := ADOtemp.FieldByName('单价2').AsFloat;
fmData.ADOCP.FieldByName('单价3').AsFloat := ADOtemp.FieldByName('单价3').AsFloat;
fmData.ADOCP.FieldByName('单价4').AsFloat := ADOtemp.FieldByName('单价4').AsFloat;
fmData.ADOCP.FieldByName('单价5').AsFloat := ADOtemp.FieldByName('单价5').AsFloat;
fmData.ADOCP.FieldByName('单价6').AsFloat := ADOtemp.FieldByName('单价6').AsFloat;
fmData.ADOCP.FieldByName('单价7').AsFloat := ADOtemp.FieldByName('单价7').AsFloat;
fmData.ADOCP.FieldByName('单价8').AsFloat := ADOtemp.FieldByName('单价8').AsFloat;
fmData.ADOCP.FieldByName('单价9').AsFloat := ADOtemp.FieldByName('单价9').AsFloat;
ADOtemp.next;
end;
fmData.ADOCP.post;

adoconn.Connected:=false;
ADOtemp.close;
ADOConn.Free;
ADOtemp.Free;
bbxls.Free;
varclear(ExcelApp);
messagebox(handle,'数据处理完毕','提示',MB_OK+MB_ICONINFORMATION);
end else
messagebox(handle,'导入文件必须是类型文件名!','提示',MB_OK+MB_ICONINFORMATION);
end;

end;

程序运行后,总是从给‘单价4’付值时,提示找不到‘单价4’这列,这是怎么回事啊,
为什么‘单价1-单价3’都正常呢?
请各位大虾帮帮忙吧。
 
单价四?单价4? 你是不是打错字?

另外,干吗不试试,ADOQuery1.Fields[2]这样~
 
兄弟,我试过了,还不行,
后,把那个XLS文件,另存为:文本文件(制表符分隔)(*。TXT),再存为XLS
就行了
 
这个问题没人会吗?
 
To bozhilong:
1、不是没人会,是根本看不到你的那个宝贝 xls 文件!
2、程序的出现问题的原因有很多种,一种是程序本身问题,一种是你的 Excel 文件的问题。不知道您的宝贝字段究竟是[单价4]还是[单价4],双字节和单字节当然是不同的。
3、另外您的提供程序根本运行不了,fmData 估计是什么数据模板吧,又长又乱根本一塌糊涂。
4、居于这种情况,你可以这样调试一下:
ADOtemp.Close;
ADOtemp.sql.text:='select [单价4] from ['+bbxls[0]+']';
ADOtemp.open;
底下的什么 while not ADOtemp.Eof do 等等代码都去掉。看看是否报错说没找到字段[单价4]。
 
后退
顶部