Erro na Exportação para Excel
Tenho uma rotina de exportação pra excel que funciona perfeitamente quando executo dentro da minha aplicação.
Porém, criei um service application que faz um select e exporta esse resultado num arquivo txt ou excel.
Ele chama a mesma rotina de exportar para excel que minha aplicação desktop usa, porém no serviço ele da um erro no método SaveAs: "EOleError Method 'SaveAs' not supported by automation object"
Alguém saberia me explicar por que? Abaixo segue minha rotina de exportar para excel.
Porém, criei um service application que faz um select e exporta esse resultado num arquivo txt ou excel.
Ele chama a mesma rotina de exportar para excel que minha aplicação desktop usa, porém no serviço ele da um erro no método SaveAs: "EOleError Method 'SaveAs' not supported by automation object"
Alguém saberia me explicar por que? Abaixo segue minha rotina de exportar para excel.
function salvarArquivoExcel(ACds: TClientDataSet; ANomePlanilha: string = ''; AFileName: string = ''; AMostraSaveDialog: Boolean = True): String;
var
planilha : variant;
i, coluna, linha : Integer;
nomeDoCampo : String;
sheet : variant;
begin
try
Result := '';
if AMostraSaveDialog then
AFileName := salvarArquivo('Pasta de Trabalho do Excel (*.xlsx)|*.xlsx|Pasta de Trabalho do Excel 97-2003 (*.xls)|*.xls',
'',
'*.xlsx',
'Salvar Como...',
AFileName);
if AFileName <> '' then
begin
if ANomePlanilha = '' then
ANomePlanilha := 'Planilha';
ACds.DisableControls;
planilha := CreateOleObject('Excel.Application');
planilha.Caption := ANomePlanilha;
planilha.Visible := False;
planilha.Workbooks.Add(1);
planilha.Workbooks[1].Sheets.Add;
planilha.Workbooks[1].WorkSheets[1].Name := ANomePlanilha;
Sheet := planilha.Workbooks[1].WorkSheets[ANomePlanilha];
///////////////////////////////////////////////////////////////////////////
/// Preenchendo o Cabeçalho /
///////////////////////////////////////////////////////////////////////////
coluna := 1;
linha := 1;
for i := 0 to ACds.FieldCount - 1 do
begin
Sheet.Cells[linha, coluna] := ACds.Fields[i].DisplayName;
Sheet.Cells[linha, coluna].Font.Bold := True;
Sheet.Cells[linha, coluna].Borders.LineStyle := 0.9;
Inc(coluna, 1);
end;
///////////////////////////////////////////////////////////////////////////
/// Preenchendo o Corpo
///////////////////////////////////////////////////////////////////////////
linha := 2;
ACds.First;
while not ACds.Eof do
begin
coluna := 1;
for i := 0 to ACds.FieldCount - 1 do
begin
nomeDoCampo := ACds.Fields[i].DisplayName;
Sheet.Cells[linha, coluna].Borders.LineStyle := 0.8;
if ACds.FieldByName(nomeDoCampo).DataType in [ftTimeStamp, ftDateTime, ftDate] then
begin
Sheet.Cells[linha, coluna].NumberFormat := 'dd/MM/aaaa';
if ACds.FieldByName(nomeDoCampo).Value > 0 then
Sheet.Cells[linha, coluna] := ACds.FieldByName(nomeDoCampo).asDateTime;
end
else
if ACds.FieldByName(nomeDoCampo).DataType = ftFloat then
begin
Sheet.Cells[linha, coluna].NumberFormat := TFloatField(ACds.FieldByName(nomeDoCampo)).DisplayFormat; // '#.##0,00';
if TFloatField(ACds.FieldByName(nomeDoCampo)).DisplayFormat = '###,##0.00' then
Sheet.Cells[linha, coluna].NumberFormat := '#.##0,00';
Sheet.Cells[linha, coluna] := ACds.FieldByName(nomeDoCampo).Value;
end
else
Sheet.Cells[linha, coluna] := ACds.FieldByName(nomeDoCampo).Value;
Inc(coluna, 1);
end;
Inc(linha, 1);
ACds.Next;
end;
Sheet.Columns.AutoFit;
Sheet.SaveAs(AFileName);
ACds.EnableControls;
planilha.quit;
planilha := Null;
planilha := Unassigned;
Result := AFileName;
end;
except
on e : Exception do
Result := e.Message;
end;
end;
Wanderson Cortes
Curtidas 0
Respostas
Wanderson Cortes
15/09/2014
Alterei
Por
Aí me retorna o erro EOleException OLE error 800A03EC
Sheet.SaveAs(AFileName);
Por
Planilha.SaveAs(AFileName);
Aí me retorna o erro EOleException OLE error 800A03EC
GOSTEI 0