delphi导入导出excel|oracle

1.导出用DBGrid直接到剪切板,然后粘贴到excle就ok了,有什么Excle的格式之类的可能要设置一下:

{
      1. StrTableName要查询的表名
      2。StrFieldsName查询表的字段名
      3。StrWhere查询条件
      4。StrOrder 查询排序次序
    }

procedure TFrmexportData.exportData(StrTableName:String;StrFieldsName:String='*';StrWhere:String='';StrOrder:String='');
var
  str:String;
  i:integer;
  excelapp,sheet:Variant;
  Col,Row:Integer;
   ADOConn: TADOConnection;
   ADOQueryExp: TADOQuery;
   DataSourceExp: TDataSource;
   DBGrid1: TsuiDBGrid;
begin
  try
  ADOConn:=TADOConnection.Create(nil);
  ADOQueryExp:=TADOQuery.Create(nil);
  DataSourceExp:= TDataSource.Create(nil);
  DBGrid1:= TsuiDBGrid.Create(nil);
  ADOConn.ConnectionString:='Provider=MSDAORA.1;Password=cdch0909;User ID=sa;Data Source=oracemcdch';
  ADOConn.LoginPrompt:=false;
  ADOConn.Connected:=true;
  ADOQueryExp.Connection:=ADOConn;
  DataSourceExp.DataSet:=ADOQueryExp;
  DBGrid1.DataSource:= DataSourceExp;
  with  ADOQueryExp do
  begin
     Close;
     SQL.Clear;
     SQL.Add('select '+StrFieldsName+' from '+StrTableName+' '+StrWhere+' '+StrOrder);
     Open;
     Row:=RecordCount; //记录条数
      if Row<=1 then
   begin
    showmessage('表中没有数据,不能导出');
    exit;
   end;
  end;
  //
  str:='';
  with DBGrid1 do
  begin
   DataSource.DataSet.DisableControls;
   Col:=DataSource.DataSet.FieldCount;
   for i:=0 to DataSource.DataSet.FieldCount-1 do
    str:=str+DataSource.DataSet.Fields[i].DisplayLabel+char(9);
   Str:=Str+#13;
   DataSource.DataSet.First;
   while not DataSource.DataSet.Eof do
   begin
    for i:=0 to DataSource.DataSet.FieldCount-1 do
      Str:=Str+DataSource.DataSet.Fields[i].AsString+char(9); //char(9)=tab格
    Str:=Str+#13; //回车  #9为tab,#13为回车,#10为换行
    DataSource.DataSet.Next;
    Application.ProcessMessages;
   end;  //end while
   DataSource.DataSet.EnableControls;
  end;
  ClipBoard.Clear;
  ClipBoard.Open;
  ClipBoard.AsText:=str;
  ClipBoard.Close;
  excelapp:=CreateOleObject('excel.application');
  excelapp.workbooks.add();
  excelapp.Caption:= TableName+'表数据导出';
  sheet:=excelapp.workbooks[1].worksheets[1];
  Sheet.name:=TableName+'表数据导出';

  for i:=1 to Col do
  begin
  sheet.Columns[i].numberformatlocal:='@';//excel的格式为文本
  end;
//   excelapp.activeSheet.Columns.ColumnsWith:=30;
     sheet.StandardWidth:=30;
  ShowMessage('共导出'+IntToStr(Row)+'条数据');
  sheet.paste;
  ClipBoard.Clear;
  excelapp.visible:=true;
  except
  on E:exception do
   begin
    showmessage(E.Message);
    //excelapp.Free;
   end;
  end;
  //ADOQueryExp.Close;
  //DBGrid1.Free;
  //DataSourceExp.Free;
  //ADOConn.Free;
end;

{====================================================}

2.导入可能就会有一点的慢了:

procedure TFrmexportData.ImportExcelToDB(ExceFileName:String);
var
  excelx,excely,excela,excelb,excelc,exceld:String; //字段名
  excele,excelf,excelg,excelh,exceli,excelj:String; //字段名
  ExcelApp,WorkBook:variant;
  sFileName:String;  //excel文件名
  i,ExcelRowCount,Row:Integer;
  ADOQuerySelectInsert:TADOQuery;
  ADOQueryUpdate:TADOQuery;
  ADOConnect:TADOConnection;
  FailNum:Integer;//导入失败的数据量
begin
  try
    Row:=0;
    FailNum:=0;
    //对象
    ADOQuerySelectInsert:=TADOQuery.Create(nil);
    ADOQueryUpdate:=TADOQuery.Create(nil);
    ADOConnect:=TADOConnection.Create(nil);
    ADOConnect.ConnectionString:='Provider=MSDAORA.1;Password=cdch0909;User ID=sa;Data Source=oracemcdch;Persist Security Info=True';
    ADOConnect.LoginPrompt:=false;
    ADOConnect.Connected:=true;
    ADOQuerySelectInsert.Connection:=ADOConnect;
    ADOQueryUpdate.Connection:= ADOConnect;

    sFileName:=ExceFileName;

    ExcelApp := CreateOleObject('Excel.Application');
    WorkBook:=ExcelApp.WorkBooks.Open(sFileName);
    ExcelApp.visible:=false;
    ExcelRowCount := WorkBook.WorkSheets[1].UsedRange.Rows.Count;
    //进度条
    ProgressBarImport.Position:=0;
   // ProgressBarImport.Step:=1;
    ProgressBarImport.Max:=ExcelRowCount;
    ProgressBarImport.Min:=0;
    //向oracle表写入数据
    for i:=1 to ExcelRowCount+1 do
    begin
     ProgressBarImport.StepIt; //进度条
     
     excelx:=Excelapp.cells[i,1].value;
     excely:=Excelapp.cells[i,2].value;
     excela:=Excelapp.cells[i,3].value;
     excelb:=Excelapp.cells[i,4].value;
     excelc:=Excelapp.cells[i,5].value;
     exceld:=Excelapp.cells[i,6].value;
     excele:=Excelapp.cells[i,7].value;
     excelf:=Excelapp.cells[i,8].value;
     excelg:=Excelapp.cells[i,9].value;
     excelh:=Excelapp.cells[i,10].value;
     exceli:=Excelapp.cells[i,11].value;
     excelj:=Excelapp.cells[i,12].value;
     if (excelx='') then
     exit
     else
      with ADOQuerySelectInsert do
        begin
         Close;
         SQL.Clear;
         SQL.Add('select * from cm_atm where atmno='''+excelx+''''); //excelx为关键字,不得有重复,若有重复,则该行的数据不导入
         Open;
        if Eof then  //插入数据
        begin
          Close;
          SQL.Clear;
          SQL.Add('insert into cm_atm(atmno,operid,savetm,optm,billstid,curstate,bankname,address,I_communityid,deptid,coor_x,coor_y)values(');
          SQL.Add(''''+excelx+''','''+excely+''','''+excela+''','''+excelb+''','''+excelc+''','''+exceld+''','''+excele+''','''+excelf+''',');
          SQL.Add(''''+excelg+''','''+excelh+''','''+exceli+''','''+excelj+''')');
          Row:=Row+1;
          ExecSQL;
        end
        else
          begin   //当查询出表中存在该记录时
          FailNum:=FailNum+1;
          {ADOQueryUpdate.Close;
          ADOQueryUpdate.SQL.Clear;
          ADOQueryUpdate.SQL.Add('update cm_atm set operid='''+excely+''',savetm='''+excela+''',optm='''+excelb+''',billstid='''+excelc+''',curstate='''+exceld+''',bankname='''+excele+''',address='''+excelf+''',I_communityid='''+excelg+''',deptid='''+excelh+''',coor_x='''+exceli+''',coor_y='''+excelj+''' where atmno='''+excelx+'''');
          ADOQueryUpdate.Open;
          ADOQueryUpdate.Close;
          ADOQueryUpdate.Free;  }
          end;
        end;
    end;
    finally
     ShowMessage('成功导入'+IntTostr(Row)+'条数据,修改'+IntTostr(FailNum)+'条数据');

     workBook.close;
     excelapp.quit;
     ExcelApp := Unassigned;
     WorkBook := Unassigned;
     end;


{=======================================================}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi导出Excel慢的原因有很多,如下所述: 1. 数据量大:如果导出的数据量非常庞大,那么导出时间就会较长。可以考虑对数据进行分页处理,每次只导出一页数据,以减少导出时间。 2. 导出文件格式:如果选择导出Excel格式为.xlsx,相对于.xls格式,导出速度会较慢。因为.xlsx格式的文件需要进行压缩和加密,所以处理的时间会更长。 3. 使用组件库:某些组件库的导出功能可能较慢。使用对Excel导出性能进行了优化的第三方组件库可能会提升导出速度。 4. 使用较低版本的Delphi:较低版本的Delphi可能对Excel导出性能没有做过多的优化,可以尝试使用较新版本的Delphi进行导出。 5. 数据处理方式:在导出数据之前,可能对数据进行了一些处理操作,如排序、过滤、格式转换等。这些处理操作也会增加导出的时间消耗。 为了解决这个问题,可以采取以下措施: 1. 优化查询:在导出Excel之前,可以对查询语句进行优化,使用合适的索引、减少不必要的列、使用合适的查询条件等,以提高查询速度。 2. 使用多线程:将导出Excel的操作放在一个独立的线程中进行,这样可以避免阻塞主线程,提高用户体验。 3. 数据分页处理:将数据分页导出,每次只导出一部分数据,以减少导出的时间和内存消耗。 4. 使用合适的Excel组件库:选择性能较好的第三方组件库,可以显著提升导出速度。 5. 使用合适的导出格式:如果导出速度较慢,可以尝试使用.xls格式而非.xlsx格式。 总体来说,通过优化查询、使用多线程、数据分页处理、选择合适的Excel组件库和导出格式,可以改善Delphi导出Excel慢的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值