Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Plantilla de excel no guarda los datos (https://www.clubdelphi.com/foros/showthread.php?t=87850)

giulichajari 08-03-2015 13:37:57

Plantilla de excel no guarda los datos
 
Hola amigos, tengo un form para hacer un presupuesto que tiene una grilla conectada a un ClientDataSet, como tabla temporal.

Luego un button "Imprimir" guarda los datos en la base de datos, pero a la vez toma un archivo base de excel, que es un archivo guardado en el directorio de la aplicacion con una plantilla (osea un formato previo) y yo sobreescribo las celdas correspondientes para que se complete la tabla de productos el cliente solicitado, etc.. y si se completan. Pero cuando salgo de excel y vuelvo a abrir el archivo de presupuesto (en el proceso hago una copia de la plantilla y la guardo en una carpeta presu) no se ven los datos, solo la plantilla.

La verdad no se que puede ser.

Codigo boton imprimir:

Código Delphi [-]
procedure TForm4.SpeedButton5Click(Sender: TObject);

var
Excel, Libro, Hojal: OleVariant;
Plantilla:string;
origen,s,destino,nombre,fechaf,fechai,fechac:string;
l,x:integer;
cantidad,preciou:Double;
idc,ide,ids,idprodu:Integer;
a:TServerMethods1Client;

begin
  a:=TServerMethods1Client.Create(ClientModule1.SQLConnection1.DBXConnection);
   if (Grillapresu.DataSource.DataSet.RecordCount>0) then
      begin

              if Form2.Edit1.Text<>'' then
                      idc:=ClientModule1.qscli.ParamByName('idcli').AsInteger
              else
              idc:=1;
               if cempleados.KeyValue=null then
                begin
                   ShowMessage('seleccione el empleado responsable.');
                end
               else
                begin
                   ide:=cempleados.KeyValue;
                 end;
               ids:=StrToInt(pre.ReadString('sucursal','id','1'));
               fechac:=FormatDateTime('yyyy/mm/dd',Now);
               fechai:=FormatDateTime('yyyy/mm/dd',Now);

               fechaf:=FormatDateTime('yyyy/mm/dd', IncDay(Now,15));

               a.nuevopresupuesto(idc,ide,ids,fechac,fechai,fechaf);
  l:=Grillapresu.DataSource.DataSet.RecordCount;




      with ClientModule1.cdspresu do

             begin
               First;
                while not Eof do
                    begin
                    cantidad:=ClientModule1.cdspresucantidad.AsFloat;
                    preciou:=ClientModule1.cdspresuprecio.AsFloat;
                    idprodu:=ClientModule1.cdspresuidproducto.AsInteger;
                    a.nuevodetallepresupuesto(idprodu,cantidad,preciou);

                    Next;
                    end;
               EmptyDataSet;
             end;

          // copiar plantilla
nombre:=FormatDateTime('yyyy-mm-dd,hh-mm-ss',Now) + 'presu.xlsx';
origen:=ExtractFilePath(Application.ExeName)+ 'presu.xlsx';
destino:=ExtractFilePath(Application.ExeName) +'pres\' + nombre;
CopyFile(Pchar(origen),Pchar(destino),True);
 //crear el objeto excel
Excel := CreateOleObject('Excel.Application');

  Plantilla:=destino;
  Excel.SheetsInNewWorkbook := 1;

  Libro := Excel.Workbooks.Open(Plantilla); // Plantilla es la ruta a un archivo excel que uso como plantilla
  Hojal := Libro.Worksheets[1];
  //posicionar datos
  Hojal.Cells[3,6] := '100';
  Hojal.Cells[4,4] := Edireccion.Text;
  Hojal.Cells[5,4] := Eciudad.Text;
  Hojal.Cells[6,4]:=Edit1.Text;
  if (Form2.Edit1.Text<>'') then
      begin
         Hojal.Cells[12,8]:=ClientModule1.qscli.ParamByName('idcli').AsInteger;
         Hojal.Cells[15,5]:=ClientModule1.qsclinombreyape.AsString;
      end;
  Hojal.Cells[10,8]:=Eemititdo.Text;
  Hojal.Cells[13,8]:='efectivo';
  Hojal.Cells[14,8]:=Evalido.Text;
  Excel.Visible := true;
   Hojal.SaveAs(nombre);

end
else
begin
ShowMessage('no hay productos');
end;

end;

En la primera parte guardo los datos en bd con el servidor DataSnap y en luego cargo la plantilla.

fjcg02 09-03-2015 09:14:43

Para salvar hay que utilizar

ExcelWorkbook1.SaveAs(ficheroGenerado,
-4143 , emptyParam , emptyParam, false, false,
1, emptyParam, false, emptyParam, emptyParam,
emptyParam, 0);


y no hoja1.saveas(nombre);

hay mucha información en la red al respecto para que puedas adaptar tu código.

Saludos

giulichajari 10-03-2015 12:03:21

Cita:

Empezado por fjcg02 (Mensaje 489736)
Para salvar hay que utilizar

ExcelWorkbook1.SaveAs(ficheroGenerado,
-4143 , emptyParam , emptyParam, false, false,
1, emptyParam, false, emptyParam, emptyParam,
emptyParam, 0);


y no hoja1.saveas(nombre);

hay mucha información en la red al respecto para que puedas adaptar tu código.

Saludos

Bueno encontre esto:

https://msdn.microsoft.com/es-es/lib...ok.saveas.aspx

Pero lo que no logro encontrar es el codigo de mi excel: es para excel 2010, donde esta el 52. El resto de los parametros son opcionales.
Código Delphi [-]
 Libro.SaveAs(nombre , 35 ,EmptyParam,EmptyParam,false,false,
                   EmptyParam,EmptyParam,EmptyParam,0);

fjcg02 10-03-2015 13:34:16

Este codigo me funciona con XP y excell 2010 y con W7 y excel 2010

Saludos

nlsgarcia 10-03-2015 15:00:58

giulichajari,

Cita:

Empezado por giulichajari
...Plantilla de Excel no guarda los datos...lo que no logro encontrar es el código de mi Excel: es para Excel 2010...

:rolleyes:

Revisa esta información
Espero sea útil :)

Nelson.

giulichajari 10-03-2015 16:56:54

Cita:

Empezado por fjcg02 (Mensaje 489811)
Este codigo me funciona con XP y excell 2010 y con W7 y excel 2010

Saludos

Me dice numero de parametros no valido.

Y Nelson en tu codigo
Código Delphi [-]
WrkS.SaveAs(FileExcel,xlOpenXMLWorkbook);

yo puse el nombre del libro:

Código Delphi [-]
Libro.SaveAs(nombre, xlOpenXLSXWorkbook);

Y dice Undeclared Identifier "xlOpenXLSXWorkbook";

Y he visto muchos ejemplos con el nombre del archivo nomas.

giulichajari 10-03-2015 17:16:19

Finalmente funciono con
Código Delphi [-]
Excel.Save

ja

Lo que si se ve la cabecera del presupuesto, ahora necesito recorrer el ClientDataSet para completar el detalle:

Código Delphi [-]
 with ClientModule1.cdspresu do
    begin
      x:=20;
      First;
      while not eof do
         begin

                Hojal.Cells[x,4]:=ClientModule1.cdspresucantidad.Value;
                Hojal.Cells[x,5]:=ClientModule1.cdspresunombre.Value;
                inc(x);

         end;

         Next;
    end;

Hice lo de arriba pero no funciona.. pero la cabecera si queda guardada. Muchas gracias

nlsgarcia 10-03-2015 17:17:36

giulichajari,

Cita:

...Undeclared Identifier "xlOpenXLSXWorkbook"...
:rolleyes:


Te comento:

1- En el código propuesto en el Msg # 2 del hilo Hojas de Excel en Delphi, xlOpenXLSXWorkbook es una constante declarada con el valor 51.

2- Declara la constante como se indica en este fragmento de código:
Código Delphi [-]
const
   xlOpenXMLWorkbook = 51;
3- Revisa esta información:
Nota: 51 es el valor de Workbook por default.

Espero sea útil :)

Nelson.

giulichajari 11-03-2015 11:09:31

Cita:

Empezado por nlsgarcia (Mensaje 489828)
giulichajari,

:rolleyes:


Te comento:

1- En el código propuesto en el Msg # 2 del hilo Hojas de Excel en Delphi, xlOpenXLSXWorkbook es una constante declarada con el valor 51.

2- Declara la constante como se indica en este fragmento de código:
Código Delphi [-]
const
   xlOpenXMLWorkbook = 51;
3- Revisa esta información:

Nota: 51 es el valor de Workbook por default.

Espero sea útil :)

Nelson.

Probe con

Código Delphi [-]
Hojal.SaveAs(nombre,xlOpenXMLWorkbook);

Hojal es de tipo:

Código Delphi [-]
Hojal := Libro.Worksheets[1];

que es del mismo tipo que en el ejemplo, no da errores pero no se guarda jja. Si encuentro la solucion la comento.


La franja horaria es GMT +2. Ahora son las 19:49: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