Ir al contenido


Foto

Como copiar de un DBGrid (algunas filas o todas) y Pegar en Excel u otro


  • Por favor identifícate para responder
7 respuestas en este tema

#1 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 30 mayo 2009 - 01:02

Hola a todos
Pues eso, como copiar de un DBGrid (algunas filas o todas) y Pegar en Excel o en Word
Un usuario me pidio la posibilidad de poder copiar un conjunto de datos (de un DBGrid) y pegarlo en Excel para manipularlo a su gusto.
De que forma podria hacer esto?  *-)


  • 0

#2 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 30 mayo 2009 - 01:22

Los datos no salen del dbgrid, salen del Dataset asociado a este, yo utilizo la siguiente rutina para ese fin, seria cosa que lo adpataras.



delphi
  1. var
  2.   Hoja: OleVariant;
  3.   Excel: Variant;
  4.   fila, columna, Indice:Integer;
  5.   cCampos: String;
  6. begin
  7.   // Crea objeto Excel.
  8.  
  9.   try
  10.     Excel := CreateOleObject('Excel.Application');
  11.   except
  12.     showmessage('No se pudo crear el Objecto Excel.');
  13.     Exit;
  14.   end;
  15.  
  16.   if opendialogxls.Execute then
  17.     Excel.Workbooks.Open(opendialogxls.FileName); // Abre libro Excel
  18.   Hoja := Excel.Worksheets.Item['Hoja1']; // Abre Hoja 'Datos'.
  19.   Hoja.Activate;
  20.  
  21.   Fila := 2;
  22.  
  23.   sqDatos.DisableControls;
  24.   while not sqDatos.Eof Do
  25.   begin
  26.       for Columna := 1 to sqDatos.FieldDefs.Count do
  27.       begin
  28.         Excel.Cells[Fila,Columna].value := sqDatos.Fields[Columna - 1].AsString;
  29.       end;
  30.       Inc(Fila);
  31.       sqDatos.Next;
  32.   end;
  33.     sqDatos.EnableControls;
  34.     showmessage('REPORTE GENERADO!');
  35.  
  36.  
  37.   // Cierra archivo excel.
  38.   try
  39.   Excel.Quit;
  40.   except
  41.   ShowMessage('La aplicación Excel no se pudo finalizar automaticamente.');
  42.   Excel.Visible := True;
  43.   end;
  44. end;


  • 0

#3 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 30 mayo 2009 - 01:32

Si, esa parte de pasar del Dataset a Excel lo entiendo bien, el problema se me dificulta en como saber cuales filas del DBGrid seleccionó el usuario.
Para el caso de que sean todas, no hay problema, se resuelve con el codigo que me dices, pero en el caso de que sean solo algunas?  *-)

El usuario quiere:
1- Seleccionar varias filas del DBGrid
2- Opcion de Copiar
3- Pegar en Excel

Y ahi me enredé, como determinar cuales registros se corresponden con las filas seleccionadas  :(
  • 0

#4 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 30 mayo 2009 - 01:40

ahi si tendrias que extraer la informacion del dbgrid, ir fila por fila preguntando si esta seleccionada y de ser positivo pasarla a excel en fila y columna.

No tengo delphi a mano pero creo que la propiedad es "IsSelected"
  • 0

#5 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 30 mayo 2009 - 02:12

tampoco es cosa de enrrollarse, ya abri el delphi y vi como puede ser:



delphi
  1. var
  2.   Hoja: OleVariant;
  3.   Excel: Variant;
  4.   fila, columna, Indice:Integer;
  5.   cCampos: String;
  6. begin
  7. //Si no hay filas seleccionadas
  8. if DBGrid1.SelectedRows.Count=0 then
  9. begin
  10.     ShowMessage('Debe seleccionar las filas');
  11.     Exit;
  12. end;
  13. // Crea objeto Excel.
  14. try
  15.     Excel := CreateOleObject('Excel.Application');
  16. except
  17.     showmessage('No se pudo crear el Objecto Excel.');
  18.     Exit;
  19. end;
  20.  
  21. if opendialogxls.Execute then
  22.     Excel.Workbooks.Open(opendialogxls.FileName); // Abre libro Excel
  23. Hoja := Excel.Worksheets.Item['Hoja1']; // Abre Hoja 'Datos'.
  24. Hoja.Activate;
  25.  
  26. Fila := 1;
  27.  
  28. //Recorre las filas seleccionadas
  29. for Indice :=0 to DBGrid1.SelectedRows.Count-1 do
  30. begin
  31.     //Selecciona la fila indicada
  32.     GotoBookmark(pointer(DBGrid1.SelectedRows.Items[Indice]));
  33.     //Pasa los campos como columnas en excel
  34.     for Columna := 1 to DBGrid1.DataSource.DataSet.FieldDefs.Count do
  35.     begin
  36.         Excel.Cells[Fila,Columna].value := DBGrid1.DataSource.DataSet.Fields[Columna - 1].AsString;
  37.     end;
  38.     Inc(Fila);
  39. end;
  40.  
  41.   showmessage('REPORTE GENERADO!');
  42.  
  43.  
  44. // Cierra archivo excel.
  45. try
  46. Excel.Quit;
  47. except
  48. ShowMessage('La aplicación Excel no se pudo finalizar automaticamente.');
  49. Excel.Visible := True;
  50. end;
  51. end;



solo es cuestion de saber cual fila esta seleccionada y ubicar su respectivo registro en el dataset, recuerda seleccionar a True la opcion Multiselect del dbgrid.
  • 0

#6 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 30 mayo 2009 - 02:40

gracias eduarcol, lo probraré enseguida
  • 0

#7 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 30 mayo 2009 - 02:44

gracias eduarcol, lo probraré enseguida


cualquier duda recuerda que estaremos por aqui :D
  • 0

#8 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 01 junio 2009 - 07:01

De tanto buscar tambien encontré en las JEDI VCL, dos componentes para exportar a Excel, que talvez a alguien mas le pueda interesar

- JvDBGridExcelExport  Exporta el contenido de un DBGrid para Excel
- JvgExportExcel          Exporta el contenido de un Dataset para Excel

Son muy fáciles de usar

  • 0




IP.Board spam blocked by CleanTalk.