我的代码是这样的(adoquery1是连接数据库的查询,adoquery2是连接excel的查询)try
  sFileName := OpenDialog1.FileName;
  ADOConnection2.Connected := False;    //注意这里 连接 EXCEL 的参数                                                                //关键是这里
  ADOConnection2.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source=' + sFileName + ';Extended Properties="Excel 8.0;IMEX=1";Persist Security Info=False';
  ADOConnection2.Connected := True;
  //showmessage('连接execl成功');
  sl := TStringList.Create;
  ADOConnection2.GetTableNames(sl); // 记住 Excel 文件的 底部 必须是 sheet1   否则不能导入
  sTableName := sl[0];
  //showmessage(sTableName);
  if Pos('$', sTableName) > 0 then sTableName := '[' + sTableName + ']';  ADOquery2.Close;
  ADOquery2.SQL.Clear;
  ADOquery2.SQL.Text := 'SELECT * FROM ' + sTableName;
  //showmessage(ADOquery2.SQL.Text);
  ADOquery2.Open;
  sl.Free;  ADOquery1.Close;
  ADOquery1.Sql.Text := 'SELECT top 1 * FROM data2011 where 1=0';      //打开 空记录表....这里可以用 insert,不用append
  //showmessage(ADOquery1.Sql.Text);
  ADOquery1.Open;                                                           //根据自己习惯 做吧...
  //该语句用来执行Query1中的SQL命令语句, 如果执行查询从数据库中获得查询结果,查询结果会在数据网格DBGrid1中显示出来。
  if ADOquery2.RecordCount > 0 then
  begin    ADOquery2.First;
    for i := 1 to ADOquery2.RecordCount do      //
    begin
        ADOquery1.Append;
        ADOquery1.FieldValues['商户名']:=trim(ADOquery2.FieldValues['商户名']);
        ADOquery1.FieldValues['分子公司']:=trim(ADOquery2.FieldValues['分子公司']);
        ADOquery1.FieldValues['成功笔数(不含跨行)']:=trim(ADOquery2.FieldValues['成功笔数(不含跨行)']);
        ADOquery1.FieldValues['成功金额(不含跨行)']:=trim(ADOquery2.FieldValues['成功金额(不含跨行)']);
        ADOquery1.FieldValues['跨行发送银行笔数']:=trim(ADOquery2.FieldValues['跨行发送银行笔数']);
        ADOquery1.FieldValues['跨行发送银行金额']:=trim(ADOquery2.FieldValues['跨行发送银行金额']);
        ADOquery1.FieldValues['应收收入']:=trim(ADOquery2.FieldValues['应收收入']);
        ADOquery1.Post;      ADOquery2.Next;
    end;  end; MessageBox(Handle,'导入完成!','完成!',MB_OK+MB_ICONINFORMATION);
 except
 MessageBox(Handle,'失败!','信息!',MB_OK+MB_ICONINFORMATION); end;end;运行后没报错,但导入时出现ADOquery2.FieldValues['成功笔数(不含跨行)'])等均提示not found 成功笔数(不含跨行)等错误。跨行发送银行笔数'和跨行发送银行金额也是这个错误。我找了半天才发现需要导入的excel的列名不是前面有空格,就是后面有空格,请问如何预处理这些EXCEL的列名然后在导入。

解决方案 »

  1.   

    大哥能说详细点吗?我的这段代码是根据excel字段名称来读入相应列的数据并导入到数据库中,
    fields[1]是什么呢。。我没用过?这样改导入时程序如何知道该哪个字段导入哪个SQL的列中呢还有我建数据库的时候所有的列都是nvarchar[255]型,转换为string会不会出现数据转换错误。。
    谢谢。
      

  2.   

    这个程序是公司同事要求做的。他一天要导入100多张表。。不可能每个EXCEL的列都去判断有没有空格,因为有空格无法进行运算等操作现在还有新的问题。。不仅列名有空格,里面内容也有空格,我特意改好一个excel所有的列名,然后导入到数据库中出现 
    像“阳光人寿保险股份有限公司四川分公司??”,“?? 5,491.00”等这样的数据。。这些数据如果再导出到一张EXCEL,这个EXCEL根本没法用。。哎请问下如何去除excel各列数据中的空格,谢谢。因为这些?号就是空格,导入到数据库后就成了?号。真悲剧。。谁能提供个处理excel空格的源代码格外加分吧。呵呵。。大家帮帮忙。谢谢。
      

  3.   

    建议不要用fieldvalues['商户名']而是使用trim(filedbyname('商户名').asstring)这样应该可以处理掉数据中有空格的情况字段名有空格的情况,最简单的方法就是采用1楼的方法,用fields[1].asstring,其中1就是字段的顺序号,这要求你的excel表列顺序是固定的
      

  4.   

    ADOquery1.FieldValues['商户名']:=ADOquery2.FieldValues['商户名'];换为ADOquery1.FieldValues['商户名']:=ADOquery2.FieldByName('商户名').asstring?
      

  5.   

    if ADOquery2.RecordCount > 1 then//第一行是标题列
      begin    ADOquery2.First;
        ADOquery2.Next;//第二行才是数据
        for i := 1 to ADOquery2.RecordCount do      //
        begin
            ADOquery1.Append;
            ADOquery1.FieldByName('商户名').AsString:=trim(ADOquery2.FieldByName('F1').AsString);//F1就是字段1,是第一个字段,也就是'商户名'那一列;
            ADOquery1.FieldByName('分子公司').AsString:=trim(ADOquery2.FieldByName('F2').AsString);//字段2['分子公司']);
            ADOquery1.FieldByName('[成功笔数(不含跨行)]'):=trim(ADOquery2.FieldByName('F3').AsString);//字段3['成功笔数(不含跨行)']);你字段名里带有()所以需要有[]来确定字段名,你可以用你的方式导入,但是字段名是一定要有[]的
            ....        ADOquery1.Post;      ADOquery2.Next;
        end;  end;