Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Servers
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-05-2003
Avatar de Combat-F2D
Combat-F2D Combat-F2D is offline
Miembro
 
Registrado: may 2003
Ubicación: Toletum
Posts: 454
Poder: 22
Combat-F2D Va por buen camino
Como se crea un fichero XLS desde Delphi y paleta Servers

Me gustaría saber si existe posiblidad de generar directamente mediante codigo Delphi un fichero XLS de Excel
__________________
online
Responder Con Cita
  #2  
Antiguo 22-05-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.954
Poder: 27
delphi.com.ar Va camino a la fama
Si no querés que Delphi inicie Excel para generar un archivo, porque no sabés si en las máquinas donde vas a instalar tu aplicación tienen Excel o tienen otra versión, te recomiendo utilizar unos componentes que yo hice, los podes bajar de delphi.com.ar.
La ventaja de estos componentes es que no importa si el cliente tiene instalado Excel o su versión, y además son mucho mas veloces.
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 22-05-2003
FRANKER FRANKER is offline
Miembro
 
Registrado: may 2003
Ubicación: Elche
Posts: 71
Poder: 22
FRANKER Va por buen camino
Hola!

Te pongo un ejemplillo rápido de como accedo a excel. Como muy bien comenta delphi.com.ar, para que funcione correctamente tienes que tener instalado el Excel...

Código:
Uses
  ... Excel97, ComObj...;
...
Var
  Excel : Variant;
  Archivo : String;
...
//***** Creamos el Objeto Ole *****//
try
  Excel := CreateOleObject('Excel.Application');
except
  Excel.Quit;
  showmessage('No se pudo crear el Objecto Excel.');
  raise;
end;

//***** Asignamos el archivo a abrir *****//
Archivo := 'c:\Hola.xls'
Excel.Workbooks.Open(Archivo);
...
Una vez creado el Excel Solamente te queda acceder a sus Celdas...

Código:
Excel.Cells[1,1].Value;
Y para terminar es muy importante que cierres el Excel, pues sino se quedará en memoria...

Código:
//***** IMPORTANTÍSIMO *****//
Excel.quit
espero servirte de ayuda.

Saludos y Suerte!!!
__________________
.:.::FRANKER::.:.
Responder Con Cita
  #4  
Antiguo 22-05-2003
Avatar de Combat-F2D
Combat-F2D Combat-F2D is offline
Miembro
 
Registrado: may 2003
Ubicación: Toletum
Posts: 454
Poder: 22
Combat-F2D Va por buen camino
agradezco vuestra ayuda, pero todavía no me queda claro si puedo crea o generar el XLS desde cero, algo asi como:



Excel.aplication.createfile('C:\miFicheroExcel.xls');

// seguramente sea una burrada

Gracias de nuevo
__________________
online
Responder Con Cita
  #5  
Antiguo 05-06-2003
Anabel Anabel is offline
Miembro
 
Registrado: may 2003
Ubicación: D.F. México
Posts: 63
Poder: 22
Anabel Va por buen camino
Hola

quizas el siguiente ejemplo te pueda ayudar, es utililizando el componente TExcelAplication, del palette Servers.

Receta:

Ingredientes en delphi:
1)TForm of course
2)TQuery
3)SaveDialog
5)TExcelapplication
6)bitButton
7)dbGrid


procedure TForm1.bbtnExportToExcelClick(Sender: TObject);
var
LineNumber, LCID : Integer;
LineString : string;
begin
with SaveDialog1 do
begin
FileName :='';
Filter:= 'Excel files|*.XLS;All Files|*.*';
DefaultExt := 'XLS';
Title := 'Exporting to Excel';
if execute then
begin
query1.Open;
LCID := GetUserDefaultLCID;
with ExcelApplication1 do
begin
connect;
try
visible[LCID] := true;
Workbooks.Add(EmptyParam,LCID);

//Paso 1
Range['A1','J1'].Value := VarArrayOf(['Order No',
'Cust No','Sale Date','Emp No',
'Ship Via', 'Terms','Items Total',
'Tax Rate','Freight','Amount Paid']);

//Paso2 Se definen formato de celdas (alineacion de texto, margenes, fuente, etc.)
with Range['A1','J1']do
begin
HorizontalAlignment := xlcenter;
VerticalAlignment := xlBottom;
Wraptext := false;
Orientation := 0;
ShrinkTofit := false;
MergeCells := false;
Font.Bold := true;
end;

Query1.First;
LineNumber := 1;

//Paso 3, comenzamos a enviar datos a Excel
While not query1.Eof do
begin
Inc(lineNumber);
LineString := IntToStr(LineNumber);
Range['A'+LineString, 'J'+LineString].Value :=
VarArrayof([Query1OrderNo.value, Query1CustNo.Value,

//Paso 4
FormatDateTime('d-mmm-yy',Query1SaleDate.Value),
Query1EmpNo.Value, Query1ShipVIA.Value,
Query1Terms.Value, Query1ItemsTotal.Value,
Query1TaxRate.Value, Query1Freight.Value,
Query1AmountPaid.Value]);
Query1.Next;
end;

//Paso 5
Range['H2','G'+LineString].NumberFormat := '0.00%';
Range['G2','G'+LineString].NumberFormat := '$#,##0.00';
Range['I2','I'+LineString].NumberFormat := '$#,##0.00';
Range['J2','J'+LineString].NumberFormat := '$#,##0.00';
Range['A1','J'+LineString].AutoFormat(xlRangeAutoFormatlist1, true,
true,true,true,true,true);
Range['A1','J'+LineString].Columns.AutoFit;

ActiveWorkbook.SaveAs(FileName,xlNormal, '', '', false, false,
xlNochange,xlUserResolution,False,EmptyParam,EmptyParam,
LCID);
Quit;
finally
disconnect;
end; //try
end; //with Excelapplication1
end; //if execute
end; //with Savedialog1

end;


Tip adiconal

Range("A1").Select
ActiveCell.FormulaR1C1 = "Order No"

Es equivalente en Delphi a:


Range['A1','A1'].select;
ActiveCell.FormulaR1Ci := 'Order No';

Siempre es mejor utilizar arreglos para insertar en Excel datos por renglon, que celda por celda

Range['A1','J1'].Value := VarArrayOf(['Order No',
'Cust No','Sale Date','Emp No',
'Ship Via', 'Terms','Items Total',
'Tax Rate','Freight','Amount Paid']);

Saludos!!

Pd. Espero te sirva de algo
__________________
Ana
Responder Con Cita
  #6  
Antiguo 06-06-2003
Avatar de Combat-F2D
Combat-F2D Combat-F2D is offline
Miembro
 
Registrado: may 2003
Ubicación: Toletum
Posts: 454
Poder: 22
Combat-F2D Va por buen camino
la verdad es que habia solucionado el problema con un componente que pille por internet, en torry.net, creo, que admas pasa a texto delimitado, dbf o algo asi;

no obstante siempre fui poco partidario se usar componentes ajenos a los standar de la paleta ( a excepcion de RX claro)

con un poco de tiempo probaré de muy buena gana ese magnifico codigo.

por supuesto, muchas gracias ana
__________________
online
Responder Con Cita
  #7  
Antiguo 26-03-2004
Avatar de JamesBond_Mx
JamesBond_Mx JamesBond_Mx is offline
Miembro
 
Registrado: jul 2003
Ubicación: Poza Rica, Veracruz, México
Posts: 81
Poder: 22
JamesBond_Mx Va por buen camino
Este ejemplo esta muy interesante y completo, pero para crear un nuevo archivo de excel, pero ahora supongamos yo tengo ya una plantilla que se llama Plantilla.XLT, y ahi es donde yo quiero depositar mis datos, ¿como le indico que abra la plantilla para que trabaje con ella?
Responder Con Cita
  #8  
Antiguo 26-03-2004
Avatar de JamesBond_Mx
JamesBond_Mx JamesBond_Mx is offline
Miembro
 
Registrado: jul 2003
Ubicación: Poza Rica, Veracruz, México
Posts: 81
Poder: 22
JamesBond_Mx Va por buen camino
Y en que momento estas declarando Range??? no lo veo?? o como lo declaras???
Responder Con Cita
  #9  
Antiguo 26-03-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Anabel
Siempre es mejor utilizar arreglos para insertar en Excel datos por renglon, que celda por celda
¡Excelente! No conocía esta posibilidad.

// Saludos
Responder Con Cita
  #10  
Antiguo 27-03-2004
Anabel Anabel is offline
Miembro
 
Registrado: may 2003
Ubicación: D.F. México
Posts: 63
Poder: 22
Anabel Va por buen camino
Thumbs up

Hola

Para enviar información a una plantilla ya creada de Excel, utiliza la sugerencia que te da delphi.com.ar

"Uses
... Excel97, ComObj...;
...
Var
Excel : Variant;
Archivo : String;
...
//***** Creamos el Objeto Ole *****//
try
Excel := CreateOleObject('Excel.Application');
except
Excel.Quit;
showmessage('No se pudo crear el Objecto Excel.');
raise;
end;

//***** Asignamos el archivo a abrir *****//
Archivo := 'c:\Hola.xls'
Excel.Workbooks.Open(Archivo);
..."

Si observas, para el ejemplo anterior es necesario que ya exista el fichero y en el posiblemente una plantilla en la cual deseas caiga la información.

Cómo enviar la información?

ExcelWorkSheet1.Workbooks.Open(Archivo);

ExcelWorkSheet1.Range['A1','K90'].Font.Size := 8;
ExcelWorkSheet1.Range['A1','K90'].Font.Bold := False;
ExcelWorkSheet1.Range['A1','K90'].Font.Name := 'Arial';

ExcelWorkSheet1.Cells[3,3].Font.Bold:=true;
ExcelWorkSheet1.Cells[3,3].Font.Size := 10;
ExcelWorkSheet1.Cells[3,3].Font.Underline := 2;
ExcelWorkSheet1.Cells[3,3].Value := 'Análisis de Presupuesto';
ExcelWorkSheet1.Cells[7,6].Value := 'Tipo de Proyecto:';
ExcelWorkSheet1.Cells[7,6].Range['C13','I13'].Value := VarArrayOf(['Clave','Elemento','Sección','Cantidad','Longitud','Precio','Importe']);

Primero especificas el número de hoja, después el 'Range[]' o 'Cells[]', en el ejemplo de arriba vienen algunas líneas también para dar formato a las celdas que quiza no utilices porque tu plantilla ya existe, pero no esta de mas saberlas.

Espero te ayude an algo lo anterior

Saludos
Belén

Nota: Alguien podría decirme como le hacen para citar lo que otro integrante comento. Gracias!!
__________________
Ana
Responder Con Cita
  #11  
Antiguo 27-03-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Tambioén puedn crear un nuevo libro a partir de una plantilla .xlt así:

Código:
var
  Libro: _WORKBOOK;
  Hoja: _WORKSHEET;

begin
  Libro := Excel.Workbooks.Add('Plantilla.xlt', 0);
  Hoja  := Libro.Sheets[1] as _WORKSHEET;
end;
Recuerden que las plantillas (archivos .xlt) normalmente no son para llenar sino para crear libros a partir de ellas. Los nuevos libros heredan el formato y/o datos que ya contenga la plantilla.

// Saludos
Responder Con Cita
  #12  
Antiguo 27-03-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Anabel
Nota: Alguien podría decirme como le hacen para citar lo que otro integrante comento. Gracias!!
¿Algo como esto?

Al momento de contestar el mensaje en lugar de oprimir "Responder" oprime "Citar" o usa directamente la etiqueta quote, por ejemplo, la cita de arriba se pone con:

[ QUOTE=Anabel ]Nota: Alguien podría decirme como le hacen para citar lo que otro integrante comento. Gracias!![ /QUOTE ]

sin los espacios al interior de [].

// Saludos
Responder Con Cita
  #13  
Antiguo 27-03-2004
atirado atirado is offline
Miembro
 
Registrado: mar 2004
Posts: 41
Poder: 0
atirado Va por buen camino
Red face

Veo que ya se ha tratado el cómo crear un NUEVO archivo hacia Excel, sin embargo, lo que yo necesito es hacer una comparación de un archivo XLS vs. un archivo DBF.
Para ello necesito leer, obviamente, ambos, por lo que mi pregunta sería ¿cómo traer datos de excel hacia Delphi?
Agradezco de antemano su ayuda
Responder Con Cita
  #14  
Antiguo 28-03-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por atirado
Para ello necesito leer, obviamente, ambos, por lo que mi pregunta sería ¿cómo traer datos de excel hacia Delphi?
Esto ya también se ha tratado. Una opción es usar ADO. En este hilo puedes encontrar una manera de leer datos de Excel con ADO.

// Saludos
Responder Con Cita
  #15  
Antiguo 29-03-2004
atirado atirado is offline
Miembro
 
Registrado: mar 2004
Posts: 41
Poder: 0
atirado Va por buen camino
Thumbs up

Hola, Román! Muchas gracias por el tip! lo intentaré y te comento si es que me funciona

Sinceramente no había encontrado nada sobre el tema la primera vez que busqué, por lo que creo que tendré qué aprender a buscar mejor
Espero me tengan paciencia porque soy nuevo en esto de Delphi, jejeje

Un saludo desde México a tod@s
Responder Con Cita
  #16  
Antiguo 29-03-2004
atirado atirado is offline
Miembro
 
Registrado: mar 2004
Posts: 41
Poder: 0
atirado Va por buen camino
Unhappy

Hola de nuevo, Román! Desafortunadamente, no me funcionó asi como lo mencionaste a Darkside , pues me envia un mensaje que no se puede conectar porque XLS no es un formato de base de datos correcto.
Si sabes algo de eso, agradeceré tu ayuda nuevamente.

Un saludo enorme
Alejandro
Responder Con Cita
  #17  
Antiguo 26-04-2004
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 22
sitrico Va por buen camino
Bueno, no se si seguir el hilo pero con todo lo aqui dicho me parecio correcto continuar aqui. mi pregunta es:

¿ como incluyo formulas en las hojas excel creadas por este método ?

logré incluir una formula poniendo un campo String con el contenido

t.FieldByName(Cmp[ni]).AsString := '=H##-G##';
t.FieldByName(Cmp[nj]).AsString := '=H##*F##';

Pero ¿Como se usan las funciones de Excel?

=Suma() -> =Sum() este funciona con SUM
=SI()
= Entero()
__________________
Sitrico
Responder Con Cita
  #18  
Antiguo 26-04-2004
Avatar de JamesBond_Mx
JamesBond_Mx JamesBond_Mx is offline
Miembro
 
Registrado: jul 2003
Ubicación: Poza Rica, Veracruz, México
Posts: 81
Poder: 22
JamesBond_Mx Va por buen camino
Pues mira, lo que yo hago es, crear primero la plantilla en Excel, la cual contendra, ya un formato predeterminado de fuentes, bordes, colores etc. y si deseo incluir alguna formula, en la misma plantilla la coloco donde desee que se aplique esta formula, al pasar los datos, en lugar de crear el archivo, llamo a la platilla y ahí vacio mis datos, y como caen a un formato predeterminado, todo es respetado, tanto formatos de texto, bordes etc. y las formulas funcionan muy bien.

Me expliqué???
Responder Con Cita
  #19  
Antiguo 26-04-2004
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 22
sitrico Va por buen camino
En este caso no me sirve lo de la plantilla, ya que la hoja es bastante compleja (una demostración de los calculos de un programa complejo según exigencias de la Ley) por eso estoy obligado a incluir las funciones de Excel, Ya logré usar fórmulas simples y la función SUMA que se usa por ej.

'=SUM(A1:A15)'
ó
'=RAND()' ----> Aleatorio

Noten que es SUM y no SUMA ahora si trato de usar la funcion =SI()

'=IF(B5-B6<0;B5-B6;0)'

Me da un "Ole error 800A03EC" y lo mismo me pasa con la funcion ROUND (Redondear).

He usado este código para hacer pruebas de sintaxis (en edit1.text) y no he podido encontrar el problema.

Código:
Function LaFormula(f:String):String;
Var
p : Integer;
Begin
While(pos('##',f) <> 0) do
   Begin
   p := pos('##',f);
   Delete(f,p,2);
   Insert(IntToStr(Row),f,p);
   End;
Result := f;
End;

procedure TForm1.Button1Click(Sender: TObject);
Var
RangeE:Range;
i,Row: Integer;
Begin
For i := 0 to Query1.FieldCount-1 do
   begin
   RangeE.Value := Query1.Fields[i].DisplayLabel;
   RangeE := RangeE.Next;
   End;
Row := 2;
While not(Query1.Eof) do
   Begin
   RangeE := ExcelApplication1.Range['A'+IntToStr(Row),'A'+IntToStr(Row)];
   For i := 0 to Query1.FieldCount-1 do
      begin
      RangeE.Value := Query1.Fields[i].AsString;
      RangeE := RangeE.Next;
      End;
   RangeE.Value := LaFormula('=SUM(C##:E##)');
   RangeE := RangeE.Next;
   RangeE.Value := LaFormula(Edit1.Text);
   Query1.Next;
   Inc(Row);
   End;
end;
__________________
Sitrico

Última edición por sitrico fecha: 26-04-2004 a las 23:23:09.
Responder Con Cita
  #20  
Antiguo 28-04-2004
candido candido is offline
Miembro
 
Registrado: may 2003
Posts: 11
Poder: 0
candido Va por buen camino
hola foro

mi intencion es importar una tabla a excel y con este ejemplo me va estupendamente, pero el problema esta cuando lo hago sin que se vea el excel, es decir con la opcion de visible a false, y lo cierro con un quit, que me pregunta si quiero grabar o no el libro excel, quisiera cerrar pero sin grabar, ya que lo uso para hacer un paso intermedio de combinar correspondencia con word,

muchas gracias y espero haberme explicado bien.
__________________
Me da pena que se admire el valor en la batalla;
menos mal que con los rifles no se matan las palabras.
Responder Con Cita
Respuesta



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 20:00:12.


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