如何实现DELPHI中EXCEL整行或整列赋值
我给EXCEL添加数据的时候一个一个单元格赋值太慢了
求教大虾 最好有代码

解决方案 »

  1.   

    建议去看一下Excel的VBA资料,应该比较简单
      

  2.   

    在excel里录制宏,执行类似操作,看看生成的vba代码
      

  3.   

    // 这个是我自己写的,不知道是否适合你,如果不适合,你可以自己修改一下:
    // 代码入下:
    // 说明:这个是调试过的,是可以使用的
          参数:
             RptTitle :导出报表的标题;Grid: 要导出的Dbgrid(如果是dataset你可以自己修改一下)function DBGridToExcel(RptTitle:String;Grid: TDBGridEh): Integer;
      var
      i,j,k:integer;
      ColTitle,FieldData,Msg :string;
      StrList :Tstringlist;
      SaveDlg: TSaveDialog;
    begin
        SaveDlg := TSaveDialog.Create(nil);
        StrList:=TStringList.Create;
      try
        //初始化
        Result :=-1;
        if Grid.DataSource = nil then Exit;
        if Grid.DataSource.DataSet = nil then Exit;
        if not Grid.DataSource.DataSet.Active then Exit;
        if Grid.DataSource.DataSet.IsEmpty then Exit;
        SaveDlg.Filter := 'Excel文档|*.xls';
        if not SaveDlg.Execute then Exit;
        FieldData := '';
        ColTitle  := '';
        //加入报表名称
        StrList.add(RptTitle);
        //加入字段名(列标题首先须改为汉字)
        for k :=0 to (Grid.FieldCount-1) do
        begin
          if not Grid.Columns[k].Visible then
            continue
          else
            ColTitle :=ColTitle+(Grid.Columns[k].Title.Caption)+#9;
        end;
        StrList.add(ColTitle);
        //加入数据
        with Grid.DataSource.DataSet do
        begin
            DisableControls;
            First;
            for j:=0 to (RecordCount-1) do
            begin
              FieldData:='';
              for i:=0 to (Grid.FieldCount-1) do
              begin
                if not Grid.Columns[i].Visible then
                  continue
                else
                  FieldData:=FieldData+(Grid.DataSource.DataSet.FieldByName(Grid.Columns[i].FieldName).AsString)+#9;
              end;
              StrList.add(FieldData);
              Next;
            end;
            First;
            EnableControls;
        end;
        //文件覆盖提示
        if FileExists(SaveDlg.FileName+'.xls') then
        begin
          Msg := '已存在文件(' + SaveDlg.FileName + '),是否覆盖?';
          if ShowAsk(PChar(Msg)) then
          begin
            //删除文件
            DeleteFile(SaveDlg.FileName)
          end
          else
            exit;
        end;
        //保存文件
        StrList.savetofile(SaveDlg.FileName+'.xls');
        Result := Grid.DataSource.DataSet.RecordCount; //返回记录数
      finally
        SaveDlg.Free;
        StrList.Free;
      end;
    end;如果有什么问题,继续切磋!