Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

vitow

[Resolvido] importar dados do Excel para o delphi

Recommended Posts

galera estou precisando de uma ajuda:

 

estou querendo importar dados de uma planilha do excel para o Delphi, eu iria manipular esses dados e depois armazenar no BD MySQL!....

 

alguém tem alguma idéia de como posso fazer isso???

 

grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem duas formas eficientes de se fazer, uma é usando componentes, pode ser da paleta ADO, e outra acessando diretamente o Excel, podendo carregar tudo em um TStringGrid e trabalhar com os valores, qual das duas formas você acha que seria melhor para a sua situação ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

marcio...

 

acho que seria melhor utilizando o TStringGrid, carregando todos os dados do excel e depois eu os manipularei, selecionado os dados que eu quero ou não e salvar no MySQL.

 

mas eu nunca usei o TStringGrid, o procurei na paleta não achei!!...

 

como faço para utiliza-lo e carregar o dados do excel nele??

Compartilhar este post


Link para o post
Compartilhar em outros sites

O mesmo se encontra na paleta Additional... pode criar a seguinte função:

 

function XlsToStringGrid(AGrid: TStringGrid; AXLSFile: string): Boolean;
const
	xlCellTypeLastCell = $0000000B;
var
	XLApp, Sheet: OLEVariant;
	RangeMatrix: Variant;
	x, y, k, r: Integer;
begin
Result:=False;
//Cria Excel- OLE Object
XLApp:=CreateOleObject('Excel.Application');
try
	//Esconde Excel
	XLApp.Visible:=False;
	//Abre o Workbook
	XLApp.Workbooks.Open(AXLSFile);
	Sheet:=XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];
	Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
	//Pegar o número da última linha
	x:=XLApp.ActiveCell.Row;
	//Pegar o número da última coluna
	y:=XLApp.ActiveCell.Column;
	//Seta Stringgrid linha e coluna
	AGrid.RowCount:=x;
	AGrid.ColCount:=y;
	//Associaca a variant WorkSheet com a variant do Delphi
	RangeMatrix:=XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;
	//Cria o loop para listar os registros no TStringGrid
	k:=1;
	repeat
		for r:=1 to y do
			AGrid.Cells[(r - 1),(k - 1)]:=RangeMatrix[K, R];
		Inc(k,1);
	until k > x;
	RangeMatrix:=Unassigned;
finally
	//Fecha o Excel
	if not VarIsEmpty(XLApp) then
		begin
		XLApp.Quit;
		XLAPP:=Unassigned;
		Sheet:=Unassigned;
		Result:=True;
		end;
	end;
end;

Vai retornar se conseguiu ou não carregar, precisa apenas colocar um StringGrid na tela, e chamar a função, algo como:

 

XlsToStringGrid(StringGrid1,'c:\arquivo_excel.xls');

Compartilhar este post


Link para o post
Compartilhar em outros sites

oi marcio....

 

estudei todo o código!! testei e ficou perfeito.... http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

obrigado!!

 

 

 

mas.... vou te explorar mais um pouquinho hehehhehe

tipo, o usuário teria que selecionar o local onde o arquivo está localizado, então eu teria que criar aquele formulário de localização de arquivos do windows?? ou o windows já disponibiliza isso??

por exemplo: no delphi você clica no File > Open abrirá uma interface onde o usuário seleciona o arquivo que deseja abrir... entendeu???

 

eu to querendo desenvolver isso tambem! Onde o usuário selecionasse a planilha que ele queira abrir. Você teria como me dar mais essa Luz!! :D

 

 

grato!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

No delphi tem componente específico para isto, na paleta Dialogs chamado OpenDialog, podendo fazer:

 

if OpenDialog1.Execute then
	XlsToStringGrid(StringGrid1,OpenDialog1.FileName);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem duas formas eficientes de se fazer, uma é usando componentes, pode ser da paleta ADO, e outra acessando diretamente o Excel, podendo carregar tudo em um TStringGrid e trabalhar com os valores, qual das duas formas você acha que seria melhor para a sua situação ?

Buenas.

Como seria a segunda opção:

"...uma é usando componentes, pode ser da paleta ADO..."

Pois quero importar direto para meu banco de dados.

Desde já agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No delphi tem componente específico para isto, na paleta Dialogs chamado OpenDialog, podendo fazer:

 

if OpenDialog1.Execute then
	XlsToStringGrid(StringGrid1,OpenDialog1.FileName);

 

OLA MARCIO,

 

CONSEGUI FAZER O PROCEDIMENTO E DEU CERTINHO. A DUVIDA AGORA É COMO FAÇO PRA GRAVAR DA STRINGGRID PARA MINHA TABELA DO BANCO.

 

ABRAÇO E OBRIGADO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Basta usar um laço para varrer seu stringgrid e gravar os dados. Um exemplo é esta rotina que fiz para gravar os dados de um stringgrid usando uma Stored Procedure. Basta você adaptar para o seu caso.

 

procedure TfrmImportaPlanilhaCamposGeradorConsulta.GravaTabelasBanco;
var iIndice : Integer;
begin
   with sgridTabelas do //StringGrid
   begin
	  For iIndice := 1 to RowCount -1 do
	  begin
		 DM.ExecutaComando('STP_INSERE_TB_TABELAS_ANALISE ' +
							QuotedStr(Cells[0, iIndice]) + ',' +					  //Coluna 1 do StringGrid
							QuotedStr(Cells[1, iIndice]), DM.qryDBNegocio);  //Coluna 2 do StringGrid
	  end;
   end;
end;

Adaptando o código acima você consegue fazer o seu próprio. Qualquer coisa posta ai.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

olá Marcio, estou parado neste ponto....ja carreguei o arquivo .xls para o stringgrid.....o problema agora eh jogar para o banco, (USO FIREBIRD)...qual melhor maneira de fazer isso?? começando pela conexao do banco...obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual seria o componente DM.EXECUTACOMANDO ???

 

Provavelmente seja um Procedure ou Function no DataModule DM...

 

Exatamente isto Marcio, é uma função dentro do datamodule. Nela eu passo a sql e a query que irá executar a mesma no programa.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia

 

Respondendo as perguntas:

 

1. Uso o Delphi 7

2. O erro acontece na Execução, quando vai executar a linha:

const

xlCellTypeLastCell = $0000000B;

 

Quando vai criar a constante: xlCellTypeLastCell

 

3. O Execell espa instalado, uso Windows XP.

 

4. VOu criar um topico novo.

 

Aguardo Resp.

Compartilhar este post


Link para o post
Compartilhar em outros sites

To com uma duvida parecida pessoal... assim.. só pra explicar.. eu NÃO programo em Delphi... só mexi com Delphi há uns 5 anos atrás na faculdade.. e mesmo assim só o básico do básico... aí entrei num emprego novo agora e meu chefe quer que eu faça uma "aplicaçãozinha" pra pegar uns dados que estejam num memo (ou grid) e salvar num arquivo do Excel.

 

A versão final dessa aplicação será tipo assim:

1 - importar uma lista de matricula e nomes do banco de dados;

2 - mostra a lista na tela (num memo ou grid);

2.5 - dá a opção do usuário adicionar novos nomes E/OU matrículas na lista.

3 - salva num excel.

 

A versão atual (para testes) seria importar do excel, mostrar os dados, permitir a adição manual de novos dados e posteriormente exportar para um outro arquivo do excel (com nome automatico usando yyyymmddhhnnss).

 

será que alguém pode me dar uma ajuda pra fazer essa parte? nem que seja só salvar o conteúdo desse grid num novo xls?

 

vlwws!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Pessoal.

 

Me deparei com este erro.

O método Activate da classe Range falhou'

 

O Problema se encontra expecificamente em Plan1.

 

Minha pergunta é: Existe alguma função que formate a Plan1?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dá uma olhada neste Post... faz um bom tempo eu postei como fazer para gravar dados e gerar planilhas num arquivo excell, exportando dados de um dbgrid para uma planilha.

 

E sugiro que crie sempre um post novo, não reabra posts já encerrados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.