实现读取EXCEL的代码:
procedure Tform_getinfo.Button2Click(Sender: TObject);
 var
   a_cc: TStrings;
   ExcelApp: Variant;
 begin
  if OpenDialog2.Execute then
  begin
    edit5.Text:=OpenDialog2.FileName;
    //Fmdir.FileListBox1.FileName;
    {打开保存一次EXCEL文件,为何要保存一次呢?如果是其它程序用第三方控件导出的EXCEL文件,最好做此步,否则容发生错误}
    ExcelApp := CreateOleObject( 'Excel.Application' );
    ExcelApp.WorkBooks.Open(OpenDialog2.FileName);
    ExcelApp.ActiveWorkBook.Save;
    ExcelApp.Quit;
    varclear(ExcelApp);
    
    a_cc :=TStringList.Create;
    {ADOConn是数据库连接控件ADOConnection}
    ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + OpenDialog2.FileName + ';Extended Properties=excel 8.0;Persist Security Info=false';
    ADOConnection1.Connected := True;
    ADOConnection1.GetTableNames(a_cc);{将EXCEL文件中的表格名单赋值于a_cc变量}
    with adoquery1 do
      begin
         Close;
         sql.text:='select 记录序号,寄达局邮编,收件人姓名,收件人地址 from ['+a_cc[0]+']';//得到EXCEL文件中的第一个表格的数据
          open;
      end;
      DBGrid1.Columns[0].Width:=80;
      DBGrid1.Columns[1].Width:=80;
      DBGrid1.Columns[2].Width:=80;
      DBGrid1.Columns[3].Width:=200;
  end;
 GroupBox1.Visible:=false;
end;
===========================请问我要实现刷新数据应该如何实现
 ADOQuery1.Refresh;  提示错误报告:“缺少刷新或更新的键列信息”
在线等,谢谢啦

解决方案 »

  1.   

    EXCEL里需要设置这个吗?但是读取是正常的啊
      

  2.   


    ADOQuery1.Refresh; 
    改为:
    ADOQuery1.close;
    ADOQuery1.open;
      

  3.   

    另你的程序有BUG:edit5.Text:=OpenDialog2.FileName;{此句}
    {举例:第一次打开1.xls,edit5.Text自然等于1.xls,当你即时第二次要打开1.xls时可以防重复打开,但是如果先打开1.xls,再打开2.xls,再次打开1.xls,你就防不了}
      

  4.   

    还有别的方法吗?为什么ADOQuery1.Refresh不能用呢?是不是我少了什么条件?
      

  5.   

    1.ADO对象不能直接对EXCEL文件进行操作.(包括增删改),如果有操作,就要用OLE对象来完成.
    2.ADOQuery1在OPEN后,你Refresh来Refresh都是先前的SQL数据集,而再次CLOSE,OPEN就不同了.
      

  6.   

    为什么不利DTS将EXCEL文件直接导入到数据表中,再进行操作?而要执着于这样,导入数据表后,使用SQL语句操作数据方便得很,你现在用的方法真是食力不讨好!