Erro na Exportação para Excel

Delphi

15/09/2014

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.


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

Wanderson Cortes

Curtidas 0

Respostas

Wanderson Cortes

Wanderson Cortes

15/09/2014

Alterei
Sheet.SaveAs(AFileName);

Por
Planilha.SaveAs(AFileName);


Aí me retorna o erro EOleException OLE error 800A03EC
GOSTEI 0
POSTAR