Salve pessoal,
Um recurso bem interessante porém pouco conhecido sobre o ADO, é que ele permite através do
JET (mecanismo usado para acessar bancos de dados Access) a possibilidade de exportação direta para planilhas do Excel (XLS) e arquivos HTML. Pensando nisso, revolvi postar um exemplo de como se fazer isso em Delphi, vamos lá!
Primeiramente, criamos um formulário com os elementos mostrados abaixo:
Temos aí:
- 3 Tbitbtn: btnAbrir, btnExportaXLS e btnExportaHTM;
- 1 TListbox: listTabelas, que seá usado para exibir as tabelas presentes no database;
- 1 TADOConnection: conAccess, responsável por estabelecer a conexão com o database;
- 1 TOpenDialog: openDialog, que será usado para selecionar o banco de dados a ser usado;
CodificaçãoDeclare uma função na sessão private da unit, com o seguinte header:
function TabelasADO(ADOConnection: TADOConnection):TStringList;
Seu corpo deve ficar como abaixo:
function TfrmExemplo.TabelasADO(ADOConnection: TADOConnection): TStringList;
var ADODataSet: TADODataSet; Tabelas: TStringList;
begin
Tabelas := TStringList.Create;
ADODataSet := TADODataSet.Create(nil);
ADODataSet.Connection := ADOConnection;
ADOConnection.OpenSchema(siTables, EmptyParam, EmptyParam, ADODataSet);
//Filtra somente as tabelas
ADODataSet.Filter := adicionaFiltro(ADODataSet.Filter, '(TABLE_TYPE = ''TABLE'')');
ADODataSet.Filtered := True;
with ADODataSet do
begin
First;
while not EOF do
begin
Tabelas.Add(FieldByName('TABLE_NAME').AsString);
Next;
end;
end;
ADODataSet.Free;
Result := Tabelas;
end;
Precisaremos também de outra função:
function adicionaFiltro(string1, string2: string): string;
Com o código listado abaixo:
function TfrmExemplo.adicionaFiltro(string1, string2: string): string;
begin
if string1 <> '' then
Result := string1 + ' or ' + string2
else
Result := string2;
end;
O evento
onClick do botão
btnAbrir fica como a seguir:
procedure TfrmExemplo.btnAbrirClick(Sender: TObject);
var stringConexao: string;
begin
stringConexao := EmptyStr;
if openDialog.Execute then
begin
stringConexao := Format('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False',[openDialog.FileName]);
conAccess.ConnectionString := stringConexao;
conAccess.Connected := True;
listTabelas.Items := TabelasADO(conAccess);
end;
end;
Por fim, o evento
onClick do botão
btnExportaXLS, que também é compartilhado com o botão btnExportaHTM, reaproveitando código:
procedure TfrmExemplo.btnExportaXLSClick(Sender: TObject);
var nomeTabela, instrucaoSQL: string;
begin
nomeTabela := listTabelas.Items[listTabelas.ItemIndex];
if Sender = btnExportaXLS then
instrucaoSQL := 'select * into ' + nomeTabela + ' in "c:\doctemp\' + nomeTabela + 'FromAccess.xls" "Excel 8.0;" from ' + nomeTabela
else
instrucaoSQL := 'select * into [' + nomeTabela + '.htm] in "c:\doctemp" "HTML Export;" from ' + nomeTabela;
try
conAccess.Execute(instrucaoSQL);
MessageDlg('A tabela ' + nomeTabela + 'foi exportada com sucesso para o formato selecionado!', mtInformation, [mbOk], 0);
except
MessageDlg('Não foi possível exportar a tabela "' + nomeTabela + '"', mtError, [mbOK], 0);
end;
end;
Algumas consideração a fazer: meu formulário se chama
frmExemplo; eu possuo uma pasta chamada
"doctemp" em minha máquina, que é para onde eu exporto meus arquivos, uso isso no código e é provável que precisem modificar isso.
Bem, quem estiver precisando, pode fazer o teste e, em caso de dúvidas sobre algum trecho do código, é só comentar.
Abraços e até a próxima.