Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Servers (https://www.clubdelphi.com/foros/forumdisplay.php?f=9)
-   -   salvar fichero excel (https://www.clubdelphi.com/foros/showthread.php?t=4845)

Ester 30-10-2003 17:04:05

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

roman 30-10-2003 17:17:13

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

ramiretor 04-11-2003 00:22:47

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

:D

roman 04-11-2003 00:56:31

Prueba con

Código:

  Libro.SaveAs(
    NombreArchivo,
    Null,
    Null,
    Null,
    false,
    false,
    xlNoChange,
    xlUserResolution,
    false,
    Null,
    Null,
    0
  );

// Saludos

Miguel Rodrigo 04-11-2003 02:55:01

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
);


:D

roman 04-11-2003 06:21:04

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 :D

// Saludos

ramiretor 04-11-2003 21:22:36

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

:)

roman 04-11-2003 22:47:52

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

ramiretor 04-11-2003 23:03:31

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

:D

roman 04-11-2003 23:17:54

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.

:eek: 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;
? :confused:

// Saludos

ramiretor 04-11-2003 23:28:09

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
:D :D

seb@ 24-03-2004 15:16:50

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;


roman 24-03-2004 16:07:58

Intenta cambiar

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

por

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

// Saludos

niogon 24-03-2004 18:12:39

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);

lKinGl 05-11-2008 23:40:16

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

nuk3zito 10-12-2008 17:30:55

Cita:

Empezado por lKinGl (Mensaje 324426)
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)

fsolispa 22-04-2009 02:53:42

Cita:

Empezado por nuk3zito (Mensaje 330331)
¿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

nuk3zito 22-04-2009 04:09:29

Cita:

Empezado por fsolispa (Mensaje 345733)
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.

fsolispa 22-04-2009 14:50:47

Cita:

Empezado por nuk3zito (Mensaje 345743)
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.

fsolispa 22-04-2009 16:42:16

Cita:

Empezado por fsolispa (Mensaje 345784)
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'


La franja horaria es GMT +2. Ahora son las 22:47:56.

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