Chrnos 30 Denunciar post Postado Outubro 2, 2008 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? Compartilhar este post Link para o post Compartilhar em outros sites
marcio.theis 3 Denunciar post Postado Outubro 2, 2008 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. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Outubro 2, 2008 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. Compartilhar este post Link para o post Compartilhar em outros sites
marcio.theis 3 Denunciar post Postado Outubro 2, 2008 Tentou rodar passo-a-passo e ver em qual linha gera o erro ? Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Outubro 2, 2008 Como eu disse antes, ele acusa erro nesta linha: Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate; Diz que não consegue executar o Activate. Compartilhar este post Link para o post Compartilhar em outros sites
marcio.theis 3 Denunciar post Postado Outubro 2, 2008 Acontece o erro mesmo, estranho demais isto... Sobrar um tempo vou ver algo sobre... caso encontre a solução posta pra nós :D Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Outubro 2, 2008 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: Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Outubro 2, 2008 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 Compartilhar este post Link para o post Compartilhar em outros sites
marcio.theis 3 Denunciar post Postado Outubro 2, 2008 beleza... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
marciocorbolan 0 Denunciar post Postado Outubro 18, 2008 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%; Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Outubro 20, 2008 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 Compartilhar este post Link para o post Compartilhar em outros sites