Fórum Erro na Exportação para Excel #492173
15/09/2014
0
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
Curtir tópico
+ 0
Responder
Posts
15/09/2014
Wanderson Cortes
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
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)