现有一个Excel表,有固定的几个列,可能有几百行,现通过Delphi,需要按序取出一行的内容,把取到的值通过参数转的给Oracle中的存储过程,导入到Oracle中去。谁有最有效率的取Excel每行单元格的源程序呀

解决方案 »

  1.   

    既然是通过存储过程导入数据只能一行一行的读取数据在调用存储过程插入数据,最快的办法就是使用ado连接excel
      

  2.   

    使用SQL*Loader   
      这个是用的较多的方法,前提必须oracle数据中目的表已经存在。   
      大体步骤如下:   
      1   将excle文件另存为一个新文件比如文件名为text.txt,文件类型选文本文件(制表符分隔),这里选择类型为csv(逗号分隔)也行,但是在写后面的control.ctl时要将字段终止符改为','(fields   terminated   by   ','),假设保存到c盘根目录。   
      2   如果没有存在的表结构,则创建,假设表为test,有两列为dm,ms。   
      3   用记事本创建SQL*Loader控制文件,网上说的文件名后缀为ctl,其实我自己发现就用txt后缀也行。比如命名为control.ctl,内容如下:(--后面的为注释,实际不需要)   
        
        load   data               --控制文件标识   
        infile   'c:\text.txt'       --要输入的数据文件名为test.txt   
        append   into   table   test    --向表test中追加记录   
        fields   terminated   by   X'09'  --字段终止于X'09',是一个制表符(TAB)   
        (dm,ms)                                       --定义列对应顺序   
      备注:数据导入的方式上例中用的append,有一下几种:insert,为缺省方式,在数据装载开始时要求表为空;append,在表中追加新记录;replace,删除旧记录,替换成新装载的记录   
      ;truncate,同replace。   
      4   在命令行提示符下使用SQL*Loader命令实现数据的输入   
        
      sqlldr   userid=system/manager   control='c:\control.ctl'   
      

  3.   

    我是采用如下方式的:
    try
        //创建对象
        ExlApp := CreateOleObject( 'Excel.Application' );
      except
        MessageDlg('您的机器里未安装Microsoft Excel!', mtError, [mbOk], 0);
        exit;
      end;  //打开已存在的Excel文档
      ExlApp.WorkBooks.Open(self.OpenDialog1.FileName);
      ExlApp.Visible:=False;
      Screen.Cursor:=crSQLWait;
      for i:=2 to ExlApp.ActiveSheet.UsedRange.Rows.Count do
      begin
        //取出各个单元格,并对某些单元格进行判断
        str_xm:=ExlApp.Cells[i,1].Value;
        str_xb:=ExlApp.Cells[i,2].Value;
        str_sfzh:=ExlApp.Cells[i,3].Value;
        str_cbrq:=ExlApp.Cells[i,4].Value;
        str_rylb:=ExlApp.Cells[i,5].Value;
        str_dbzh:=ExlApp.Cells[i,6].Value;
        str_jtdz:=ExlApp.Cells[i,7].Value;
        str_jtdh:=ExlApp.Cells[i,8].Value;
        str_yhzh:=ExlApp.Cells[i,9].Value;
        str_hm:=ExlApp.Cells[i,10].Value;
        str_xyh:=ExlApp.Cells[i,11].Value;
        //判断身份证号的位数及校验的正确性
        iLen:=length(str_sfzh);
        if (iLen<>18) and (iLen<>15) then
        begin
          serrmsg:='该行身份证号位数不对,应为18位或15位!';
          //goto L1;
        end;
        if iLen=18 then        //18位校验位的判断
        begin
          if IDverify(sstr[0])=false then
           begin
             serrmsg:='该行证件号码校验出错!';
             //goto L1;
           end;
        end;
        if iLen=15 then    //15位自动转换为18位
        begin
          str_sfzh:=ID15to18(sstr[0]);
        end;
        //性别的判断(男或女或空)
        if (str_xb<>'男') and (str_xb<>'女') and (str_xb<>'') then
        begin
          serrmsg:='该行性别格式不对,应为男或女或为空!';
          //goto L1;
        end;
        //参保日期的判断
        if length(str_cbrq)<>6 then
        begin
          serrmsg:='该行参保日期位数不对,应为6位的yyyymm!';
          //goto L1;
        end;
        Stp_Jfjl.Close;
        Stp_Jfjl.StoredProcName:='JM_I_JFJL';
        Stp_Jfjl.Prepare ;
        Stp_Jfjl.ParamByName('p_fsdwybdm').AsString :=trim(EdtDwybdm.Text);
        Stp_Jfjl.ParamByName('p_fssfzh').AsString :=str_sfzh;
        Stp_Jfjl.ParamByName('p_fsxm').AsString :=str_xm;
        Stp_Jfjl.ParamByName('p_fsrylb').AsString :=str_rylb;
        Stp_Jfjl.ParamByName('p_fscbrq').AsString :=str_cbrq;
        //低保标志或残疾标志
        if copy(str_dbzh,1,1)='残' then
          Stp_Jfjl.ParamByName('p_fsdbbz').AsString :='2'
        else if copy(str_dbzh,1,1)='低' then
          Stp_Jfjl.ParamByName('p_fsdbbz').AsString :='1'
        else
          Stp_Jfjl.ParamByName('p_fsdbbz').AsString :='';
        Stp_Jfjl.ParamByName('p_fsdbzh').AsString :=copy(str_dbzh,2,length(str_dbzh)-1);
        Stp_Jfjl.ParamByName('p_fsjtdz').AsString :=str_jtdz;
        Stp_Jfjl.ParamByName('p_fsjtdh').AsString :=str_jtdh;
        if ChkMfq.Checked =True then
        begin
          Stp_Jfjl.ParamByName('p_fsmfqbz').AsString :='1';
          Stp_Jfjl.ParamByName('p_fsmfq').AsString :=trim(EdtMfq.Text);
        end
        else
        begin
          Stp_Jfjl.ParamByName('p_fsmfqbz').AsString :='0';
          Stp_Jfjl.ParamByName('p_fsmfq').AsString :='';
        end;
        Stp_Jfjl.ParamByName('p_fsczy').AsString :=czydm;
        if ChkDkbz.Checked =True then
          Stp_Jfjl.ParamByName('p_dkbz').AsString :='1'
        else
          Stp_Jfjl.ParamByName('p_dkbz').AsString :='0';
        if ChkXs.Checked =True then
          Stp_Jfjl.ParamByName('p_xsbz').AsString :='1'
        else
          Stp_Jfjl.ParamByName('p_xsbz').AsString :='0';    try
          Stp_Jfjl.ExecProc;
        except
           sErrMsg:='调用存储过程<JM_I_JFJL>出错!';
           InsertJfjl:=false;
           exit;
        END;
        if Stp_Jfjl.ParamByName('x_rc').AsString<>'0' then
        begin
          serrmsg:=Stp_Jfjl.ParamByName('x_message').AsString;
          InsertJfjl:=false;
          exit;
        end
        else
        begin
          InsertJfjl:=true;
        end;  end;不过导入成功和错误的信息暂时还未考虑好该怎么存储?   以前我导入txt文件时,存储在正确或错误文件中,我现在导入Excel文件,难道还是存储在txt文件吗?
      

  4.   

    请问,用Delphi通过Excel导入到Oralce,发生错误的日志大家一般如何保存呢?