Sunteți pe pagina 1din 6

Delphi & Excel

Trabalhando com a Paleta Servers para Automação

Tiago Pereira

A palheta SERVERS foi desenvolvida após um acordo entre a Microsoft e a Borland,


com o intuíto de possibilitar uma fácil interação dos recursos do Delphi com as
ferramentas do MS-Office.

Essa interação já era possível, antes, através da classe OLEServer que se baseia
em components da tecnologia COM. Agora com a paleta de componentes SERVERS
essa automação é feita a partir de componentes (VCL) que acessam os recursos
mais comuns da tecnologia COM.

Considerando a facilidade da interação, proviniente do uso dos compomentes do


Delphi, somado ainda a forte presença dos aplicativos MS-Office nas empresas, um
vasto leque de opções para solucionar troca de documentos, relatórios sofisticados
e apresentação de dados baseado em sistemas comerciais, tornan-se acessíveis a
todos os desenvolvedores que utilizam Delphi.

A figura abaixo mostra um formulário feito em Delphi que envia os dados a um


arquivo do Excel

Este formulário acessa os dados via BDE, através dos seguintes objetos:

TTable à Que está conectado com o Alias(BDE) DBDemos que acessa a tabela
Country.db
TDataSource à Faz a ligação entre a Table e objeto de exibição dos dados
(DBGrid)

TDBGrid à Este objeto funciona como um espelho da tabela ao qual está


conectado, neste objeto foram alteradas propriedade para seleçõs de linha e
seleção de multiplos registros.

Tabém um outro, o OpenDialog, é utilizado para que seja selecionado um arquivo


que já existente.

Os objetos mais interresantes no entanto, são os objetos da palheta SERVERS, que


fazem conexão com os serviços do Excel. Nesta aplicação só utilizaremos dois
destes objetos, que na prática são os mais interresantes, além de sem dúvida os
mais importantes com referência ao Excel. São eles:

1º - ExcelApplication à Este objeto faz referência a própria aplicação, ou seja, este


é o objeto que iremos utilizar quando quisermos manipular o Excel.

2º - ExcelWorkSheet à Este objeto faz referência direta a planilha ativa, ou seja,


este é o objeto que utilizaremos para manipular a planilha que estiver ativa seja
para inserir dados, imprimir, graver, etc...

OBS 1 : Vale lembrar que além dos objetos da palheta SERVERS para a
automação com Excel, utilizados nesta aplicação, existem outros que não são de
certa forma essenciais, mais implementam excelentes funcionalidades.

OBS 2 : Se em nosso projeto fossemos seguir a hierarquia padrão da Microsoft,


este, então , seria o terceiro objeto a utilizarmos e acima dele teriamos o objeto
WorkBook que faz referência ao documento ativo, pois no Excel as planilhas fazem
parte de um documento e podem ser várias planilhas no mesmo documento.

Resumo Geral da aplicação:

O desenvolvimento desta aplicação tem como objetivo auxiliary o programador a


criar um relatório em Excel que receberá dados de um formulário feito em Delphi.
Para isso foram criados procedimentos simples de acesso e envio de dados.

Agora sem mais delongas vamos ao que interresa:

var
Form1: TForm1;
lcid : Integer;
wkbk : _Workbook;
linha : Integer;
novoarq : String[1];
Caminho : String;

Esta é a primeira parte que nós interresa, a seção var, nesta seção foram criadas
cinco variáveis que serão usadas ao longo do projeto. São elas:

lcid à Sem esta Variável se torna quase que impossível manipular o Excel, pois a
maioria dos métodos manipuladas necessitam do valor retornado por esta variável,
que recebe o valor do usuário que está logado no Windows.
wkbk à Esta variável servirá para que possamos conectar a aplicação (Excel)
diretamente com a planilha que iremos utilizar, ou seja , fará a ligação entre o
ExcelApplication e o ExcelWorkSheet.

linha à Esta sera a variável que iremos utilizar para calcular em qual linha serão
inseridos os os dados, por exemplo Coluna A linha 2, Coluna B linha 2, Coluna C
linha 3 e daí por diante. Vale lembrar que esta variavel manipulará apenas a linha
que os dados serão incluídos e não as colunas (estas serão definidas ao longo do
projeto e deverão ser manipuladas palos programadores).

NovoArq à Esta variável servirá para sabermos se o usuário esta querendo criar um
novo arquivo ou abrindo um arquivo existente, ela receberá apenas dois valores
sendo eles ‘S’ ou ‘N’, que representarão SIM ou NÃO.

Caminho à Esta variável receberá o nome e o caminho do arquivo, caso o usuário


queira abrir um arquivo já existete do Excel.

procedure TForm1.AbreExcel;
begin
Caminho := '';

//testa se é um novo arquivo ou não

If novoarq = 'N' then


begin
OpenDialog1.Execute;
If OpenDialog1.FileName = '' then
// Caso não seja selecionado um arquivo
//não executa outros procedimentos
exit
Else
caminho := OpenDialog1.FileName;
end;

lcid := GetUserDefaultLCID;
//pega o usuário logado

ExcelApplication1.Visible[lcid] := true;
//torna a aplicação visível

ExcelApplication1.DisplayAlerts[lcid] := false;
//remove alertas do excel

if novoarq = 'S' then


// se for um novo arquivo, este
// procedimento cria o arquivo

wkbk := ExcelApplication1.Workbooks.Add(EmptyParam, lcid)


else
// Se for um arquivo existente, esta
//linha conecta a aplicação
//com o arquivo.
// OBS - Vale apena ver o nº de parametros
// e suas funcionalidades.
WkBk := ExcelApplication1.Workbooks.Open('c:\teste1.xls',
EmptyParam,
EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam,
EmptyParam, 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);

//torn possível fazer alterações


ExcelApplication1.ScreenUpdating[lcid] := true;

//Atribui um nome a planilha


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

{ Para que não seja possível que o usuário tente enviar


os dados sem
que exista uma aplicação aberta os botões que
servirão para enviaros dados iniciam a aplicação desabilitados e
somente quando é aberta
uma instância do Excel esses botões
se tornam habilitados}

if BTTodos.Enabled = False then


begin
BTTodos.Enabled := True;
BTSelecionados.Enabled := True;
end;
end;

A Segunda parte interresante do projeto é uma procedure que faz a abertura do


Excel, seja ela com um arquivo novo ou com um arquivo existente, pois as únicas
coisas diferentes entre os códigos são que para abrir um arquivo existente é
necessário saber o nome e o path(caminho) do arquivo, e o comando utilizado é o
Open e não o Add.

Para que exista um entendimento melhor deste código, vamos as procedure dos
botões que fazem a abertura do Excel.

procedure TForm1.BtArqExistenteClick(Sender: TObject);


begin
novoarq := 'N';
AbreExcel;
end;

procedure TForm1.BtNovoArqClick(Sender: TObject);


begin
novoarq := 'S';
AbreExcel;
end;

Não há muito a explicar agora, em um dos botões (BtArqExistente) é definido que


não é um arquivo novo e a procedure de abertura do Excel (AbreExcel) é
executada. E no outro botão (BtNovoArq) a única diferença é que a variável recebe
um valor que define que sera um arquivo novo.

Agora os procedimentos de envio de dados :


procedure TForm1.Titulo;
begin
ExcelWorksheet1.Range['A1', 'A1'].Value := 'NOME';
ExcelWorksheet1.Range['B1', 'B1'].Value := 'CAPITAL';
ExcelWorksheet1.Range['C1', 'C1'].Value := 'CONTINENTE';
ExcelWorksheet1.Range['D1', 'D1'].Value := 'AREA';
ExcelWorksheet1.Range['E1', 'E1'].Value := 'POPULAÇÃO';
end;

Este procedimento cria os titulos da tabela nas primeiras linhas do


arquivo.

A propriedade Range :

Esta propriedade define em qual coluna e linha serão colocados os


dados, podendo por exemplo começar na coluna A na linha 1 e ir até
a coluna C na linha 3.

procedure TForm1.BTTodosClick(Sender: TObject);


begin
linha := 1;
Table1.First;
Titulo;
While not table1.Eof do
begin
linha := linha + 1;
ExcelWorksheet1.Range['A'+ inttostr(linha),
'A'+inttostr(linha)].Value :=
Table1NAME.Value;
ExcelWorksheet1.Range['B'+ inttostr(linha),
'B'+inttostr(linha)].Value :=
Table1CAPITAL.Value;
ExcelWorksheet1.Range['C'+ inttostr(linha),
'C'+inttostr(linha)].Value :=
Table1Continent.Value;
ExcelWorksheet1.Range['D'+ inttostr(linha),
'D'+inttostr(linha)].Value :=
Table1Area.Value;
ExcelWorksheet1.Range['E'+ inttostr(linha),
'E'+inttostr(linha)].Value :=
Table1Population.Value;
Table1.Next
end;
end;

procedure TForm1.BTSelecionadosClick(Sender: TObject);


begin
if DBGrid1.SelectedRows.CurrentRowSelected = false then
// verifica se existe um registro selecionado.
begin
ShowMessage('Sem registro selecionado');
exit;
end;
linha := 1;
table1.First;

{ Enquanto não for o final da tabela, se existir algum


registro selecionado, os dados deste regintro
são enviados para a planilha (da 2º linha em diante,
já que a primeira linha é a linha de tituli) }

while not table1.Eof do


begin
if DBGrid1.SelectedRows.CurrentRowSelected = true then
begin
linha := linha + 1;
ExcelWorksheet1.Range['A'+ inttostr(linha),
'A'+inttostr(linha)].Value :=
Table1NAME.Value;
ExcelWorksheet1.Range['B'+ inttostr(linha),
'B'+inttostr(linha)].Value :=
Table1CAPITAL.Value;
ExcelWorksheet1.Range['C'+ inttostr(linha),
'C'+inttostr(linha)].Value :=
Table1Continent.Value;
ExcelWorksheet1.Range['D'+ inttostr(linha),
'D'+inttostr(linha)].Value :=
Table1Area.Value;
ExcelWorksheet1.Range['E'+ inttostr(linha),
'E'+inttostr(linha)].Value :=
Table1Population.Value;
Table1.Next;
end
else
table1.Next;
end;
end;

Algumas outros métodos interresantes que não foram utilizados no projeto:

ExcelWorksheet1. SaveAs(‘Nome do arquivo’);

Salve a planilha corrente no local e com o nome especificado.

ExcelWorksheet1.PrintOut; - Imprime a planilha corrente.

ExcelApplication.disconnect; - Este metódo é utilizado para desconectar o Excel, e


necesário que fique claro que este metódo fecha a aplicação mais não a descarrega
de memória, ou seja a aplicação fica fechada mais ainda continua utilizando espaço
em memória.

ExcelApplication1.Free; - Descarrega a aplicação (Excel) da memória.

Daqui para frente é com vocês, tanto na melhoria deste código quanto na utlização
dos outros objetos.

Um Abraço a todos.

tpersan@hotmail.com

Opinião é: digidata@digirio.com.br

S-ar putea să vă placă și