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ção
Declare 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.
2 comentários:
Blza, funcionou certinho, mais um local nos meus favoritos
possuo uma consulta de produtos com fornecedores e gostaria de exportar para um arquivo excel em q cada aba foçe o nome de um fornecedor..como faço??/ poeria ser tb cada forneçedor em uma tabela nova..agradeço a ajuda...mlops@superig.com.br...me respondam
Postar um comentário