PDA

Ver la Versión Completa : Crear otra hoja en excel igual a la anterior


Novás
23-06-2006, 13:14:18
Hola a todos XD:

Mi problema es el siguiente; para acceder a un libro de excel hago lo siguiente:

var
Excel, Libro: Variant;
i: integer;
begin
Excel:=CreateOleObject('Excel.Application');
Excel.Visible := False;
Excel.DisplayAlerts:= False;
Excel.WorkBooks.Add('plantilla.xlt');
Excel.WorkBooks[1].WorkSheets[1].Name := 'Productos';
Libro := Excel.WorkBooks[1].WorkSheets['Productos'];


El archivo de la plantilla tiene una sola hoja y yo necesito crear, a partir de esa hoja, un numero indeterminado de copias iguales.

¿Como hago por favor? no encuentro nada en el foro

Neftali [Germán.Estévez]
23-06-2006, 13:49:07
Para crear una hoja nueva en la plantilla a partir de la que hay puedes usar éste código:


uses
Activex, ComObj;

procedure TForm1.Button1Click(Sender: TObject);
var
excel : olevariant;
begin
// Crear el objeto
excel := CreateOLEObject('Excel.Application');
// Acceder a la plantilla
excel.workbooks.open('c:\temp\plantilla.xlt');
// Seleccionar la hoja
excel.sheets[1].select;
// Copiar la hoja seleccionada
excel.sheets[1].copy(EmptyParam, excel.sheets[1]);
// desactivar alertas para que no avise de que vas a guardar sobre la misma plantilla
Excel.DisplayAlerts := False;
// Guardar en el mismo XLT
excel.activeWorkBook.SaveAS('C:\Temp\plantilla.xlt');
// Cerrar
excel.workbooks.Close;
// liberar
Excel := Unassigned;
end;


Funciona perfectamente con Excel 2003; Espero que no tengas problemas con versiones anteriores.

Novás
24-06-2006, 20:43:02
Muchas gracias, funciona perfectamente, ahora la duda que me quedas es como puedo poner en primer plano, por ejemplo, la hoja numero 5, ya que aunque puedo insertar datos en esa hoja, yo quiero que el cliente se quede con el libro abierto ante el en la hoja que le corresponda a cada momento.

Muchas gracias de nuevo

Novás
25-06-2006, 14:30:27
He probado el codigo para copiar las hojas, me ha funcionado durante 20 minutos, ahora cuando ejecuto

while not CUsuarios.Eof do
begin
excel.sheets[1].select;
excel.sheets['PLANTILLA'].copy(EmptyParam, excel.sheets[1]);
CUsuarios.Next;
end;


Me pone que el servidor lanzó una excepción.

A que se puede deber, el error lo da justo en la lína


excel.sheets['PLANTILLA'].copy(EmptyParam, excel.sheets[1]);

Neftali [Germán.Estévez]
26-06-2006, 09:24:02
Me pone que el servidor lanzó una excepción.

Estaría bien saber cual es la excepción que te ha "lanzado".

Novás
26-06-2006, 12:13:34
Es que no sabría deciros, el mensaje exacto que me pone es ese:

El servidor lanzó una excepción.

cuburu
23-07-2006, 01:49:48
De forma inmediata se me ocurre que el problema no es tanto de el manejo de excel, por lo que veo estas haciendo una llamada a una tabla que contiene un apuntador y vas agregando una nueva hoja por cada registro de dicha tabla. ¿No sería mejor realizar un conteo del total de registros que tienes y en base a ello hacer el ciclo para agregar las hojas que necesites?

Lo que tienes en tú código:


while not CUsuarios.Eof do
begin
excel.sheets[1].select;
excel.sheets['PLANTILLA'].copy(EmptyParam, excel.sheets[1]);
CUsuarios.Next;
end;


Podrías intentar con algo como esto:


var
NoUsers, Cont: Integer;
begin
NoUsers := CUsuarios.Count; {Revisa esta parte de la sintaxis pues no la recuerdo bien}
for Cont := 1 to NoUsers do
begin
excel.sheets[1].select;
excel.sheets['PLANTILLA'].copy(EmptyParam, excel.sheets[1]);
end;
end;


Espero te sirva esta idea, suerte.