工序名 机型 项目名           参数值 工序名 机型 项目名 参数值
清花 A035E 电动机皮带轮  Φ135 梳棉 FA231C 号数 J14.6
清花 A035E 豪猪打手皮带轮内/外 Φ247mm 梳棉 FA231C 梳棉湿重 17.79 
清花 A035E 第二U形打手皮带轮  Φ160mm 梳棉 FA231C 回潮率 7.80 
清花 A035E 第一U形打手皮带轮  Φ190mm 梳棉 FA231C 梳棉干重 16.5
清花 A035E 梳棉帘电动机变换齿轮19T 梳棉 FA231C 公制号数 3581 
清花 A035E U1~尘棒进口   10mm 梳棉 FA231C 重量牵伸 116.7
                                              梳棉 FA231C 机械牵伸 120.2 
                                              梳棉 FA231C 棉条张力变轮Z5 20
以上是EXCEL中的表,将EXCEL导入界面后,显示也如上格式。数据库表里的字段是(工序名 机型 项目名           参数值),将八列保存到数据表中的四列中。代码如下:
procedure TfrmDaGongYiZhiZuo.cxButton2Click(Sender: TObject);
var
  i,j,k: Integer;
  a,b,c,d,e,f,g: string;
  adosave:TADOStoredProc;
begin
  adotable1.Active := true;
  if cxGrid1DBTableView1.ColumnCount < 1 then
  begin
  Application.MessageBox('无相关信息,数据库无更新!','提示',MB_ICONWARNING);
  exit;
  end;
  if qry.RecordCount < 1 then exit;
  k:=0;
  for j:=k to k+3 do
  begin
  for i := 0 to cxGrid1DBTableView1.datacontroller.RecordCount - 1 do    // Iterate  begin
   if    cxGrid1DBTableView1.DataController.Values[i,j]<>'' then
   begin
     adosave:=TADOStoredProc.Create(nil);
     adosave.Connection:=DMDATA.GongyiCon;
     adosave.ProcedureName:='MFCCS_P_工艺制作信息表保存';
     adosave.Parameters.Refresh;
     adosave.Parameters.ParamByName('@品种').Value:=Trim(cxMaskEdit2.Text);
     adosave.Parameters.ParamByName('@工序名').value:=cxGrid1DBTableView1.DataController.Values[i,j];
     adosave.Parameters.ParamByName('@机型').value:=cxGrid1DBTableView1.DataController.Values[i,j+1];
     adosave.Parameters.ParamByName('@项目名').value:=cxGrid1DBTableView1.DataController.Values[i,j+2];
     adosave.Parameters.ParamByName('@标准值').value:=cxGrid1DBTableView1.DataController.Values[i,j+3];
     adosave.Parameters.ParamByName('@版本号').value:=Trim(cxMaskEdit1.Text);
     adosave.Parameters.ParamByName('@创建时间').Value:=Trim(cxDateEdit2.Text);
     adosave.ExecProc;
   end
   else
      k:=K+4;  end;  end;
  showmessage('数据导入成功!');
  cxMaskEdit1.Clear;
  cxDateEdit2.Clear;
end;为什么有空格的情况下,不自动跳到第五列呢?K:=K+4不执行啊?

解决方案 »

  1.   

    for i := 0 to cxGrid1DBTableView1.datacontroller.RecordCount - 1 do    
    你没有跳出这个循环吧。
    改为这样
    else
    begin
      inc(k,4);
      break;
    end;
      

  2.   

    建议你到MSDN上查一下相关的文章,你这个有点乱,没有理好结构。
      

  3.   

    procedure TfrmDaGongYiZhiZuo.cxButton2Click(Sender: TObject); 
    var 
      i,j,k: Integer; 
      a,b,c,d,e,f,g: string; 
      adosave:TADOStoredProc; 
    begin 
      adotable1.Active := true; 
      if cxGrid1DBTableView1.ColumnCount < 1 then 
      begin 
      Application.MessageBox('无相关信息,数据库无更新!','提示',MB_ICONWARNING); 
      exit; 
      end; 
      if qry.RecordCount < 1 then exit; 
      k:=0; 
      for j:=k to k+3 do 
      begin 
      for i := 0 to cxGrid1DBTableView1.datacontroller.RecordCount - 1 do    // Iterate   begin 
      if    cxGrid1DBTableView1.DataController.Values[i,j] <>'' then 
      begin 
        adosave:=TADOStoredProc.Create(nil); 
        adosave.Connection:=DMDATA.GongyiCon; 
        adosave.ProcedureName:='MFCCS_P_工艺制作信息表保存'; 
        adosave.Parameters.Refresh; 
        adosave.Parameters.ParamByName('@品种').Value:=Trim(cxMaskEdit2.Text); 
        adosave.Parameters.ParamByName('@工序名').value:=cxGrid1DBTableView1.DataController.Values[i,j]; 
        adosave.Parameters.ParamByName('@机型').value:=cxGrid1DBTableView1.DataController.Values[i,j+1]; 
        adosave.Parameters.ParamByName('@项目名').value:=cxGrid1DBTableView1.DataController.Values[i,j+2]; 
        adosave.Parameters.ParamByName('@标准值').value:=cxGrid1DBTableView1.DataController.Values[i,j+3]; 
        adosave.Parameters.ParamByName('@版本号').value:=Trim(cxMaskEdit1.Text); 
        adosave.Parameters.ParamByName('@创建时间').Value:=Trim(cxDateEdit2.Text); 
        adosave.ExecProc; 
      end else begin
          k:=K+4; 
     end;   end; 
      showmessage('数据导入成功!'); 
      cxMaskEdit1.Clear; 
      cxDateEdit2.Clear; 
    end; cxGrid1DBTableView1.DataController.Values[i,j] <>'' then 问题在这行
    里面有东西不为空罗辑上没有问题,显示里面的是什么是空格还是回车换行什么的要不你转成字符或计算字符长度再跳转
      

  4.   

    if    cxGrid1DBTableView1.DataController.Values[i,j] <>'' then 改为if    trim(cxGrid1DBTableView1.DataController.Values[i,j]) <>'' then 
      

  5.   


    我自己已经解决这个问题了,代码如下:
    procedure TfrmDaGongYiZhiZuo.cxButton2Click(Sender: TObject);
    var
      i,j,k,s: Integer;
      adosave:TADOStoredProc;
      adodelete :TADOQuery;
    begin  adosave:=TADOStoredProc.Create(nil);
      adodelete:=TADOQuery.Create(nil);
      adotable1.Active := true;
      if cxGrid1DBTableView1.ColumnCount < 1 then
      begin
      Application.MessageBox('无相关信息,数据库无更新!','提示',MB_ICONWARNING);
      exit;
      end;
      if qry.RecordCount < 1 then exit;
      k:=0;
      for s:= 1 to 9 do
      begin
        for i := 0 to cxGrid1DBTableView1.DataController.RecordCount - 1 do    // 行数
        begin
          for j:=k to k do    //列数
           begin
              if cxGrid1DBTableView1.DataController.Values[i,j]<>'' then
               begin
               adosave.Connection:=DMDATA.GongyiCon;
               adosave.ProcedureName:='MFCCS_P_工艺制作信息表保存';
               adosave.Parameters.Refresh;
               adosave.Parameters.ParamByName('@品种').Value:=Trim(cxComboBox3.Text);
               adosave.Parameters.ParamByName('@工序名').Value:=cxGrid1DBTableView1.DataController.Values[i,j];
               adosave.Parameters.ParamByName('@机型').Value:=cxGrid1DBTableView1.DataController.Values[i,j+1];
               adosave.Parameters.ParamByName('@项目名').Value:=cxGrid1DBTableView1.DataController.Values[i,j+2];
               adosave.Parameters.ParamByName('@标准值').Value:=cxGrid1DBTableView1.DataController.Values[i,j+3];
               adosave.Parameters.ParamByName('@版本号').Value:=Trim(cxMaskEdit1.Text);
               adosave.Parameters.ParamByName('@创建时间').Value:=Trim(cxDateEdit2.Text);
               adosave.Parameters.ParamByName('@制作人').Value:=UserInfo.UserName;
               adosave.ExecProc;
               end;
           end;
        end;    adodelete.Connection:=DMDATA.GongyiCon;
        adodelete.Close;
        adodelete.SQL.Add('delete from T_工艺_大工艺制作 where 工序名 is null and 版本号='''+cxmaskedit1.text+'''');
        adodelete.ExecSQL;
        k:=K+4;
      end;
      showmessage('数据导入成功!');
      cxComboBox3.Clear;
      cxMaskEdit1.Clear;
      cxDateEdit2.Clear;end;
    注:导入转换行后,空格行要使用adodelete将空行删去,有没有更好的办法呢!我还有个问题就是:当此种EXCEL表导进CXGRID中,标准值列的数据有几个不能导进来,比如带%,如下:但另外有的是可以导进来的,有什么好办法吗?
    工序名4 机型4 项目名4 参数值4
    精梳 CJ60 锡林定位 34.5分度
    精梳 CJ60 钳板最前位置 20分度
    精梳 CJ60 梳理隔距 0.35mm
    精梳 CJ60 主牵伸区隔距 3.5mm
    精梳 CJ60 毛刷插入锡林深度 2.0mm
    精梳 CJ60 牵伸皮辊加压(bar) 3.5×5.5×4.5
    精梳 CJ60 集棉器 4mm
    精梳 CJ60 落棉率 15+1%
    从EXCEL导入到CXGRID代码如下:
    procedure TfrmDaGongYiZhiZuo.cxButton1Click(Sender: TObject);
    var
      stablename,sfilename : string;
      slist : Tstringlist  ;
    begin
     if cxDateEdit2.Text='' then
      begin
        ShowMessage('请选择创建日期!');
        Exit;
      end;
     if not(Opendlg.Execute) then exit;
      sfilename := Opendlg.FileName;    //表名
      adocon_excel1.Connected := false;
      adocon_excel1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source=' + sFileName+';Extended Properties="Excel 8.0;HDR=YES;IMEX=1";Persist Security Info=True ';
      adocon_excel1.Connected := true;        //连接
      slist := Tstringlist.Create;
      adocon_excel1.GetTableNames(slist);    //连接表名
      stablename := slist[0];
      If Pos('$', sTableName)>0 Then sTableName := '[' + sTableName + ']';   //定位表标签
      qry.Close;
      qry.SQL.Clear;
      qry.SQL.Text := 'select * from ' + stablename;
      qry.ExecSQL;
      qry.Open;
      cxGrid1DBTableView1.ClearItems;
      cxGrid1DBTableView1.DataController.CreateAllItems(true);
      cxGrid1DBTableView1.ApplyBestFit();
      BH;
      yanzheng;
    end;
      

  6.   


    学习吗?再说我确实是22岁的女程序员啦, 不过跟大师们比,差远啦,接触dephi七个月了
      

  7.   

    建议用OpenDataSource直接获得Excel的数据,然后再保存到数据库里去!
      

  8.   

    如excel文件的格式是固定的,建议把excel文件当做一个ADO表就好处理啦
      

  9.   

    給你一個DEMO,自己認真看看代碼:procedure TRES_DCC_ECRN_F.cxButton1Click(Sender: TObject);
    var
      ExcelApp,WorkBook:Olevariant;
      ExcelSheetCount,i,k:Integer;
    begin
      inherited;
      if RzButtonEdit1.Text <>'' then
      begin
        if (ExtractFileExt(RzButtonEdit1.Text)<>'.xls')   then
        begin
          MessageDlg('請選擇要導入的Excel檔案!',mtWarning,[mbOK],0);
          RzButtonEdit1.Clear;
        end
        else
        begin
          try
            Application.ProcessMessages;
            ExcelApp:=CreateOleObject('Excel.Application');
            WorkBook:=ExcelApp.WorkBooks.Open(RzButtonEdit1.Text);
            ExcelApp.Visible:=False;
            ExcelSheetCount:=WorkBook.WorkSheets.Count;
            for i:=1 to ExcelSheetCount  do
            begin
              Screen.Cursor:=crSQLWait;
              WorkBook.WorkSheets[i].Activate;
              a:=ExcelApp.Cells[4,2].Value;
              b:=ExcelApp.Cells[8,2].Value;
              c:=ExcelApp.Cells[14,2].Value;
              d:=ExcelApp.Cells[21,2].Value;
              e:=ExcelApp.Cells[22,2].Value;
              f:=ExcelApp.Cells[23,2].Value;
              if ((Copy(Trim(a),1,3)<>'ECR') and (b<>'')) and ((Copy(Trim(a),1,3)<>'DCR') and (b<>'')) then
              begin
                MessageDlg('檔案格式錯誤!',mtWarning,[mbOK],0);
                InsertErrorLOG;
                Screen.Cursor:=crDefault;
                Exit;
              end;          with adoq_ecrn do
              begin
                Close;
                SQL.Text:='select * from RES_ECR_TYPE where ECRNO='''+ a+'''';
                Open;
                if RecordCount=1 then
                begin
                  MessageDlg('請檢查:導入檔案時編號"'+ a+'"的記錄重復!',mtWarning,[mbOK],0);
                  InsertRepeatLOG;
                  Screen.Cursor:=crDefault;
                  Exit;
                end;
              end;           with adoq_ecrn do
               begin
                 Close;
                 SQL.Clear;
                 SQL.Add('insert into RES_ECR_TYPE(ECRNO,DESOFCHANGE,RELEASEDATE,RESPEOPLE,ISSUEDEPT,MODEL) values(:a,:b,:c,:d,:e,:f)');
                 Parameters.ParamByName('a').Value:=a;
                 Parameters.ParamByName('b').Value:=b;
                 Parameters.ParamByName('c').Value:=Trim(Copy(c,1,19));
                 Parameters.ParamByName('d').Value:=d;
                 Parameters.ParamByName('e').Value:=e;
                 Parameters.ParamByName('f').Value:=f;
                 ExecSQL;
               end;
               InsertECRLOG;           ProgressBar1.Min:=0;
               ProgressBar1.Max:=ExcelSheetCount;
               for k:=33 to WorkBook.WorkSheets[i].usedrange.rows.count  do
               begin
                 g:=ExcelApp.Cells[K,1].Value;
                 q:=ExcelApp.Cells[k,2].Value;
                 w:=ExcelApp.Cells[k,3].Value;
                 v:=ExcelApp.Cells[k,4].Value;
                 r:=ExcelApp.Cells[k,5].Value;
                 t:=ExcelApp.Cells[k,6].Value;
                 y:=ExcelApp.Cells[k,7].Value;
                 u:=ExcelApp.Cells[k,8].Value;
                 o:=ExcelApp.Cells[k,9].Value;
                 if (q<>'')and(w<>'') then
                 with adoq_item do
                 begin
                   Close;
                   SQL.Clear;
                   SQL.Add('insert into RES_ECR_ITEM(GROUPID,ECRNO,ITEMNO,ITEMDESPTION,FZRELATION,CHANGETYPE,BEFORECHANGE,AFTERCHANGE,PROPOSE,REMARK) values(:g,:p,:q,:w,:v,:r,:t,:y,:u,:o)');
                   Parameters.ParamByName('g').Value:=g;
                   Parameters.ParamByName('p').Value:=a;
                   Parameters.ParamByName('q').Value:=q;
                   Parameters.ParamByName('w').Value:=w;
                   Parameters.ParamByName('v').Value:=v;
                   Parameters.ParamByName('r').Value:=r;
                   Parameters.ParamByName('t').Value:=t;
                   Parameters.ParamByName('y').Value:=y;
                   Parameters.ParamByName('u').Value:=u;
                   Parameters.ParamByName('o').Value:=o;
                   ExecSQL;
                   ProgressBar1.Position:=ProgressBar1.Position+1;
                 end;
               end;
               Screen.Cursor:=crDefault;
               Application.ProcessMessages;
               ProgressBar1.Position:=0;
               RefreshECRN;
               RefreshGroupItem;
               SendToEmail;
               Zt:=1;
             end;
          finally
            ExcelApp.ActiveWorkBook.Saved:=True;
            WorkBook.Close;
            ExcelApp.Quit;
          end;
         end;
      end
      else
      begin
        MessageDlg('請選擇要導入的Excel檔案!',mtWarning,[mbOK],0);
        Exit;
      end;
    end;