Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Servers
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-11-2004
mikexxi2 mikexxi2 is offline
Miembro
 
Registrado: nov 2004
Posts: 10
Poder: 0
mikexxi2 Va por buen camino
Exportar directo a excel

Buen dia. Necesito enviar informacion de una tabla de acces a excel, mediante delphi, he buscado en los hilos y la unica forma que encuentro es haciendolo registro por registro, esto es muy tardado.
En Visual Basic lo resolvi de la siguiente manera.

Dim wkbObj As Workbook ' Declara una variable de objeto.

Set wkbObj = GetObject("Paso.XLS")
With wkbObj.Worksheets("Hoja1").QueryTables.Add(Connection:=Array(Array( _
"ODBC;DSN=MS Access Database;DBQ=c:\paso.mdb;DefaultDir=c:\;DriverId=25;FIL=MS Access;MaxBuffe" _
), Array("rSize=2048;PageTimeout=5;")), Destination:=wkbObj.Worksheets("Hoja1").Range("A1"))
.CommandText = Array( _
"SELECT *" & Chr(13) & "" & Chr(10) & "FROM `c:\
, "\prueba`.tablaprueba tablaprueba")
.Name = "Consulta desde MS Access Database_1"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = True
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With

Como pueden ver esta sentencia pasa de una Base en acces prueba.mdb de una tabla TablaPrueba al archivo Paso.xls, lo hace de forma directa mediante una sentencia SQL con todos sus beneficios, como combinar tablas, condiciones Where, agrupar etc. Ademas es muy rapido, he pasado tablas de mas de 10 000 registros en cosa de segundos.
He intentado adaptar esta sentencia a delphi sin frutos.
Les agradeceria si me ayudan a adaptarla o usar un metodo distinto que haga algo parecido.
Gracias de antemano.
Responder Con Cita
  #2  
Antiguo 30-11-2004
LordSigma LordSigma is offline
Miembro
 
Registrado: nov 2004
Posts: 20
Poder: 0
LordSigma Va por buen camino
Mira, yo lo que hago es lo siguiente ... (sin usar componentes y MUY rapido)
Segui los pasos y vas a ver que es facil.
1- Agrega esto en los uses: ComObj

2- Defini dos variables variant con estos nombres en un procedimiento o como campos privados del form.

var Excel, Libro : Variant

3- Al momento de crear la planilla Excel (cuando haces click en un boton por ejemplo) ejecuta este codigo.

// Crea una aplicacion Excel.
Excel := CreateOleObject ('Excel.Application');
// La muestra (vas a ver un Excel como si lu ubieras ejecutado)
Excel.Visible := True;
// Agrega un libro.
Excel.WorkBooks.Add (-4167);
// Le asigna un nombre al libro
Excel.WorkBooks[1].WorkSheets[1].Name := 'Reporte';
// Hace un puntero al libro del Excel.
Libro := Excel.WorkBooks[1].WorkSheets['Reporte'];

4- Haces la consulta en tu base de datos (yo supongo que lo haces con un TQuery) a continuacion del codigo del punto 3.

Query.SQL.Add ('Consulta');
Query.Open;

while not Query.EOF do begin
Libro.Cells [1,1] := Query.FieldByName ('Campo1').AsString;
Libro.Cells [2,1] := Query.FieldByName ('Campo2').AsString;
// ... Asi por cada campo que queres pasar.
// Fijate que uso Libro.Cells [Col, Row] que escribe en cada celda del libro.
// Tambien podes hacer un FOR y acceder a las columnas de la consulta por
// numero y no por nombre para no tener que escribir cada campo.
end;

Query.Close;

Bueno, espero que te halla resultado, contame como te fue ...
__________________
Sistemas web
www.f5-sistemas.com.ar
Responder Con Cita
  #3  
Antiguo 30-11-2004
Tecnic2 Tecnic2 is offline
Miembro
 
Registrado: may 2004
Posts: 155
Poder: 20
Tecnic2 Va por buen camino
Post Yo lo hice con el TExcelExport

Hola,

Yo lo hice con el componente TExcelExport i tambien me funcionó.
Con tu método puedes darle formato a la hoja de excel?
Responder Con Cita
  #4  
Antiguo 30-11-2004
LordSigma LordSigma is offline
Miembro
 
Registrado: nov 2004
Posts: 20
Poder: 0
LordSigma Va por buen camino
Cita:
Empezado por Tecnic2
Hola,

Yo lo hice con el componente TExcelExport i tambien me funcionó.
Con tu método puedes darle formato a la hoja de excel?
Si, se pueden utilizar metodos y propiedades del puntero al libro para hacer lo mismo que harias con el Excel a mano.
Para mas informacion podes echarle un vistazo a la type library del Microsoft Excel 8.0
__________________
Sistemas web
www.f5-sistemas.com.ar
Responder Con Cita
  #5  
Antiguo 30-11-2004
mikexxi2 mikexxi2 is offline
Miembro
 
Registrado: nov 2004
Posts: 10
Poder: 0
mikexxi2 Va por buen camino
Gracias

Muchas gracias por contestar. Les comentaba que ya he usado los metodos que me dicen, de las dos formas, usando SERVERS y a mano, o malo es que el paso de los datos es uno por uno, eso lo hace muy tardado (Hasta 10 minutos), y como yo no voy a ser el usuario final, necesito que lo haga rapido.
Les comentaba que lo he hecho en VB, como les indicaba en el codigo
Dim wkbObj As Workbook ' Declara una variable de objeto.

Set wkbObj = GetObject("Paso.XLS")
With wkbObj.Worksheets("Hoja1").QueryTables.Add(Connection:=Array(Array( _
"ODBC;DSN=MS Access Database;DBQ=c:\paso.mdb;DefaultDir=c:\;DriverId=25;FIL=MS Access;MaxBuffe" _
), Array("rSize=2048;PageTimeout=5;")), Destination:=wkbObj.Worksheets("Hoja1").Range("A1"))
.CommandText = Array( _
"SELECT *" & Chr(13) & "" & Chr(10) & "FROM `c:\
, "\prueba`.tablaprueba tablaprueba")
.Name = "Consulta desde MS Access Database_1"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = True
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With


Mi pregunta o solicitud de ayuda es qi alguien me puede ayudar a traducir o convertir este codigo a Delphi, lo que quiero es hacerlo de forma directa, o que de plano me digan si no hay forma.
Muchas gracias.
Responder Con Cita
  #6  
Antiguo 30-11-2004
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Y si te descargas el FireSoft ExportSuite que creo delphi.com.ar y que de hecho la tiene alojada en la pagina www.delphi.com.ar con ayuda y todo.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #7  
Antiguo 01-12-2004
mikexxi2 mikexxi2 is offline
Miembro
 
Registrado: nov 2004
Posts: 10
Poder: 0
mikexxi2 Va por buen camino
Gracias jhonny he usado los componentes, y me ha ido perfecto, solo una duda mas, he usado los componentes ADO para conectarme con ACCES, pero mi aplicacion es CLX asi que no me aparecen, que componentes o forma de conexion me recomiendan.
Responder Con Cita
  #8  
Antiguo 01-12-2004
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por mikexxi2
Gracias jhonny
De nada amigo, a quien realmente debes darle gracias es a delphi.com.ar, el fue quien creo esos excelentes componentes.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #9  
Antiguo 11-04-2005
lroblesco lroblesco is offline
Miembro
 
Registrado: ene 2005
Ubicación: Baja California Sur, Mexico
Posts: 77
Poder: 20
lroblesco Va por buen camino
Question

Cita:
Empezado por LordSigma
Mira, yo lo que hago es lo siguiente ... (sin usar componentes y MUY rapido)
Segui los pasos y vas a ver que es facil.
1- Agrega esto en los uses: ComObj

2- Defini dos variables variant con estos nombres en un procedimiento o como campos privados del form.

var Excel, Libro : Variant

3- Al momento de crear la planilla Excel (cuando haces click en un boton por ejemplo) ejecuta este codigo.

// Crea una aplicacion Excel.
Excel := CreateOleObject ('Excel.Application');
// La muestra (vas a ver un Excel como si lu ubieras ejecutado)
Excel.Visible := True;
// Agrega un libro.
Excel.WorkBooks.Add (-4167);
// Le asigna un nombre al libro
Excel.WorkBooks[1].WorkSheets[1].Name := 'Reporte';
// Hace un puntero al libro del Excel.
Libro := Excel.WorkBooks[1].WorkSheets['Reporte'];

4- Haces la consulta en tu base de datos (yo supongo que lo haces con un TQuery) a continuacion del codigo del punto 3.

Query.SQL.Add ('Consulta');
Query.Open;

while not Query.EOF do begin
Libro.Cells [1,1] := Query.FieldByName ('Campo1').AsString;
Libro.Cells [2,1] := Query.FieldByName ('Campo2').AsString;
// ... Asi por cada campo que queres pasar.
// Fijate que uso Libro.Cells [Col, Row] que escribe en cada celda del libro.
// Tambien podes hacer un FOR y acceder a las columnas de la consulta por
// numero y no por nombre para no tener que escribir cada campo.
end;

Query.Close;

Bueno, espero que te halla resultado, contame como te fue ...
Este codigo exporta muy bien. Lo he probado. Solo que necesito saber como guardar ese libro de Excel de manera transparente para el usuario. El nombre del archivo, para mi caso es la fecha del sistema. He probado con Excel.save('nombre_archivo);
pero termina saliendo el dialogo de guardar. Como puedo solucionar esto? gracias por su ayuda.
__________________
No siempre el mas veloz es el que gana la carrera
Responder Con Cita
  #10  
Antiguo 12-04-2005
lroblesco lroblesco is offline
Miembro
 
Registrado: ene 2005
Ubicación: Baja California Sur, Mexico
Posts: 77
Poder: 20
lroblesco Va por buen camino
Exportar a Excel

Hace unos dias pregunte como exportar un stringrid a excel. Encontre un codigo aqui en el foro donde pasa de un ListView a xls, yo lo adapte para mis necesidades. Lo pongo por si otro tiene una problematica similar.
Ojo. Se necesita tener instalado excel.
Código:
 procedure TForm1.Button1Click(Sender: TObject);
 var
   Excel,xlw : Variant;
   fichero : String;
   i,j : integer;
   creado:boolean;
   MisDoc,XLSFILE:string;
 
 begin
 for i:=0 to grid.rowcount do
   for j:=0 to grid.ColCount do
 	grid.Cells[j,i]:=inttostr(i);
  creado:=false;
   try
 	begin
 	 Excel := CreateOLEObject('Excel.Application');
 	 //	Excel.WorkBooks.Add;
 	 xlw:=Excel.WorkBooks.add;
 	  creado:=true;
 	 end;
   except
 	begin
 	 Excel.Quit;
 	  raise;
 	 end;
 end;  //fin try
 
 	//***** RECORREMOS EL LISTVIEW E INSERTAMOS LOS DATOS EN EL OBJETO EXCEL *****//
    try
 	 for i:=0 to grid.rowcount-1 do
 	   for j:=0 to grid.ColCount-1 do
 		 Excel.Cells[i+1,j+1].Value:=grid.Cells[j,i];
    except
 	begin
 	   Excel.Quit;
 	   creado:=false;
 		raise;
 	 end;
    end;//end try
 
 	//***** GUARDAMOS EL OBJETO EXCEL *****//
  if (creado = true) then
   begin
 	TRY
 	 //xlw.SaveAs(FileName:=XLSFILE, Password := '');
 	 xlw.SaveAs('c:\hola.xls', Password := '');
 	  FINALLY
 		Excel.Quit;
 	end;  //fin try
    end
 	else
 	  Excel.Quit;
 
 
 
 
 end;
__________________
No siempre el mas veloz es el que gana la carrera
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 14:52:18.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi