Ver Mensaje Individual
  #1  
Antiguo 01-03-2009
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Reputación: 10
marcoszorrilla Va por buen camino
Caso curioso exportando a excel desde una rejilla.

Afortunadamente lo acabo de resolver, pero os cuento lo que me ha estado pasando.

Con este código exporto facturas de una rejilla a excel, sin problemas.
Código Delphi [-]
procedure TfrConFacturas.spExcelClick(Sender: TObject);
var
  excel:Variant;
  fila,columna:Integer;
  nCols:Integer;
  Data : TDataSet;
  MyDataSet:TDataSet;
  i:Integer;
begin
  try
    excel:=CreateOleObject('Excel.Application');
  except
    ShowMessage('Excel no se pudo iniciar.');
    exit;
  end;
  excel.Visible:=true;

  Data:=DbgFacturas.DataSource.DataSet;
  Data.First;
  fila:=1;
  columna:=0;
  excel.Workbooks.Add;
  nCols:= DbgFacturas.Columns.Count;
     //Poner los títulos
     for Columna:=0 to nCols - 1 do
     begin
     Excel.Cells[fila,columna + 1].Value:=DbgFacturas.Columns[Columna].Title.Caption;
     end;

    Fila:=Fila + 1;

   //Desengachar controles para agilizar


   try
     while not(Data.eof) do
     begin

       for columna := 0 to DbgFacturas.Columns.Count-1 do
       begin
        if columna = 0 then
        begin
        Excel.Cells[fila,columna + 1].Value:=Data.FieldByName(DbgFacturas.Columns[Columna].FieldName).AsString;
        end;

        if columna = 1 then
        Excel.Cells[fila,columna + 1].Value:=Data.FieldByName(DbgFacturas.Columns[Columna].FieldName).AsDateTime;

        if (columna > 3) and (columna < 8) then
        begin
        Excel.Cells[fila,columna + 1].Value:=Data.FieldByName(DbgFacturas.Columns[Columna].FieldName).AsFloat;
        excel.Cells[fila,columna + 1].Style:= 'Comma';
        end
        else
        Excel.Cells[fila,columna + 1].Value:=Data.FieldByName(DbgFacturas.Columns[Columna].FieldName).AsString;
       end;

     Data.Next;
     fila:= fila + 1;
     end;
      //Ajustar columnas
        for columna:=1 to ncols do
        begin
        Excel.Columns[Columna].EntireColumn.AutoFit;
        end;

   Except
   ShowMessage('Atención, se produjo un error en la transmisión.');
   end;
   
end;

Ocurre que la primera columna es el número de las facturas y tiene el siguiente formato:
04-1800
El 04 indica el año y el resto del número es el número de la factura.

Pues sucede que me funcionaba correctamente hasta que observe que ciertas facturas en vez de el número aparecía una fecha con un formato personalizado.

Después de muchas vueltas me dí cuenta que esto sucedía a partir de la factura 2000

es decir 04-2000 y no con la 04-1999

Llegué a la conclusión de que las anteriores funcionaban por los efectos de ser menores de 2000 y a partir de este número excel interpretaba el formato como fecha.

Probé añadiéndole a la factura según se la pasaba a excel una 'F' por delante pues nada seguía igual.

Al final se me ocurrio entrar a Excel crear una macro de formato, entrar luego en dicha macro y ver que utilizaba para asegurarse el formato de texto y gracias a esto lo resolví, pongo la solución por si a alguien le ocurriera lo mismo.

Código Delphi [-]

procedure TfrConFacturas.spExcelClick(Sender: TObject);
var
  excel:Variant;
  fila,columna:Integer;
  nCols:Integer;
  Data : TDataSet;
  MyDataSet:TDataSet;
  i:Integer;
begin
  try
    excel:=CreateOleObject('Excel.Application');
  except
    ShowMessage('Excel no se pudo iniciar.');
    exit;
  end;
  excel.Visible:=true;

  Data:=DbgFacturas.DataSource.DataSet;
  Data.First;
  fila:=1;
  columna:=0;
  excel.Workbooks.Add;
  nCols:= DbgFacturas.Columns.Count;
     //Poner los títulos
     for Columna:=0 to nCols - 1 do
     begin
     Excel.Cells[fila,columna + 1].Value:=DbgFacturas.Columns[Columna].Title.Caption;
     end;

    Fila:=Fila + 1;

   //Desengachar controles para agilizar


   try
     while not(Data.eof) do
     begin

       for columna := 0 to DbgFacturas.Columns.Count-1 do
       begin
        if columna = 0 then
        begin
        Excel.Cells[fila,columna + 1].Value:=Data.FieldByName(DbgFacturas.Columns[Columna].FieldName).AsString;
        excel.Cells[fila,columna + 1].NumberFormat:='@';
        end;

        if columna = 1 then
        Excel.Cells[fila,columna + 1].Value:=Data.FieldByName(DbgFacturas.Columns[Columna].FieldName).AsDateTime;

        if (columna > 3) and (columna < 8) then
        begin
        Excel.Cells[fila,columna + 1].Value:=Data.FieldByName(DbgFacturas.Columns[Columna].FieldName).AsFloat;
        excel.Cells[fila,columna + 1].Style:= 'Comma';
        end
        else
        Excel.Cells[fila,columna + 1].Value:=Data.FieldByName(DbgFacturas.Columns[Columna].FieldName).AsString;
       end;

     Data.Next;
     fila:= fila + 1;
     end;
      //Ajustar columnas
        for columna:=1 to ncols do
        begin
        Excel.Columns[Columna].EntireColumn.AutoFit;
        end;

   Except
   ShowMessage('Atención, se produjo un error en la transmisión.');
   end;

   
end;

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.

Última edición por marcoszorrilla fecha: 01-03-2009 a las 15:43:13.
Responder Con Cita