Planilhas Excel

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
daniel.pinna
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 27 Fev 2007 2:23 pm
Localização: Rio de janeiro
Daniel Pinna

Fala pessoal,

Tenho a seguinte dúvida. Preciso ler os dados de um arquivo excel e jogar no forms. Ok consegui fazer isso com a ajuda de vocês, através de alguns códigos.
Só que no código eu tenho que dizer o nome da planilha que vou coletar os dados.
Gostaria de saber como faço para coletar os dados independente do nome da planilha......

Segue abaixo o código:

Selecionar tudo

DECLARE
	-- DECLARAÇÃO DE OBJETOS
	APPLICATION OLE2.OBJ_TYPE; --EXCEL
	WORKBOOKS   OLE2.OBJ_TYPE;
	WORKBOOK    OLE2.OBJ_TYPE; --ARQUIVO XLS
	WORKSHEET   OLE2.OBJ_TYPE;--PLANILHAS
	CELL        OLE2.OBJ_TYPE;
	font        OLE2.OBJ_TYPE;

	-- DECLARA LISTA DE ARGUMENTOS
  ARGS        OLE2.LIST_TYPE;

  ROWCOUNT NUMBER := 1;
   
	BEGIN
		
	--volta com o cursor para o 1º record
	FIRST_RECORD;	
	---------------------------------------------------------------------------------------------------------------------
	
	SET_APPLICATION_PROPERTY (CURSOR_STYLE, 'BUSY');

	-- ABRE A APLICAÇÃO
	APPLICATION := OLE2.CREATE_OBJ('EXCEL.APPLICATION');

	-- CRIA UM ARQUIVO PARA TRABALHO
	WORKBOOKS := OLE2.GET_OBJ_PROPERTY(APPLICATION, 'WORKBOOKS');
	WORKBOOK  := OLE2.GET_OBJ_PROPERTY(WORKBOOKS,'ADD');

	-- ABRI UMA PLANILHA PLAN1
	ARGS := OLE2.CREATE_ARGLIST;
	OLE2.ADD_ARG(ARGS,'PLAN1');
	WORKSHEET := OLE2.GET_OBJ_PROPERTY(WORKBOOK, 'WORKSHEETS',ARGS);
	OLE2.DESTROY_ARGLIST(ARGS);

	-------------------------------------------------------------------------------------------------------------------
	-- GERA CABEÇALHO
	-- COLUNA 1 - CONTA
	ARGS := OLE2.CREATE_ARGLIST;
	OLE2.ADD_ARG(ARGS, 1); -- ROW NUMBER
	OLE2.ADD_ARG(ARGS, 1); -- COLUMN NUMBER
	CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET, 'CELLS', ARGS);
	OLE2.DESTROY_ARGLIST(ARGS);	
	OLE2.SET_PROPERTY(CELL, 'VALUE', 'Nro. Conta');	
  font := ole2.get_obj_property (cell, 'Font');
	ole2.set_property (font, 'Name', 'Comics');
	ole2.set_property (font, 'Size', '11');
	ole2.set_property (font, 'Bold', TRUE);
  OLE2.SET_PROPERTY(font, 'ColorIndex', 3);  --Preto (3, Red)
	OLE2.RELEASE_OBJ(font);	  
  OLE2.RELEASE_OBJ(CELL);
	
	-- COLUNA 2 - Dígito
	ARGS := OLE2.CREATE_ARGLIST;
	OLE2.ADD_ARG(ARGS, 1); -- ROW NUMBER
	OLE2.ADD_ARG(ARGS, 2); -- COLUMN NUMBER
	CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET, 'CELLS', ARGS);
	OLE2.DESTROY_ARGLIST(ARGS);
	OLE2.SET_PROPERTY(CELL, 'VALUE', 'Dígito Conta');
	font := ole2.get_obj_property (cell, 'Font');
	ole2.set_property (font, 'Name', 'Arial');
	ole2.set_property (font, 'Size', '12');
	ole2.set_property (font, 'Italic', TRUE);
  OLE2.SET_PROPERTY(font, 'ColorIndex', 3);  --Preto (3, Red)
	OLE2.RELEASE_OBJ(font);	 
	OLE2.RELEASE_OBJ(CELL);
	
		-- COLUNA 3 - COD NEGOCIO
	ARGS := OLE2.CREATE_ARGLIST;
	OLE2.ADD_ARG(ARGS, 1); -- ROW NUMBER
	OLE2.ADD_ARG(ARGS, 3); -- COLUMN NUMBER
	CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET, 'CELLS', ARGS);
	OLE2.DESTROY_ARGLIST(ARGS);
	OLE2.SET_PROPERTY(CELL, 'VALUE', 'Descrição Conta');
  --font := OLE2.GET_OBJ_PROPERTY(CELL, 'Font', args);
  font := ole2.get_obj_property (cell, 'Font');
	ole2.set_property (font, 'Name', 'Times New Roman');
	ole2.set_property (font, 'Size', '12');
	ole2.set_property (font, 'Bold', TRUE);
  OLE2.SET_PROPERTY(font, 'ColorIndex', 3);  --Preto (3, Red)
	OLE2.RELEASE_OBJ(font);	 
	OLE2.RELEASE_OBJ(CELL);
  
	---------------------------------------------------------------------------------------------------------------

	WHILE :CONTROLE.DADOS IS NOT NULL LOOP
		
		ROWCOUNT := ROWCOUNT + 1;
	-------------------------------------------------------------------------------------------------------------------
		-- DADOS
		-- POPULA COLUNA 1
		ARGS := OLE2.CREATE_ARGLIST;
		OLE2.ADD_ARG(ARGS, ROWCOUNT); -- LINHA COLUNA
		OLE2.ADD_ARG(ARGS, 1);        -- COLUNA NUMERO
		CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET, 'CELLS', ARGS);
		OLE2.DESTROY_ARGLIST(ARGS);		   
		OLE2.SET_PROPERTY(CELL, 'COLUMNWIDTH', 20);
		OLE2.SET_PROPERTY(CELL, 'VALUE', TO_CHAR (:CONTROLE.DADOS));
		OLE2.RELEASE_OBJ(CELL);

		-- POPULA COLUNA 2
		ARGS := OLE2.CREATE_ARGLIST;
		OLE2.ADD_ARG(ARGS, ROWCOUNT); -- LINHA NUMERO
		OLE2.ADD_ARG(ARGS, 2);        -- COLUNA NUMERO
		CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET, 'CELLS', ARGS);
		OLE2.DESTROY_ARGLIST(ARGS);
		OLE2.SET_PROPERTY(CELL, 'COLUMNWIDTH', 20);
		OLE2.SET_PROPERTY(CELL, 'VALUE', TO_CHAR (:CONTROLE.DADOS));
		OLE2.RELEASE_OBJ(CELL);

		-- POPULA COLUNA 3
		ARGS := OLE2.CREATE_ARGLIST;
		OLE2.ADD_ARG(ARGS, ROWCOUNT); -- LINHA NUMERO
		OLE2.ADD_ARG(ARGS, 3);        -- COLUNA NUMERO
		CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET, 'CELLS', ARGS);
		OLE2.DESTROY_ARGLIST(ARGS);
		OLE2.SET_PROPERTY(CELL, 'VALUE', :CONTROLE.DADOS);
		OLE2.SET_PROPERTY(CELL, 'COLUMNWIDTH', 25);
		OLE2.RELEASE_OBJ(CELL);
		

		NEXT_RECORD;
	
		---------------------------------------------------------------------------------------------------------------
	END LOOP;
	--RENOMEIA O NOME DA PLANILHA
	ole2.set_property(WORKSHEET,'Name','Konda');
	----------------------------------------------------------------------------------------------------------------
	
	-- EXIBINDO A PLANILHA 
	OLE2.SET_PROPERTY(APPLICATION,'VISIBLE', TRUE);
	
	----------------------------------------------------------------------------------------------------------------
	
	-- SALVANDO O AQRUIVO
	ARGS := OLE2.CREATE_ARGLIST;
	OLE2.ADD_ARG(ARGS, 'c:\TESTE.XLS');
	OLE2.INVOKE(WORKSHEET, 'SaveAs', ARGS);
	OLE2.DESTROY_ARGLIST(ARGS);
	 
------------------------------------------------------------------------------------------------------------------

	--FECHANDO O ARQUIVO E APLICAÇÃO
	ARGS := OLE2.CREATE_ARGLIST;
	OLE2.ADD_ARG(ARGS, 0);
	OLE2.INVOKE(WORKBOOK, 'Close', ARGS);
	OLE2.DESTROY_ARGLIST(ARGS);

----------------------------------------------------------------------------------------------------------------
	
	
	-- DELETANDO VARIAVEIS E OBJETOS
	OLE2.RELEASE_OBJ(WORKSHEET);
	OLE2.RELEASE_OBJ(WORKBOOK);
	OLE2.RELEASE_OBJ(WORKBOOKS);
	OLE2.RELEASE_OBJ(APPLICATION);
	SET_APPLICATION_PROPERTY (CURSOR_STYLE, 'DEFAULT');
EXCEPTION
	WHEN OTHERS THEN
		SET_APPLICATION_PROPERTY (CURSOR_STYLE, 'DEFAULT');
		CLEAR_MESSAGE;
    OLE2.Release_Obj( application );
    message('Error'||sqlerrm);
		RAISE FORM_TRIGGER_FAILURE;
END;

Desde já grato pela ajuda,
Daniel Pinna
:-o
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother, não sei se ajuda, mas, vale fazer o teste.

1) No diretório onde estão as planilhas, você poderia executar

Selecionar tudo

DIR *.XLS > ARQUIVO.TXT
e ir guardando seus nomes;

2) Pelo forms, realizar um loop, lendo o nome das planilhas.

qualquer coisa, manda ai.
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Bom, depois de penar pra achar, resolvi publicar aqui para poder ajudar quem precisar fazer isso também:

Como trocar a cor de fundo ( BGColor ou cor de preenchimento ) de uma célula, usando os passos dados neste mesmo tópico

Selecionar tudo


Declare
     v_interior OLE2.OBJ_TYPE;
begin
     ...
     ...

     v_interior := ole2.get_obj_property(CELL,'Interior');
     ole2.set_property(v_interior,'ColorIndex',15); --cinza
     ole2.release_obj(v_interior);
     ...
Quanto às cores:

http://www.mvps.org/dmcritchie/excel/colors.htm
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Show de bola !!! :-D
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Pessoal, tenho uma dúvida/problema no fechamento de uma planilha do Excel e, gostaria de saber se alguém já passou por isso:

Quando se fecha uma aplicação dessa forma:

Selecionar tudo

   --FECHANDO O ARQUIVO E APLICAÇÃO 
   ARGS := OLE2.CREATE_ARGLIST; 
   OLE2.ADD_ARG(ARGS, 0); 
   OLE2.INVOKE(WORKBOOK, 'Close', ARGS); 
   OLE2.DESTROY_ARGLIST(ARGS); 
O processo do Windows fica no "ar" e, quanto mais planilhas abertas, mais processos Excel no gerenciador.

Alguém saberia como finalizar este processo, assim que fechar?

Grato,
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

E aí trevisolli, beleza??

Então cara.. pra evitar que o Excel fique aberto na memória, use o seguinte:

Selecionar tudo


OLE2.RELEASE_OBJ(WORKSHEET);
OLE2.RELEASE_OBJ(WORKBOOK);
OLE2.RELEASE_OBJ(WORKBOOKS);
OLE2.RELEASE_OBJ(APPLICATION); 

:D
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Fala Toad, beleza?

Então brother, até tenho essa finalização, antes do meu Exception, conforme a seguir:

Selecionar tudo

	-- RELEASE ALL OLE OBJECT HANDLES
	OLE2.RELEASE_OBJ(WORKSHEET);
	OLE2.RELEASE_OBJ(WORKBOOK);
	OLE2.RELEASE_OBJ(WORKBOOKS);
	OLE2.RELEASE_OBJ(APPLICATION);
Mas, percebi que ele somente derruba o serviço, se clicar no Fechar do Excel mesmo ...
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Eu tenho isso antes do meu exception tb... e Funciona...

Meu programa finaliza da seguinte forma:

Selecionar tudo


-- LIBERA RECIPIENTES DA MEMÓRIA
	OLE2.RELEASE_OBJ(WORKSHEET);
	OLE2.RELEASE_OBJ(WORKBOOK);
	OLE2.RELEASE_OBJ(WORKBOOKS);
	OLE2.RELEASE_OBJ(APPLICATION);
	
	SET_APPLICATION_PROPERTY (CURSOR_STYLE, 'DEFAULT');

	SET_ALERT_PROPERTY('AVISO',ALERT_MESSAGE_TEXT,'Planilha gerada com sucesso em '|| DIRETORIO);
  V_ALERT := SHOW_ALERT('AVISO');
 
	
EXCEPTION
	WHEN OTHERS THEN
		SET_APPLICATION_PROPERTY (CURSOR_STYLE, 'DEFAULT');
		
		CLEAR_MESSAGE;
		OLE2.RELEASE_OBJ(WORKSHEET);
    OLE2.RELEASE_OBJ(WORKBOOK);
    OLE2.RELEASE_OBJ(WORKBOOKS);
    OLE2.Release_Obj( application );
    message('Error'||sqlerrm);
    SET_ALERT_PROPERTY('AVISO',ALERT_MESSAGE_TEXT,'Erro ao salvar o arquivo');
      V_ALERT := SHOW_ALERT('AVISO');
		RAISE FORM_TRIGGER_FAILURE;
END;

Assim que o Excel é fechado, o serviço sai da memória, sem precisar clicar em nada...

Quais versões você está usando do Excel e Forms ? :roll:
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Trevisolli, achei uma solução na base da força bruta e com alguns inconvenientes... não sei se pode te ajudar...

Se seu programa estiver rodando sob o Windows XP você pode tentar usar a seguinte 'solução':

Selecionar tudo


Declare
...
FINALIZA_EXCEL CONSTANT VARCHAR2(30) := 'taskkill /im excel.exe';
...

BEGIN
...

-- LIBERA RECIPIENTES DA MEMÓRIA
  	 OLE2.RELEASE_OBJ(WORKSHEET);
	   OLE2.RELEASE_OBJ(WORKBOOK);
	   OLE2.RELEASE_OBJ(WORKBOOKS);
	   OLE2.RELEASE_OBJ(APPLICATION);
	   HOST(FINALIZA_EXCEL,NO_SCREEN); <- Manda ele fechar o processo excel.exe
Porém, se o usuário estiver com mais instâncias do Excel aberto, ele vai tentar fechar também...
Eu entendi o que você quis dizer...
Aqui, é óbvio que vai tirar da memória sempre, pois eu sempre deixo a tela aberta para o user ver os resultados.
No seu caso, você quer salvar e fechar o EXCEL sem intervenção do usuário, correto?
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Deixando menos tosco, e agora fechando APENAS a sessão do Excel que a gente quer:

Selecionar tudo

Declare
...
FINALIZA_EXCEL  VARCHAR2(4000);
V_NOME  VACHAR2(4000); -- Var que armazenará o nome do arquivo.
...

BEGIN
...

V_NOME := 'TESTE DO ARQUIVO.XLS';

--PERMITA A APLICAÇÃO DO EXCEL EXIBIR VER O RESULTADO.
  OLE2.SET_PROPERTY(APPLICATION,'VISIBLE', TRUE)

-- LIBERA RECIPIENTES DA MEMÓRIA
      OLE2.RELEASE_OBJ(WORKSHEET);
      OLE2.RELEASE_OBJ(WORKBOOK);
      OLE2.RELEASE_OBJ(WORKBOOKS);
      OLE2.RELEASE_OBJ(APPLICATION);
      FINALIZA_EXCEL := 'taskkill -fi "WINDOWTITLE eq Microsoft Excel - '||v_nome||'"'; --Ainda usando o taskkill... 
      HOST(FINALIZA_EXCEL,NO_SCREEN); <- Manda ele fechar o processo excel.exe 
Agora ele tira, com certeza, da memória...

Ainda estou pesquisando formas melhores....

Abraços!
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

ola pessoal..

tem como recuperar o nome das planilias dinamicamente, tipo eu indicar o arquivo e ele recuperar os nomes dos worksheets desta planilia???


abrçs
kaizer
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Seg, 29 Nov 2010 4:23 pm
Localização: Novo Hamburgo-RS

Amigos,

Preciso ler arquivo .jpg e inserir o mesmo em uma coluna de planilha excel via forms 6i. Eu consigo criar uma planilha com campos do tipo char, date e number, porém não sei como fazer isso com uma imagem. Alguém tem algo semelhante para me ajudar ?
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Olá kaizer,
Cara não sei se imagens são possiveis de incluir em um excel via forms, sei que em alguns casos semelhantes aqui na empresa é criado para o excel um hiperlink do diretório em que a imagem esta. Assim é possivel visualizar as imagens. Agora transportar a imagem para o excel não sei mesmo...
lopesah
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Ter, 30 Nov 2010 3:19 pm
Localização: Hortolândia - SP
Contato:
Alexandre Henrique Lopes
Programador Oracle

Amigos,

Eu sei que desta maneira que passaram funciona bem pelo Forms 6i, mas alguém sabe como faço pra converter um código parecido com esse pro Forms 10g?
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 8 visitantes