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.