sábado, janeiro 26, 2008

Exportando tabelas do MS Access para Excel ou HTML usando ADO

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çã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:

Anônimo disse...

Blza, funcionou certinho, mais um local nos meus favoritos

Anônimo disse...

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