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;
for Columna:=0 to nCols - 1 do
begin
Excel.Cells[fila,columna + 1].Value:=DbgFacturas.Columns[Columna].Title.Caption;
end;
Fila:=Fila + 1;
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;
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;
for Columna:=0 to nCols - 1 do
begin
Excel.Cells[fila,columna + 1].Value:=DbgFacturas.Columns[Columna].Title.Caption;
end;
Fila:=Fila + 1;
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;
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.