procedure TFM_KQ1.BitBtn2Click(Sender: TObject);
var i,count1:integer;
    str1,str2,m:string;
begin
  if legit1(edit1.text)then
  begin
  try ea1.connect;
  except showmessage('是否安装了excel,或者excel已经运行!');  abort;
  end;
 // bitbtn2.visible :=false;
  ea1.Visible[0]:=true;
  ea1.Caption :='从excel文件中读取内容';
  ea1.Workbooks.Open(edit1.Text ,null,null,null,null,null,null,null,null,null,null,null,null,0);
  ew1.ConnectTo(ea1.Workbooks[1]);
  es1.ConnectTo(ew1.Worksheets[1] as _worksheet);
  count1:=es1.cells.CurrentRegion.rows.count;
   with adoqry2 do
  begin
    close;
    sql.clear;
    sql.add('select max(考勤编号)as ss from 晚点名表');
    open;
  end;
  m:=trim(adoqry2.FieldByName('ss').Value);  table1.Active:=true;
  for i:=2 to count1 do
  begin  str1:=es1.Cells.Item[i,1];
     table1.First;
    while not table1.Eof do
     begin
      with adoqry2 do
        begin
          close;
          sql.clear;
          sql.add('select * from 晚点名表');
          open;         First ;
       str2:=Fields[0].AsString ;
        end;     if (str1=str2) then
        begin
          showmessage('考勤编号为'+str2+'的记录已存在,当前最大考勤编号为'+m+'请修改要导入的考勤编号!');
          break;
        end
     else
       begin       table1.Append ;
       table1.Fields[0].AsString:=es1.Cells.item[i,1];
       table1.Fields[1].AsString:=es1.Cells.item[i,2];
       table1.Fields[2].AsString:=es1.Cells.item[i,3];
       table1.Fields[3].AsString:=es1.Cells.item[i,4];
       table1.Fields[4].AsString:=es1.Cells.item[i,5];
       table1.Fields[5].AsString:=es1.Cells.item[i,6];
       table1.Fields[6].AsString:=es1.Cells.item[i,7];
       table1.Fields[7].AsString:=es1.Cells.item[i,8];
       table1.Post ;
       table1.Next ;
        adoqry2.Next ;
       end;
     end;
  end;
       showmessage('数据成功导入!');
       table1.Active:=false;
       ea1.Quit ;
       ea1.Disconnect ;
      // bitbtn2.Visible :=true;
       end
       else
         showmessage('文件选择错误,请检查修改后重新导入') ;end;

解决方案 »

  1.   

    同志们,救救急啊,类似的代码在另外一个form 里可以用,在这个里几乎是一模一样的就不行了,无奈啊!马上就要交了,同志们帮帮忙阿
      

  2.   

      单步运行时到这里停下str1:=es1.Cells.Item[i,1]; 
    报错:OLE ERROR 800401A8
      

  3.   

    for i:=2 to count1 do //如果excel为空,怎么办?
      begin 
      str1:=es1.Cells.Item[i,1]; //此处也是
      

  4.   


    OLE ERROR 800401a8 就是系统给出的错误信息。后来我在原来出错停止运行的语句设成断点用单步执行,又可以实现。
      
    令人不解的是,有时候调试程序运行正常,有时候又会报上面的错误,马上就要答辩了,错误的症结还没有找到,不知道到时候会不会出错,大家有碰到这种情况的,请给点指导!