Exportar para Excel com imagens

Olá pessoal, tenho notado que muitos colegas procuram funções para exportação de tabelas e/ou relatórios para Excel. Existem inúmeros exemplos na internet com este propósito, porém me deparei com um problema nos últimos dias: a inclusão de imagens. Depois de dias pesquisando consegui obter uma boa resposta do meu colega de ClubeDelphi Michael. Uma dica importante que me fez ter algum parâmetro na busca de uma solução. A dica foi o uso da função AddPicture recomendada pelo site MSDN.

 

Set myDocument = Worksheets(1)

myDocument.Shapes.AddPicture _

    "c:\microsoft office\clipart\music.bmp", _

    True, True, 100, 100, 70, 70

 

Com base nesta informação foi mais fácil chegar a tão sonhada função. Neste artigo montei um exemplo, bastante interessante, que mostra como exportar para Excel usando os componentes da paleta Servers.

Conhecendo os componentes

Vamos trabalhar basicamente com dois componentes da paleta Servers: TExcelApplication e TExcelWorkSheet, responsáveis pelas tarefas de conectar-se ao Excel e a Planilhas respectivamente.

Montando o exemplo

Para montar este exemplo desenvolva uma aplicação semelhante a Figura1.

 

Figura 1. Tela exemplo de exportação para Excel.

Faça as ligações necessárias para que a tabela (TTable) funcione corretamente. Neste exemplo usei o alias DBDEMOS e a tabela Países (Country). A primeira coisa a desenvolvermos é a função que criará e abrirá o Excel pra nós. Para isso declare as variáveis LCID do tipo Integer e WKBK do tipo _Workbook na seção Public do nosso form. (veja a Listagem 1).

 

Listagem 1. Declaração das variáveis globais necessárias.

var

  Form1: TForm1;

  LCID: Integer;

  WKBK: _Workbook;

implementation

 

Logo em seguida digite o algoritimo necessário para a criação e abertura do Excel conforme a Listagem 2. O próprio algoritimo contém as explicações necessárias para cada linha de código, cada função.

 

Listagem 2. Criação do novo arquivo Excel

procedure TForm1.btnNovoClick(Sender: TObject);

begin

  //Pega o usuário logado

  LCID := GetUserDefaultLCID;

 

  //Torna a aplicação visível

  ExcelApplication1.Visible[LCID] := True;

 

  //Remove alertas do excel

  ExcelApplication1.DisplayAlerts[LCID] := false;

 

  //Cria o novo arquivo

  WKBK := ExcelApplication1.Workbooks.Add(EmptyParam, LCID);

 

  // Conecta a planilha (1) que será a planilha a receber os dados

  ExcelWorksheet1.ConnectTo(WKBK.Worksheets[1] as _Worksheet);

 

  //Ativa a planilha conectada

  ExcelWorksheet1.Activate(LCID);

 

  //Torna possível fazer alterações

  ExcelApplication1.ScreenUpdating[LCID] := True;

 

  //Atribui um nome a planilha

  ExcelWorksheet1.Name := 'Relatórios via Excel'; 

end;

 

Agora o segundo passo é inserir os dados da tabela Country no Excel. Neste passo apenas faremos um Loop no componente TTable e escreveremos os dados na Planilha aberta. (veja Listagem 3).

 

Listagem 3. Inclusão dos dados na planilha.

procedure TForm1.btnInserirDadosClick(Sender: TObject);

var

  Linha : Integer;

begin

  Linha := 1;

  Table1.First;

 

  {$IFDEF VER150}

    xlsSheet.Range['A1', 'A1'].Value2 := 'NOME';

    xlsSheet.Range['B1', 'B1'].Value2 := 'CAPITAL';

    xlsSheet.Range['C1', 'C1'].Value2 := 'CONTINENTE';

    xlsSheet.Range['D1', 'D1'].Value2 := 'AREA';

    xlsSheet.Range['E1', 'E1'].Value2 := 'POPULAÇÃO';

  {$ELSE}

    xlsSheet.Range['A1', 'A1'].Value := 'NOME';

    xlsSheet.Range['B1', 'B1'].Value := 'CAPITAL';

    xlsSheet.Range['C1', 'C1'].Value := 'CONTINENTE';

    xlsSheet.Range['D1', 'D1'].Value := 'AREA';

    xlsSheet.Range['E1', 'E1'].Value := 'POPULAÇÃO';

  {$ENDIF}

 

  with Table1 do begin

    while not EOF do

    begin

      Linha := Linha + 1;

      {$IFDEF VER150}

        xlsSheet.Range['A' + IntToStr(Linha), 'A' + IntToStr(Linha)].Value2 := FieldByName('NAME').AsString;

        xlsSheet.Range['B' + IntToStr(Linha), 'B' + IntToStr(Linha)].Value2 := FieldByName('CAPITAL').AsString;

        xlsSheet.Range['C' + IntToStr(Linha), 'C' + IntToStr(Linha)].Value2 := FieldByName('Continent').AsString;

        xlsSheet.Range['D' + IntToStr(Linha), 'D' + IntToStr(Linha)].Value2 := FieldByName('Area').AsString;

        xlsSheet.Range['E' + IntToStr(Linha), 'E' + IntToStr(Linha)].Value2 := FieldByName('Population').AsString;

      {$ELSE}

        xlsSheet.Range['A' + IntToStr(Linha), 'A' + IntToStr(Linha)].Value := FieldByName('NAME').AsString;

        xlsSheet.Range['B' + IntToStr(Linha), 'B' + IntToStr(Linha)].Value := FieldByName('CAPITAL').AsString;

        xlsSheet.Range['C' + IntToStr(Linha), 'C' + IntToStr(Linha)].Value := FieldByName('Continent').AsString;

        xlsSheet.Range['D' + IntToStr(Linha), 'D' + IntToStr(Linha)].Value := FieldByName('Area').AsString;

        xlsSheet.Range['E' + IntToStr(Linha), 'E' + IntToStr(Linha)].Value := FieldByName('Population').AsString;

      {$ENDIF}

      Next;

    end;

  end;

end;

 

Note que a Listagem 3 é um pouco mais longa devido a criação de títulos para as colunas onde os dados serão inseridos. Além de conter uma pequena verificação, por meio de diretivas de compilação, para sabermos em qual Delphi está sendo compilado o aplicativo, pois até a versão 6 da ferramenta usa-se a propriedade Value, já na versão 7 a mesma propriedade Value muda de nome e passa a se chamar Value2.

 

Bem, agora fica faltando a fase mais importante do artigo: a inclusão de imagens na planilha ativa. Neste caso, como dito no início do artigo, usaremos a função AddPicture do componente TExcelWorksheet e é muito simples. (veja Listagem 4).

 

Listagem 4. Inclusão da imagem

procedure TForm1.btnInserirImagemClick(Sender: TObject);

begin

  // LinkToFile = Marque True se deseja que a imagem seja inserida apenas como um link.

  // SaveWithDocument = Deve ser marcada como True se o parâmetro LinkToFile for False.

  // Left = Posição Left da imagem

  // Top = Posição Top da imagem

  // Width = Largura

  // Height = Altura

  if opgDialogo.Execute then

    xlsSheet.Shapes.AddPicture(opgDialogo.FileName, 0, 1, 1, 1, 150, 150);

end;

 

Para finalizar o artigo aconselho estudar também as funções :

 

ExcelWorksheet1.SaveAs('Nome do arquivo');

ExcelWorksheet1.PrintOut;

ExcelApplication.Disconnect;

ExcelApplication1.Free;

Conclusões

Neste artigo vimos, de maneira bastante simples, como criar planilhas Excel usando os componentes da paleta Servers. Vimos também como inserir imagens, o que pode ser bastante útil quando necessitamos incluir logotipos e outros tipos de figura.