FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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. |
#2
|
|||
|
|||
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 ... |
#3
|
|||
|
|||
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? |
#4
|
|||
|
|||
Cita:
Para mas informacion podes echarle un vistazo a la type library del Microsoft Excel 8.0 |
#5
|
|||
|
|||
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. |
#6
|
||||
|
||||
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/ |
#7
|
|||
|
|||
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.
|
#8
|
||||
|
||||
Cita:
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!" http://www.purodelphi.com/ http://www.nosolodelphi.com/ |
#9
|
|||
|
|||
Cita:
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 |
#10
|
|||
|
|||
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 |
|
|
|