PDA

Ver la Versión Completa : salvar fichero excel


Ester
30-10-2003, 18:04:05
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, 18:17:13
Yo creo un nuevo archivo con algo similar a esto:


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, 01: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, 01:56:31
Prueba con


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


// Saludos

Miguel Rodrigo
04-11-2003, 03: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, 07:21:04
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, 22: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, 23:47:52
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
05-11-2003, 00: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
05-11-2003, 00:17:54
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:


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:


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


? :confused:

// Saludos

ramiretor
05-11-2003, 00: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, 16:16:50
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

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, 17:07:58
Intenta cambiar

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

por

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

// Saludos

niogon
24-03-2004, 19:12:39
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
06-11-2008, 00:40:16
Salu2 quisiera saber si me pueden ayudar con mi código....


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, 18:30:55
Salu2 quisiera saber si me pueden ayudar con mi código....


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

ExcelApplication1.Visible[0] := true;
?

(En este hilo también se menciona)

fsolispa
22-04-2009, 03:53:42
¿ya probaste con

Código Delphi [-] (http://www.clubdelphi.com/foros/#)
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, 05:09:29
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í...


var
Excel, Libro, xlSheet: Variant;



try
Excel := GetActiveOleObject('Excel.Application');
except
Excel := CreateOleObject('Excel.Application');
end;



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, 15:50:47
Es algo así...


Código Delphi [-] (http://www.clubdelphi.com/foros/#)
var
Excel, Libro, xlSheet: Variant;






Código Delphi [-] (http://www.clubdelphi.com/foros/#)
try
Excel := GetActiveOleObject('Excel.Application');
except
Excel := CreateOleObject('Excel.Application');
end;






Código Delphi [-] (http://www.clubdelphi.com/foros/#)
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, 17:42:16
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'

nuk3zito
22-04-2009, 17:44:30
Very good!

nuk3zito
22-04-2009, 17:50:14
Para los que quieren un poquitito más de teoría referente a lo que se vio en este hilo... aquí tienen una page:

Deborah Pate's Page (http://www.djpate.freeserve.co.uk/AutoExcl.htm)


Es un artículo viejito... pero vigente.

Saludos.