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 30-10-2003
Ester Ester is offline
Miembro
 
Registrado: oct 2003
Posts: 13
Poder: 0
Ester Va por buen camino
salvar fichero excel

Muy buenas,

he empezado a trabajar con excel des de delphi y tengo un gran problema, no sé como crear un fichero excel.

He buscado en los foros y he descubierto como abrir y llenar un fichero ya creado, pero no consigo encontrar un ejemplo que lo genere des de cero.

He probado con los componentes de la paleta 'servers' y también con un objecto de tipo variant, pero no hay modo de que me grabe el .xls.

Alguien puede ayudarme?


Muchas grácias,

Ester
Responder Con Cita
  #2  
Antiguo 30-10-2003
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
Yo creo un nuevo archivo con algo similar a esto:

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

begin
  Libro := Excel.Workbooks.Add(Plantilla, 0);
  Hoja  := Libro.Sheets[1] as _WORKSHEET;
donde 'Excel' es una componente de tipo TExcelApplication y 'Plantilla' es la ruta a una plantilla de Excel ya creada aunque puedes usar Null para crear un libro con la plantilla por defecto.

Luego,con

Excel.Visible[0] := true

muestras Excel o bien puedes usar el método SaveAs del objeto _WORKSHEET para guadar el archivo.

// Saludos
Responder Con Cita
  #3  
Antiguo 04-11-2003
ramiretor ramiretor is offline
Miembro
 
Registrado: may 2003
Ubicación: México
Posts: 196
Poder: 21
ramiretor Va por buen camino
Hola:
Muy bien Roman, he hecho como tú dices pero ahora el método SaveAs de _woorkSheet me pide unos parámetros que no sé como se definen

Saludos

__________________
Ernesto R.
Responder Con Cita
  #4  
Antiguo 04-11-2003
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
Prueba con

Código:
  Libro.SaveAs(
    NombreArchivo,
    Null,
    Null,
    Null,
    false,
    false,
    xlNoChange,
    xlUserResolution,
    false,
    Null,
    Null,
    0
  );
// Saludos
Responder Con Cita
  #5  
Antiguo 04-11-2003
Miguel Rodrigo Miguel Rodrigo is offline
Registrado
 
Registrado: nov 2003
Ubicación: Mexico D.F.
Posts: 5
Poder: 0
Miguel Rodrigo Va por buen camino
Thumbs up

Hola Ernesto

Debes revisar el código, lo que puede suceder es que estes tratando de guardar la hoja

Hoja.SaveAs( ......

Pero si no guardas primero el Libro, como te indico Roman, entonces te va a generar un EAccessViolation.


var
Libro : _WORKBOOK;
Hoja : _WORKSHEET;

begin
Libro := Excel.Workbooks.Add(NULL, 0);
Hoja := Libro.Sheets[1] as _WORKSHEET;
Libro.SaveAs(Nombre,
Null,
Null,
Null,
false,
false,
xlNoChange,
xlUserResolution,
false,
Null,
Null,
0
);


Responder Con Cita
  #6  
Antiguo 04-11-2003
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:
Miguel Rodrigo comentó:
Pero si no guardas primero el Libro, como te indico Roman, entonces te va a generar un EAccessViolation.
En realidad debe funcionar con la hoja aunque con otro parámetros. Así lo probé primero y sí sirvió. Sólo que, aunque no lo he probado, pienso que si estamos manejando varias hojas en un mismo libro, el método SaveAs de la hoja guardará la hoja en otro libro nuevo. Por ello rectifiqué y puse el método del libro.

Habrá que probar...

... sólo que me da flojera con tantos parámetros

// Saludos
Responder Con Cita
  #7  
Antiguo 04-11-2003
ramiretor ramiretor is offline
Miembro
 
Registrado: may 2003
Ubicación: México
Posts: 196
Poder: 21
ramiretor Va por buen camino
Hola:
He hecho todo como me han indicado y funciona de maravilla, pero si ahora quiero meter valores en las celdas de la hoja, en los ejemplos del foro viene de la siguiente manera:

Hoja.Cells[1,1].Value := variable;

pero no funciona porque los ejemplos del foro utilizan la expresión, para abrir excel:

CreateOleObject('Excel.Application');


alguien me puede ayudar?


saludos

__________________
Ernesto R.
Responder Con Cita
  #8  
Antiguo 04-11-2003
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:
ramiretor comentó:
[...]en los ejemplos del foro viene de la siguiente manera:

Hoja.Cells[1,1].Value := variable;

pero no funciona porque los ejemplos del foro utilizan la expresión, para abrir excel:

CreateOleObject('Excel.Application');
No entiendo cuál es la relación entre cómo asignar valores a una celda y la forma en que creas el objeto ExcelApplication.

Ya sea que crees el objeto mediante CreateOleObject o utilizando una componente TExcelApplication (y la verdad no entiendo por qué se complican la vida utilizando CreateOleObject), el objeto tiene la propiedad WorkBooks a partir de la cual creas el nuevo libro y la nueva hoja.

// Saludos
Responder Con Cita
  #9  
Antiguo 04-11-2003
ramiretor ramiretor is offline
Miembro
 
Registrado: may 2003
Ubicación: México
Posts: 196
Poder: 21
ramiretor Va por buen camino
Hola:
Ahora solo necesito saber como le hago para asignarle valor a una o varias celdas usando un objeto TExcelApplication, te agradeceré una ayuda en esa cuestion.

Saludos

__________________
Ernesto R.
Responder Con Cita
  #10  
Antiguo 04-11-2003
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:
ramiretor comentó:
Hola:
Ahora solo necesito saber como le hago para asignarle valor a una o varias celdas usando un objeto TExcelApplication, te agradeceré una ayuda en esa cuestion.
Creo que estoy dejando de entender. ¿Qué problema hay con juntar lo de mi primer mensaje en este hilo:

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

begin
  Libro := Excel.Workbooks.Add(Plantilla, 0);
  Hoja  := Libro.Sheets[1] as _WORKSHEET;
con lo que tú mismo citas en tu penúltimo mensaje:

Código:
Hoja.Cells[1,1].Value := variable;
?

// Saludos
Responder Con Cita
  #11  
Antiguo 04-11-2003
ramiretor ramiretor is offline
Miembro
 
Registrado: may 2003
Ubicación: México
Posts: 196
Poder: 21
ramiretor Va por buen camino
Ahora me contesto yo mismo, uso Delphi 7 por lo que no estoy muy seguro si para versiones anteriores de Delphi sea lo mismo.
Si se usa un objeto TExcelApplication para usar el Excel entonces,
para llenar el valor de la celda A1, se usa :

Excel.Cells.Items[1, 'A'] := Variable;



Gracias por todo, y por cierto el metodo SaveAs(.....) con todos los parámetros que amablemente me proporcionaron funciona si en el uses de la unidad se tiene declarada Excel2000, para versiones posteriores(por ejemplo Office XP) se agrega un penultimo parametro( que estoy investigando cual puede ser)

Saludos y un abrazo
__________________
Ernesto R.
Responder Con Cita
  #12  
Antiguo 24-03-2004
Avatar de seb@
seb@ seb@ is offline
Miembro
 
Registrado: ago 2003
Posts: 57
Poder: 21
seb@ Va por buen camino
Post Error al escribir el mismo codigo

Hola!!!
Estoy intentando hacer lo que estaban tratando, acerca de crear un archivo excel, pero esto no me funciona y me tira el error cuando quiero poner informacion en el archivo abierto:

[Error] xxxxxxxxxxx.pas(784): Class does not have a default property

cual es mi problema? de antemano gracias.

Código
Código:
var
	Hoja 	: _WORKSHEET;
	Libro : _WORKBOOK;
begin
	Excel.Connect;
	Libro := Excel.Workbooks.Add(NULL, 0);
	Hoja := Libro.Sheets[1] as _WORKSHEET;
        //Esta linea es la que me da ese error
        Hoja.Cells[1, 1].Value := 'hola';
	Excel.Visible[0] := true;
__________________
Sebastian Ibarrola
--------------------------
Responder Con Cita
  #13  
Antiguo 24-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
Intenta cambiar

Hoja.Cells[1, 1].Value := 'hola';

por

Hoja.Cells.Item[1, 1].Value := 'hola';

// Saludos
Responder Con Cita
  #14  
Antiguo 24-03-2004
niogon niogon is offline
Miembro
 
Registrado: oct 2003
Posts: 25
Poder: 0
niogon Va por buen camino
Wink Puntual

Para ser sincero no he seguido mucho el hilo, pero creo entender que ocurre haci que te mando la linea como deveria ser

para los componentes office xp en delphi 7

{TExcelWorkBook} wkbExcel.SaveAs('c:\datos\uno.xls', Null, Null, Null, False, False, xlNoChange, xlUserResolution, False, Null, Null, 0, lcid);

para los componentes office 2000 en delphi 7

{TExcelWorkBook} wkbExcel.SaveAs('c:\datos\uno.xls, Null, Null, Null, False, False, xlNoChange, xlUserResolution, False, Null, Null, lcid);
Responder Con Cita
  #15  
Antiguo 05-11-2008
lKinGl lKinGl is offline
Miembro
 
Registrado: ago 2007
Posts: 333
Poder: 17
lKinGl Va por buen camino
Salu2 quisiera saber si me pueden ayudar con mi código....

Código Delphi [-]
procedure TForm14.Button1Click(Sender: TObject);
var
  Libro : _WORKBOOK;
  Hoja  : _WORKSHEET;
  i:Integer;
begin
i:=0;
Libro := ExcelApplication1.Workbooks.Add(Null, 0);
Hoja  := Libro.Sheets[1] as _WORKSHEET;
  with Query1 do
    begin
    first;
      while not EOF Do
        begin
        i:=i+1;
        Hoja.Cells.Item[i,1]:=DBGrid1.Fields[0].AsString;
        Hoja.Cells.Item[i,2]:=DBGrid1.Fields[1].AsString;
        Hoja.Cells.Item[i,3]:=DBGrid1.Fields[2].AsString;
        Hoja.Cells.Item[i,4]:=DBGrid1.Fields[3].AsString;
        Hoja.Cells.Item[i,5]:=DBGrid1.Fields[4].AsString;
        Hoja.Cells.Item[i,6]:=DBGrid1.Fields[5].AsString;
        Hoja.Cells.Item[i,7]:=DBGrid1.Fields[6].AsString;
        Hoja.Cells.Item[i,8]:=DBGrid1.Fields[7].AsString;
        Hoja.Cells.Item[i,9]:=DBGrid1.Fields[8].AsString;
        Hoja.Cells.Item[i,10]:=DBGrid1.Fields[9].AsString;
        Next;
   end;//while
end;//with
end;

he desarrollado este código siguiendo este hilo, no da error pero no abre excel ni muestra lo que debe....

gracias adelantadas
__________________
Las cosas o son, o no son...
Responder Con Cita
  #16  
Antiguo 10-12-2008
Avatar de nuk3zito
nuk3zito nuk3zito is offline
Miembro
 
Registrado: ago 2003
Ubicación: "Z" Land
Posts: 244
Poder: 21
nuk3zito Va por buen camino
Cita:
Empezado por lKinGl Ver Mensaje
Salu2 quisiera saber si me pueden ayudar con mi código....

Código Delphi [-]
procedure TForm14.Button1Click(Sender: TObject);
var
  Libro : _WORKBOOK;
  Hoja  : _WORKSHEET;
  i:Integer;
begin
i:=0;
Libro := ExcelApplication1.Workbooks.Add(Null, 0);
Hoja  := Libro.Sheets[1] as _WORKSHEET;
  with Query1 do
    begin
    first;
      while not EOF Do
        begin
        i:=i+1;
        Hoja.Cells.Item[i,1]:=DBGrid1.Fields[0].AsString;
        Hoja.Cells.Item[i,2]:=DBGrid1.Fields[1].AsString;
        Hoja.Cells.Item[i,3]:=DBGrid1.Fields[2].AsString;
        Hoja.Cells.Item[i,4]:=DBGrid1.Fields[3].AsString;
        Hoja.Cells.Item[i,5]:=DBGrid1.Fields[4].AsString;
        Hoja.Cells.Item[i,6]:=DBGrid1.Fields[5].AsString;
        Hoja.Cells.Item[i,7]:=DBGrid1.Fields[6].AsString;
        Hoja.Cells.Item[i,8]:=DBGrid1.Fields[7].AsString;
        Hoja.Cells.Item[i,9]:=DBGrid1.Fields[8].AsString;
        Hoja.Cells.Item[i,10]:=DBGrid1.Fields[9].AsString;
        Next;
   end;//while
end;//with
end;

he desarrollado este código siguiendo este hilo, no da error pero no abre excel ni muestra lo que debe....

gracias adelantadas
¿ya probaste con
Código Delphi [-]
ExcelApplication1.Visible[0] := true;
?

(En este hilo también se menciona)
__________________
Tiempo y ocasión acontecen a todos!
Responder Con Cita
  #17  
Antiguo 22-04-2009
fsolispa fsolispa is offline
Miembro
 
Registrado: sep 2008
Posts: 28
Poder: 0
fsolispa Va por buen camino
Cita:
Empezado por nuk3zito Ver Mensaje
¿ya probaste con

Código Delphi [-]
ExcelApplication1.Visible[0] := true;



?

(En este hilo también se menciona)
Una pregunta hay forma de poder poner información en una hoja ya existente, ya que en los ejemplos solo he visto para crear una nueva hoja pero no como insertar información en una ya existente alguien podria ayudarme
Responder Con Cita
  #18  
Antiguo 22-04-2009
Avatar de nuk3zito
nuk3zito nuk3zito is offline
Miembro
 
Registrado: ago 2003
Ubicación: "Z" Land
Posts: 244
Poder: 21
nuk3zito Va por buen camino
Cita:
Empezado por fsolispa Ver Mensaje
Una pregunta hay forma de poder poner información en una hoja ya existente, ya que en los ejemplos solo he visto para crear una nueva hoja pero no como insertar información en una ya existente alguien podria ayudarme
Es algo así...

Código Delphi [-]
var
  Excel, Libro, xlSheet: Variant;

Código Delphi [-]
  try
     Excel := GetActiveOleObject('Excel.Application');
  except
     Excel := CreateOleObject('Excel.Application');
  end;

Código Delphi [-]
  if bGenerarArchivo then
     begin
        Libro:= Excel.WorkBooks.Add(xlWBATWorksheet);
        xlSheet:= Excel.WorkBooks[1].Sheets[1];
        xlSheet.Name:= sSheetName;
     end
  else
     begin
        Libro:= Excel.Workbooks.Open(sArchivo);
        xlSheet:= Libro.Worksheets.Item[sSheetName];
     end;

Donde bGenerarArchivo es una variable booleana que indica si el archivo se crea o se abre; sArchivo es una variable string con la ruta y nombre del archivo; y sSheetName es el nombre de la hoja a donde vas a escribir.

Toma en cuenta que este ejemplo es sin usar TExcelApplication (por eso puse el codigo con el que se crea el objeto), así que usándolo debe ser algo muy parecido.

Saludos.
__________________
Tiempo y ocasión acontecen a todos!

Última edición por nuk3zito fecha: 22-04-2009 a las 04:14:35.
Responder Con Cita
  #19  
Antiguo 22-04-2009
fsolispa fsolispa is offline
Miembro
 
Registrado: sep 2008
Posts: 28
Poder: 0
fsolispa Va por buen camino
Cita:
Empezado por nuk3zito Ver Mensaje
Es algo así...


Código Delphi [-]
var
Excel, Libro, xlSheet: Variant;






Código Delphi [-]
try
Excel := GetActiveOleObject('Excel.Application');
except
Excel := CreateOleObject('Excel.Application');
end;






Código Delphi [-]
if bGenerarArchivo then
begin
Libro:= Excel.WorkBooks.Add(xlWBATWorksheet);
xlSheet:= Excel.WorkBooks[1].Sheets[1];
xlSheet.Name:= sSheetName;
end
else
begin
Libro:= Excel.Workbooks.Open(sArchivo);
xlSheet:= Libro.Worksheets.Item[sSheetName];
end;





Donde bGenerarArchivo es una variable booleana que indica si el archivo se crea o se abre; sArchivo es una variable string con la ruta y nombre del archivo; y sSheetName es el nombre de la hoja a donde vas a escribir.

Toma en cuenta que este ejemplo es sin usar TExcelApplication (por eso puse el codigo con el que se crea el objeto), así que usándolo debe ser algo muy parecido.

Saludos.
Muchas gracias.
Responder Con Cita
  #20  
Antiguo 22-04-2009
fsolispa fsolispa is offline
Miembro
 
Registrado: sep 2008
Posts: 28
Poder: 0
fsolispa Va por buen camino
Cita:
Empezado por fsolispa Ver Mensaje
Muchas gracias.
Ya realice las modificaciones necesarias de acuerdo a la información que me diste y trabaja super bien, no utilice el comando

Try
Excel := GetActiveOleObject('Excel.Application')
Except
Excel := CreateOleObject('Excel.Application')
End;

ya que me daba error al leer, entonces lo solo cree, como no creare un nuevo archivo de excel solo utilice los comandos necesarios que fueron

Libro := Excel.WorkBooks.Open(sArchivo);
xlSheet := Libro.WorkSheets.Item[sShetName);

Dentro de un if para determinar la hoja de excel en la que se guardará la información y un while para llenarla el programa quedo así

procedure TGeneraListasFrm.SpeedButton2Click(Sender: TObject);
Var
Excel, Libro, Hoja : Variant;
i : integer;
begin
i := 7;
Excel := CreateOleObject('Excel.Application');
Libro := Excel.WorkBooks.Open('E:\Mis Documentos\feb08.xls');
if ModuloDatosFrm.ZListaQrycgrado.Value = 'PREP01' then
Begin
Hoja := Libro.WorkSheets.Item[6];
With ModuloDatosFrm.ZListaQry Do
Begin
First;
while not EOF do
Begin
i := i + 1;
Hoja.Cells.Item[i,1] := DbGrid1.Fields[0].AsString;
Next;
End;
End;
Excel.Visible := True;
End
Else if ModuloDatosFrm.ZListaQrycgrado.Value = 'PREP02' then
Begin
Hoja := Libro.WorkSheets.Item[7];
With ModuloDatosFrm.ZListaQry Do

bueno y continua hasta 'PREP06'
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 04:21:32.


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