起步软件技术论坛-X3

 找回密码
 立即注册
搜索
楼主: 刺青

【结贴】TExcelToTable导入问题

[复制链接]
 楼主| 发表于 2009-9-27 10:14:33 | 显示全部楼层
procedure CopyDataSet(T1, T2: TDataSet);
begin
  T1.DisableControls;
  try
    T1.First;
    while not T1.Eof do
    begin
      T2.Append;
      CopyRecord(T1, T2);
      T1.Next;
    end;
  finally
    T1.EnableControls;
  end;
end;

就是像用上面那样用就可以了吗?
这个DataSet.DisableControls是什么意思?这样子用有什么意义吗?
回复 支持 反对

使用道具 举报

发表于 2009-9-27 10:21:19 | 显示全部楼层
你把t1和t2的DisableControls EnableControls都设置一下

这个属性是当数据滚动的时候数据集相关的变现控件不跟随进行操作,可以提升数据集循环的效率
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-27 10:49:06 | 显示全部楼层
我的t1和t2分别是Query和ADOTable,我试过了加上DisableControls和EnableControls,要的时间是一样的。Query我只是导入数据用的而已,不用这个来显示的。ADOTable也是打开了之后导完数据就关了。

还有没有别的提高效率的办法?
回复 支持 反对

使用道具 举报

发表于 2009-9-27 11:09:21 | 显示全部楼层
除了循环我也想不出什么太好的方法了。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-28 09:29:10 | 显示全部楼层
现在还有一个问题,就是我用OpenDialog1打开文件之后,OpenDialog1的界面没释放完,就执行循环的语句了,怎么样让OpenDialog1的界面关闭后,再执行循环?
如图

aaaa1.gif

27.79 KB, 下载次数: 96

回复 支持 反对

使用道具 举报

发表于 2009-9-28 09:35:18 | 显示全部楼层
你把调用进度条的代码写到哪里了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-28 10:01:09 | 显示全部楼层
不是进度条的问题,没写进度条也是要循环结束了,opendialog的窗体才释放完,好像是卡才没释放完的。

procedure TFBDR.ToolButton6Click(Sender: TObject);
var
  EXURL,Woname : string;
  App,Exc,E1 : object;
  FApp,FDocs,Ac : system.DispatchHelper;
  i,j,k, RC : integer;   // k: 用于记录什么时候执行保存刷新 , RC: 用来记录一共有多少个字段
  IDParam : Business.Model.TBizParam;   //ID自动增长
  JDForm : TJDZT;    //进度状态
begin
  ADOTable1.Close;
  ADOConnection1.Close;
  if OpenDialog1.Execute then
  begin
    EXURL := opendialog1.FileName;       //文件路径

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~以下是直接操作Excel取得EXcel工作表的文件名~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    App := ComObj.CreateOleObject('Excel.Application');
    FApp := system.DispatchHelper.Create(App);
    FApp.PropertyPut('visible',[false]);
    Exc := FApp.PropertyGet('Workbooks',[]);
    FDocs := system.DispatchHelper.Create(Exc);
    FDocs.InvokeMethod('open',[EXURL]);
    //VBA原代码是 ActiveSheet.name
    E1 := Fapp.PropertyGet('ActiveSheet',[]);
    Ac := system.DispatchHelper.Create(E1);//属性和对象
    Woname := Ac.PropertyGet('name',[]).ToString;                      //取得工作表的名字
    FApp.InvokeMethod('quit', []);
    (E1 as System.IDisposable).Dispose;        //释放
    (App as System.IDisposable).Dispose;        //释放
    (Exc as System.IDisposable).Dispose;        //释放

    ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='''+EXURL+''';Extended Properties=''Excel 8.0'' ersist Security Info=False';
    ADOTable1.TableName := '['+Woname+'$]';
    ADOTable1.Open;

    Query2.Close;
    Query2.ConnectionString := 'DataBaseURL=Biz:\ZJGLXT\ZJSJK.Database';
    Query2.CommandText := 'SELECT *   FROM RZRKFB where 1 <> 1';
    Query2.Open;

    //业务参数: ID自动增长
    IDParam := SystemUtils.TContextUtils.GetParam(self.Context, 'Biz:\OPERATION\BFDNUMBERPARAMS.PARAMGROUP','ProductNo');
    JDForm := TJDZT.Create(self.Context);               //------------------进度条状态--------------------------------------------
    JDForm.ProgressBar1.Position := 1;
    JDForm.ProgressBar1.Max := ADOTable1.RecordCount;
    JDForm.Show;

    j:= 0;
    k:= 1;
    if ADOTable1.Fields.Count>30 then
      RC := 30
    else
      RC := ADOTable1.Fields.Count;
    ADOTable1.First;
    while not ADOTable1.Eof do
    begin
      j := j+1;
      Query2.Append;
      Query2.FieldByName['BH'].AsString := datasetBroker1.DataSet.FieldByName['BH'].AsString;
      Query2.FieldByName['ID'].AsString := variants.VarToStr(IDParam.Value);
      for i := 0 to RC-1 do     //RC字段数
      begin
        Query2.FieldByName['zdy'+sysUtils.IntToStr(i+1)].AsString := ADOTable1.Fields.AsString;
      end;
      JDForm.ProgressBar1.Position := JDForm.ProgressBar1.Position + 1;

      if j = k*1000 then  //每插入1000条记录,就保存刷新
      begin
        k := k + 1;
        Query2.ApplyUpdates;
        Query2.Refresh;
      end;
      ADOTable1.Next;
    end;

    JDForm.Close;
    JDForm.Free;
    Query2.ApplyUpdates;   //最后还要保存一次,因为不够1000条记录时没保存
    datasetBroker2.DataSet.Refresh;
    dataGrid2.ApplyBestFit(nil);
  end;
end;
回复 支持 反对

使用道具 举报

发表于 2009-9-28 10:26:02 | 显示全部楼层
if OpenDialog1.Execute then
点击打开按钮,对话框就会消失了呀,然后就开始执行begin里面的内容了。你在做个例子瞧瞧?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-28 11:05:48 | 显示全部楼层
if OpenDialog1.Execute then
begin
  dialogs.ShowMessage(opendialog1.FileName);   
   ..........
end;

如果如上面那样添加dialogs.ShowMessage(opendialog1.FileName);
OpenDialog窗体是关闭完成之后,show的窗体才出来。但我点了确认,show出来的窗体也没消失,进度条就出来了。进度条读完了,就和进度条一起消失了

aa2.gif

580.35 KB, 下载次数: 158

回复 支持 反对

使用道具 举报

发表于 2009-9-28 11:20:53 | 显示全部楼层
没有看到图片
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-15 23:25 , Processed in 0.045127 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表