我因为很长时间没有使用Delphi了,因此很基本的问题都已经不会了。我现在想允许用户把DBGrid中的内容使用Ctrl+C拷贝出来,然后Ctrl+V粘贴到Excel中,我不知道如何设置属性或使用何种代码来实现。

解决方案 »

  1.   

    你说的该不会是把整张DBGrid 的数据Copy出来再粘贴吧?
      

  2.   

    你单击选定这个单元格,是没办法ctrl+c 进行copy的,
    只有在编辑这个单元格的时候可以进行copy,你试一下就知。
    要想选中单元格就可以copy,在程序里代码控制,应该也是有办法的,
      

  3.   

    我是想把整张表的内容都要拷贝出来,而不是单个的单元格内容。
    请问:merkey2002(小样的),你能有什么样例代码吗?我现在有些黔驴技穷了。帮帮我吧!先谢谢了!
      

  4.   

    用数据倒出行不:
    procedure GenXlsFile(DBGrid: TDBGrid);
    //uses ComObj;
    var
      ExcelApp: Variant;
      i, j: integer;
      SaveDialog:TSaveDialog;
      strsavefile:string;
    begin
        SaveDialog:=TSaveDialog.Create(Nil);
         SaveDialog.Filter := 'Microsoft Excel 文件|*.xls|Microsoft Word 文件|*.doc';
         SaveDialog.Execute;
         //IntFileType:=SaveDialog.FilterIndex;
         StrSaveFile:=SaveDialog.FileName;
         if length(StrSaveFile)=0 then exit;
      try
        ExcelApp := CreateOleObject('Excel.Application');
      except
        application.MessageBox('系统中的MS Excel软件没有安装或安装不正确!', '错误', MB_ICONERROR + MB_OK);
        exit;
      end;
      ExcelApp.visible := true;
      try
        excelapp.caption := '应用程序调用 Microsoft Excel';
        ExcelApp.WorkBooks.Add;
        //写入标题行
        for i := 1 to DBGrid.Columns.Count do //sDataSet.Fields.Count do
        begin
          //if DBGrid.Columns[i - 1].Visible then
          ExcelApp.Cells[1, i].Value := (DBGrid.Columns[i - 1].Title.Caption);
        end;
        DBGrid.DataSource.DataSet.First;
        i := 2;
        while not DBGrid.DataSource.DataSet.Eof do
        begin
          for j := 0 to DBGrid.Columns.Count - 1 do //sDataSet.Fields.Count-1 do
          begin
              //if DBGrid.Columns[j].Visible then
            ExcelApp.Cells[i, j + 1].Value := DBGrid.DataSource.DataSet.FieldByName(DBGrid.Columns[j].FieldName).AsString; //sDataSet.Fields[j].AsString;
          end;
          DBGrid.DataSource.DataSet.Next;
          i := i + 1;
        end;
        DBGrid.DataSource.DataSet.First;
        if application.MessageBox('数据导出完成.确认保存吗?', '问题', MB_ICONQUESTION + MB_YESNO + MB_DEFBUTTON1 + MB_SYSTEMMODAL) = IDYES then
        begin
          if not ExcelApp.ActiveWorkBook.Saved then
            ExcelApp.ActiveWorkBook.SaveAs(strsavefile);
        end
        else begin
          ExcelApp.ActiveWorkBook.Saved := True; //不保存
        end;
      finally
        excelapp.quit; //退出EXCEL软件
      end;
    end;
      

  5.   

    直接形成一个Excel文件当然可以了,我准备试验一下楼上阁下的贵码!谢谢!
      

  6.   

    导出excel不难的界面放入
        ea1: TExcelApplication;
        ews1: TExcelWorksheet;
        ewb1: TExcelWorkbook;
    -----------
    代码procedure TForm1.Button2Click(Sender: TObject);
    var
      i,k:integer;
    begin
      ea1.Connect;     //打开excel。
      ea1.Visible[0] := True;     //可见
      ea1.Caption :='测试excel操作';
      ewb1.ConnectTo(ea1.Workbooks.Add(emptyparam,0)); // 新建xls文件
      ews1.ConnectTo(ewb1.Worksheets[1] as _worksheet); //连接工作页-第1个工作页
      ews1.Activate ; //将这个工作页设为当前工作页.  //加入列名
      for i:=0 to dbgrid1.Columns.Count-1 do
      begin
        ews1.Cells.Item[1,i+1]:=dbgrid1.Columns[i].Title.Caption ;
      end;  //载入数据
      adoquery1.Open ;
      adoquery1.First ;
      k:=2; //从第二行开始
      while not adoquery1.Eof do
      begin
        for i:=0 to dbgrid1.Columns.Count-1 do
        begin
          ews1.Cells.Item[k,i+1]:=adoquery1.FieldByName(dbgrid1.Columns[i].FieldName).AsString ;
        end;
        adoquery1.Next ;
        inc(k);
      end;  ews1.Columns.EntireColumn.AutoFit; //自动列宽
    end;