PDA

Ver la Versión Completa : Exportar directo a excel


mikexxi2
29-11-2004, 17:59:05
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.;)

LordSigma
30-11-2004, 19:29:36
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 ...

Tecnic2
30-11-2004, 20:26:36
Hola,

Yo lo hice con el componente TExcelExport i tambien me funcionó.
Con tu método puedes darle formato a la hoja de excel?

LordSigma
30-11-2004, 20:53:51
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

mikexxi2
30-11-2004, 22:31:10
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.

jhonny
30-11-2004, 22:56:02
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.

mikexxi2
01-12-2004, 17:11:01
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.:)

jhonny
01-12-2004, 17:34:28
Gracias jhonny
De nada amigo, a quien realmente debes darle gracias es a delphi.com.ar, el fue quien creo esos excelentes componentes.

lroblesco
11-04-2005, 02:49:25
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.

lroblesco
12-04-2005, 04:56:26
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.

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;