Tentei simplificar ao máximo a vida de quem utilizará esses procedimentos (se é que alguém utilizará rsrs), pois a grande maioria dos artigos sobre este assunto, ou pelo menos os que encontrei quando precisei utilizar, são bastante complicados e com recursos que normalmente não precisamos.
O código está bastante simplificado,
porém bem objetivo e, acredito eu, bastante útil.
A exportação será feita com os seguintes passos:
1. Criação de uma instância visível do MS Excel na máquina do usuário (Abre o
Excel)
2. Adiciona quantas “plans” forem necessárias para armazenar os dados
3. Escreve os títulos através de comandos de atribuição
4. Escreve os dados contidos em uma Query na planilha selecionada, através de um
loop (while not eof )
5. Aplica o dimensionamento automático das células para que tenhamos um ajuste
perfeito
6. Ao final o método Quit e Disconnect finalizam a utilização do componente
Ao final da execução, o usuário terá o Excel aberto com a(s) planilha(s)
escrita(s ) automaticamente pelo código e deverá apenas salvar a planilha,
normalmente.
Agora, vamos ao que interessa – o Código!
Adicione os componentes
TExcelApllication (que aqui chamei de Excel), TExcelWorksheet (chamada de
ExcelWorkSheet1), TProgressBar (prog).
Aqui, criaremos uma procedure para o preparo da exportação dos dados
procedure TFrmForm1.ExpExcel;
var
LCID : Integer;
i: integer;
begin
LCID := GetUserDefaultLCID;
with Excel do
begin
Connect; //Conectando ao componente TExcelApllication
try
Workbooks.Add(EmptyParam, LCID); //Abrindo
(internamente) uma nova instancia //do MS Excel
//Com o Loop abaixo, adiciona-se quantas
planilhas forem necessárias. Neste caso, //estamos fazendo com que sejam
exibidas 7 planilhas. Assim, além das 3 que o //Excel abre como padrão, o código
adicionará mais 4
for i:=1 to 7 do
begin
if Worksheets.Count = 7 then break;
Worksheets.Add(Null,Null,null,null,LCID);
end;
ExpQuery(LCID); // Implementaremos a seguir esta
procedure, que terá a função // de exportar, efetivamente, os dados.
prog.Position := 0; // ao fim da exportação a
barra de progresso recebe 0
//abaixo, faremos com que a WorkSheet[1] (a
primeira planilha) seja conectada, //ativada e exibida (visible:= true)
ExcelWorkSheet1.ConnectTo(Excel.Worksheets[1] as
_Worksheet);
ExcelWorkSheet1.Activate;
Visible[LCID] := True;
//Quit; //caso queira fechar o excel, o método
quit pode ser utilizado
finally
//Após a exportação, haja erro ou não, o
componente TExcelApplication será //desconectado.
Disconnect;
end;
end;
end;
Aqui implementaremos a procedure de exportação, efetiva, dos dados.
procedure TFrmEleg.ExpQuery(LCID: Integer);
var
lin: integer;
begin
//Seleciona a planilha em que trabalharemos que no caso é a primeira plan
(Worksheet[1])
ExcelWorkSheet1.ConnectTo(Excel.Worksheets[1] as _Worksheet);
//Ativa esta planilha
ExcelWorkSheet1.Activate;
// Dá a ela um nome
ExcelWorkSheet1.Name := 'Nome da Planilha';
lin:=2; //atribui 2 a variável que indicará a linha que será utilizada
para escrever os dados
with Excel do
begin
//nomeação das colunas na planilha que estamos criando
Range['A1','A1'].Value2 := 'Nome da Coluna A1';
Range['B1','B1'].Value2 := 'Nome da Coluna B1';
Range['C1','C1'].Value2 := 'Nome da Coluna C1';
with QueryComOsDados do //QueryComOsDados é uma TQuery
contendo os dados que //advindos do Banco de Dados, os quais serão exportados.
begin
Close; open; first;
prog.Max := RecordCount; //definindo o valor
máximo da barra de progresso, que é //o total de registros da Query, já que
exportaremos // todas as linhas da mesma
while not EOF do //Até o fim da Query...
begin
//Abaixo, fazemos uma atribuição dos
campos da tabela à célula em que //queremos que estes dados sejam escritos
// 'A'+inttostr(lin) retorna A2, A3,
A4 de acordo com cada repetição
Range['A'+inttostr(lin),'A'+inttostr(lin)].Value2
:=FieldByName('campo1').Value;
Range['B'+inttostr(lin),'B'+inttostr(lin)].Value2
:= FieldByName('campo2').Value;
Range['C'+inttostr(lin),'C'+inttostr(lin)].Value2
:= FieldByName('campo3').Value;
Next; // Vai para o segundo registro
da Query com os dados
prog.Position := prog.Position + 1;
//Incrementa a barra de progresso
lin:=lin+1; // incrementa a variável
lin para que o os dados do próximo registro // sejam escritos na próxima linha
da planilha
end;
Close; //Fecha a Query
end;
// Utiliza o recurso auto-dimensionar para ajustar o tamanho
das colunas
Columns.AutoFit;
// Centraliza o texto contido no intervalo de células entre
A1 e última linha utilizada de C
Range['A1', 'C'+inttostr(lin)].HorizontalAlignment :=
xlcenter;
end;
end;
Por fim, devemos adicionar a chamada da procedure principal (ExpExcel) dentro de
algum botão:
procedure TFrmForm1.btExportarClick(Sender: TObject);
begin
//rotina de exportação para o excel
ExpExcel;
end;
A procedure ExpExcel, como vimos, contém uma chamada para a função ExpQuery que,
como também vimos, fará a exportação dos dados contidos em uma Query para uma
planilha do Excel.
Espero ter ajudado. Boa Sorte e Bons Resultados!!
Abraços!
Marcelo Zeferino
marcelo.zeferino@personati.com
|