Jump to content

Archived

This topic is now archived and is closed to further replies.

Chrnos

[Resolvido] Planilha Excell

Recommended Posts

Estive lendo este tópico http://forum.imasters.com.br/index.php?showtopic=259016 e tentei adaptar ele para pegar dados em várias worksheets dentro da mesma planilha, mas não estou conseguindo fazer... alguém pode dar uma dica de como faço para poder numa mesma busca pegar dados de N worksheets de uma planilha do Excell?

Share this post


Link to post
Share on other sites

A princípio nesta linha:

Sheet:=XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];
No item WorkSheets[1] precisaria mudar para pegar de outro...

No caso se puder, coloque o fonte que estava montando.

Share this post


Link to post
Share on other sites

Olá Marcio,

 

Então... eu tentei fazer isso passando o worksheet como um integer pra função. Para a primeira chamada vai beleza, mas na segunda dá erro na linha do Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate.

 

O código da função seria este:

 

function TfrmImportaPlanilhaCamposGeradorConsulta.XlsToStringGrid(AGrid: TStringGrid; AXLSFile, Range: string; WorkSheet: Integer): 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[WorkSheet];
		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[Range, 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;[code]

Na chamada, estou fazendo assim:

[code]procedure TfrmImportaPlanilhaCamposGeradorConsulta.btnCarregarPlanilhaClick(
  Sender: TObject);
const Teste = 'C:\Documents and Settings\emanuel.wollmann\Meus documentos\Lista de Tabelas Campos Gerador.xls';
begin
   XlsToStringGrid(sgridTabelas, Teste, 'A1', 1);
   XlsToStringGrid(sgridCampos, Teste, 'A2', 2);
   XlsToStringGrid(sgridJoins, Teste, 'A3', 3);
end;

A arquivo excel tem 3 planilhas dentro dele, uma com uma relação de tabelas, outro com campos e outro com cláusulas de controle que devo importar nas diferentes bases onde o programa irá ser executado.

Share this post


Link to post
Share on other sites

Como eu disse antes, ele acusa erro nesta linha:

 

Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

 

Diz que não consegue executar o Activate.

Share this post


Link to post
Share on other sites

Se eu trocar as linhas:

 

Sheet :=  XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[WorkSheet];
		Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

Pela linha:

 

XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[WorkSheet].Activate;

Eu consigo mudar de planilha e até acessá-la... o problema é que perco a referência de quantas colunas e linhas existem nesta planilha... <_<

 

Mas já é algum avanço :wacko:

Share this post


Link to post
Share on other sites

Acho que consegui resolver o problema agora... pelo menos na minha planilha o código abaixo trouxe os resultados que eu queria para o meu grid!!

 

function TfrmImportaPlanilhaCamposGeradorConsulta.XlsToStringGrid(AGrid: TStringGrid; AXLSFile, Range: string; WorkSheet: Integer): 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);
		//Setar na planilha desejada
		XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[WorkSheet].Activate;
		// Para saber a dimensão do WorkSheet (o número de linhas e de colunas),
		//selecionamos a última célula não vazia do worksheet
		Sheet :=  XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[WorkSheet];
		Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Select;		   
		//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[Range, 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;

Problema resolvido. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Share this post


Link to post
Share on other sites

Maneiro o script, peguei aqui pra aprender e gostei, mas estou com algumas duvidas

 

 

-------------------------------------------------------------------------------------------------------

1º - Qual é o significado disso, qual a sua função?

 

xlCellTypeLastCell = $0000000B;

 

-------------------------------------------------------------------------------------------------------

2º - Qual é o significado de Workbook, o que é ele na planilha?

 

//Abre o Workbook
	XLApp.Workbooks.Open(AXLSFile);

 

 

-------------------------------------------------------------------------------------------------------

3º - Como assim Setar a planilha desejada, seria aquelas abas pequenas que aparecem quando você cria um novo documento (Plan1 / Plan2 / Plan3)?

Aqui deu problema, tive que remover essa linha, o depurador acusa que "WorkSheets", "WorkSheet" e "Activate" são Undeclared identifier

 

//Setar na planilha desejada
		XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[WorkSheet].Activate;

 

 

-------------------------------------------------------------------------------------------------------

4º - Como a 5ª linha deu erro nas palavras "WorkSheets", "WorkSheet" e "Activate", a 9ª linha tambem deu erro.

 

// Para saber a dimensão do WorkSheet (o número de linhas e de colunas),
		//selecionamos a última célula não vazia do worksheet
		Sheet :=  XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[WorkSheet];
		Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Select;

Com isso tive que substituir pelo código abaixo, mas a palavra "WorkSheets" ainda continuou sublinhada, porem o programa rodou.

 

Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];

 

-------------------------------------------------------------------------------------------------------

5º - Entendi que nesta linha o código vai pegar os dados da planilha, até o limite que você impor.

 

//Associaca a variant WorkSheet com a variant do Delphi
		RangeMatrix:=XLApp.Range[Range, XLApp.Cells.Item[X, Y]].Value;

Como não entendi da onde vinha o Range na hora de chamar a função eu coloquei 'A1', então teria como me explicarem melhor esse Range?

 

 

-------------------------------------------------------------------------------------------------------

6º - Nesta hora, ele relaciona os valores aos campos do TStringGrid, pude notar que a leitura do TStringGrid é ao contrario da Planilha... coluna primeiro que linha.

 

//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;

 

-------------------------------------------------------------------------------------------------------

7º - Isso seria para limpar a memória ou algo assim, podem me explicar melhor?

 

RangeMatrix := Unassigned;

 

-------------------------------------------------------------------------------------------------------

8º - Não entendi como chamar a função no exemplo de vocês, todo caso adaptei com um speedbutton e um opendialog, ficou mais ou menos assim.

 

procedure TForm1.SpeedButton1Click(Sender: TObject);
		begin
		  if (OpenDialog1.Execute) then
			  Edit1.Text := OpenDialog1.FileName;
		end;

		procedure TForm1.Button1Click(Sender: TObject);
		begin
		  XlsToStringGrid(StringGrid1,OpenDialog1.FileName);
		end;

Você podem me explicar melhor como ficou para chamar a de vocês?

 

 

-------------------------------------------------------------------------------------------------------

 

 

 

Meu programa ta rodando, mas estou com duvidas sobre ele, caso tenhão curiosidade o meu código ficou assim...

 

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, Buttons, ComObj;

type
  TForm1 = class(TForm)
	GroupBox1: TGroupBox;
	GroupBox2: TGroupBox;
	OpenDialog1: TOpenDialog;
	Edit1: TEdit;
	SpeedButton1: TSpeedButton;
	Button1: TButton;
	RadioButton1: TRadioButton;
	RadioButton2: TRadioButton;
	ComboBox1: TComboBox;
	ComboBox2: TComboBox;
	Label1: TLabel;
	Button2: TButton;
	GroupBox3: TGroupBox;
	StringGrid1: TStringGrid;
	Numero_1: TLabel;
	Numero_2: TLabel;
	Label2: TLabel;
	Label3: TLabel;
	Label4: TLabel;
	Label5: TLabel;
	Label6: TLabel;
	Label7: TLabel;
	Label8: TLabel;
	Label9: TLabel;
	Label10: TLabel;
	Label11: TLabel;
	Label12: TLabel;
	Label13: TLabel;
	Label14: TLabel;
	Label15: TLabel;
	Label16: TLabel;
	Label17: TLabel;
	Label18: TLabel;
	Label19: TLabel;
	Label20: TLabel;
	Label21: TLabel;
	Label22: TLabel;
	Label23: TLabel;
	Label24: TLabel;
	Label25: TLabel;
	Label26: TLabel;
	Label27: TLabel;
	Label28: TLabel;
	Label29: TLabel;
	Label30: TLabel;
	Label31: TLabel;
	Label32: TLabel;
	Label33: TLabel;
	Label34: TLabel;
	Label35: TLabel;
	Label36: TLabel;
	Label37: TLabel;
	Label38: TLabel;
	Label39: TLabel;
	Label40: TLabel;
	Label41: TLabel;
	Label42: TLabel;
	Label43: TLabel;
	Label44: TLabel;
	Label45: TLabel;
	Label46: TLabel;
	Label47: TLabel;
	Label48: TLabel;
	Label49: TLabel;
	Label50: TLabel;
	Label51: TLabel;
	Label52: TLabel;
	Label53: TLabel;
	Label54: TLabel;
	Label55: TLabel;
	Label56: TLabel;
	Label57: TLabel;
	Label58: TLabel;
	Label59: TLabel;
	procedure SpeedButton1Click(Sender: TObject);
	procedure Button1Click(Sender: TObject);
  private
	{ Private declarations }
  public
	{ Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function XlsToStringGrid(AGrid: TStringGrid; AXLSFile: string): Boolean;
{
  XlsToStringGrid = Nome da função
  TStringGrid = Componente "Additional"
  AXLSFile = Nome da variavel que recebe o arquivo

  Sheet = Abas da planilha

}

const
	xlCellTypeLastCell = $0000000B;
var
	XLApp, Sheet: OLEVariant;
	RangeMatrix: Variant;
	MAX_LINHA, MAX_COLUNA, LINHA, COLUNA: 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);

	//Setar na planilha desejada
	//XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[WorkSheet].Activate;

	//Seleciona a ultima celula não vazia do worksheet
	Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];
	Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Select;

	//Pegar o número da última linha
	MAX_LINHA := XLApp.ActiveCell.Row;
	//Pegar o número da última coluna
	MAX_COLUNA := XLApp.ActiveCell.Column;

	//Seta Stringgrid linha e coluna
	AGrid.RowCount := MAX_LINHA + 1;
	AGrid.ColCount := MAX_COLUNA + 1;

	//Associaca a variant WorkSheet com a variant do Delphi
	RangeMatrix:=XLApp.Range['A1', XLApp.Cells.Item[MAX_LINHA, MAX_COLUNA]].Value;

	//Cria um loop para ler todos os dados do arquivo e mandar para o TStringGrid
	for LINHA := 1 to MAX_LINHA do
	  for COLUNA := 1 to MAX_COLUNA do
		begin
		  //O TStringGrid le ao contrario do arquivo, primeiro coluna, depois linha
		  AGrid.Cells[COLUNA, LINHA] := RangeMatrix[LINHA, COLUNA];
		end;

	RangeMatrix := Unassigned;
finally
	//Fecha o Excel
	if not VarIsEmpty(XLApp) then
		begin
		XLApp.Quit;
		XLAPP:=Unassigned;
		Sheet:=Unassigned;
		Result:=True;
		end;
	end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if (OpenDialog1.Execute) then
	  Edit1.Text := OpenDialog1.FileName;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  XlsToStringGrid(StringGrid1,OpenDialog1.FileName);
end;

end.

 

Como podem ver eu consegui usar o código, mas não entendi ele 100%;

Share this post


Link to post
Share on other sites

Bom, vamos lá.

 

1°) O xlCellTypeLastCell é um comando especial do próprio Excell para pegar a última célula, coluna ou linha de uma planilha. Mais sobre o assunto você pode encontrar pesquisando na net ou pegando este link como referência: http://www.rondebruin.nl/last.htm.

 

2°) O objeto Workbook representa uma pasta de trabalho do Microsoft Excel. O objeto Workbook é um membro da coleção Workbooks. A coleção Workbooks contém todos os objetos Workbook atualmente abertos no Microsoft Excel. Sugiro que dê uma lida neste link para maiores informações: http://www.juliobattisti.com.br/cursos/exc...ulo6/licao5.asp

 

3°) Exatamente isso... eu precisava de um código que me permitisse ler N planilhas de um arquivo ao mesmo tempo... ai entra o comando para setar a planilha desejada de acordo com o número da planilha passada por parâmetro. O WorkSheet é o número que informo para setar a planilha que eu quero pegar (se tiver Plan1, Plan2 e Plan3 por exemplo, na primeira chamada o worksheet recebe 1, na segunda 2 e pra pegar a terceira planilha é 3).

 

4°) Que erro?

 

5°) Não tem muito o que se dizer... este comando é só pro programa saber até onde existem dados a serem lidos na planilha, de acordo com os valores setados anteriormente para X e Y.

 

6°) Exato.

 

7°) Faz com que o objeto OLE criado para interagir com o Excell seja liberado.

 

8°) O exemplo que eu passei para chamar a rotina foi o seguinte:

 

procedure TfrmImportaPlanilhaCamposGeradorConsulta.btnCarregarPlanilhaClick(
  Sender: TObject);
const Teste = 'C:\Documents and Settings\emanuel.wollmann\Meus documentos\Lista de Tabelas Campos Gerador.xls';
begin
   XlsToStringGrid(sgridTabelas, Teste, 'A1', 1);
   XlsToStringGrid(sgridCampos, Teste, 'A2', 2);
   XlsToStringGrid(sgridJoins, Teste, 'A3', 3);
end;

No exemplo, eu criei uma constante Teste onde eu indicava o caminho completo e o arquivo a ser importado. Além disso, em cada chamada eu passo um StringGrid, o nome do arquivo, o range e a planilha que quero acessar deste arquivo para carregar no StringGrid passado como parâmetro.

 

[]'s

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.