Tutorial: COMO EXPORTAR DO FORMS PARA O EXCEL:

Coloque aqui tutoriais (por enquanto, sobre qualquer assunto relacionado a Oracle) e apostilas.
Responder
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

Como está tudo muito espalhado, resolvi juntar tudo em um lugar só.

Esse tutorial explicará como criar um arquivo do Excel, a partir de um cursor, ou de vários campos, conforme a necessidade, usando OLE2.



Primeiramente, crie a seguinte procedure PREENCHE_CEL:

Selecionar tudo


-- ESSA PROCEDURE É A RESPONSÁVEL PELO PREENCHIMENTO DE CADA CÉLULA DO ARQUIVO DO EXCEL.
PROCEDURE PREENCHE_CEL(WORKSHEET IN OUT OLE2.OBJ_TYPE, 
                       CELL IN OUT OLE2.OBJ_TYPE,
                       ARGS IN OUT OLE2.LIST_TYPE, 
                       Row_num number,                    -- linha
                       Col_num number,                    -- coluna
                       TITULO VARCHAR2,                   -- o que vai ser inserido na célula
                       COL_WIDTH NUMBER,                  -- tamanho da coluna
                       FONT_NAME VARCHAR2,                -- nome da fonte
                       FONT_SIZE VARCHAR2,                -- tamanho da fonte
                       FONT_BOLD BOOLEAN,                 -- deve ser bold?
                       FONT_ITAL BOOLEAN,                 -- deve ser itálico?
                       COR_INDEX NUMBER,                  -- índice da cor da fonte
                       Align binary_integer DEFAULT null, -- alinhamento horizontal do texto
                       formato VARCHAR2 DEFAULT NULL,    
                       -- formato de entrada do dado ('Geral', '0','#.##0,00', 'dd/mm/aa', 'd/m/aa h:mm AM/PM') 
                       
                       Tipo varchar2 default 'VALUE',     -- tipo do dado, se valor ('VALUE') ou fórumla ('FORMULA')
                       BGCOR_INDEX NUMBER DEFAULT 0)IS    -- índice da cor de fundo
 FONT       OLE2.OBJ_TYPE;
 v_interior OLE2.OBJ_TYPE;
  
BEGIN
  ARGS := OLE2.CREATE_ARGLIST;
	OLE2.ADD_ARG(ARGS, Row_num); -- ROW NUMBER
	OLE2.ADD_ARG(ARGS, Col_num); -- COLUMN NUMBER
	CELL := OLE2.GET_OBJ_PROPERTY(WORKSHEET, 'CELLS', ARGS);
	OLE2.DESTROY_ARGLIST(ARGS);
	OLE2.SET_PROPERTY(CELL, Tipo, TITULO); 
	if COL_WIDTH is not null then
	   OLE2.SET_PROPERTY(CELL, 'COLUMNWIDTH', COL_WIDTH);
	end if; 
	font := ole2.get_obj_property (cell, 'Font');
  OLE2.SET_PROPERTY (font, 'Name', FONT_NAME);
  OLE2.SET_PROPERTY (font, 'Size', FONT_SIZE);
  OLE2.SET_PROPERTY (font, 'Bold', FONT_BOLD);
  OLE2.SET_PROPERTY (font, 'Italic', FONT_ITAL);
  -- ALTERA CORES DA ÁRVORE 

  OLE2.SET_PROPERTY(font, 'ColorIndex', COR_INDEX);  --0,Preto (3, Red)
  if Align is not null then
     OLE2.SET_PROPERTY(CELL, 'HorizontalAlignment', Align);
  end if; 
  if formato is not null then
     OLE2.SET_PROPERTY(CELL, 'NumberFormat', formato);
  END IF;
  
  v_interior := ole2.get_obj_property(CELL,'Interior');
  ole2.set_property(v_interior,'ColorIndex',BGCOR_INDEX); 
  ole2.release_obj(v_interior);
 
	OLE2.RELEASE_OBJ(font);	
	OLE2.RELEASE_OBJ(CELL);
END;


Compile. Não deve dar nenhum erro.
Agora, declare no botão que vai fazer a exportação, o seguinte:

Selecionar tudo

 
  --WHEN-BUTTON-PRESSED por exemplo:
     
  DECLARE
     -- DECLARA VARIÁVEIS PARA OS OBJETOS. 
     APPLICATION OLE2.OBJ_TYPE; 
     WORKBOOKS OLE2.OBJ_TYPE; 
     WORKBOOK OLE2.OBJ_TYPE; 
     WORKSHEET OLE2.OBJ_TYPE; 
     CELL OLE2.OBJ_TYPE; 
     FONT OLE2.OBJ_TYPE; 
     
     -- DECLARA RECIPIENTES PARA LISTAS DE ARGUMENTOS OLE 
     ARGS OLE2.LIST_TYPE; 
     V_ALERT      number; 
     ROWCOUNT     NUMBER := 1; -- contador de linhas
     COLCOUNT     NUMBER := 1; -- contador de colunas
     V_NOME       VARCHAR2( 260 ) ; 
     DIRETORIO    VARCHAR2( 256 ) ; 
     V_DIR_MODELO VARCHAR2( 60 ) ; 
     
     -- DECLARA SUBTIPOS DE FORMATAÇÃO
     SUBTYPE xlHAlign IS binary_integer; 
     CENTER                CONSTANT xlHAlign := - 4108; 
     CENTERACROSSSELECTION CONSTANT xlHAlign := 7; 
     DISTRIBUTED           CONSTANT xlHAlign := - 4117; 
     FILL                  CONSTANT xlHAlign := 5; 
     GENERAL               CONSTANT xlHAlign := 1; 
     JUSTIFY               CONSTANT xlHAlign := - 4130; 
     LEFT                  CONSTANT xlHAlign := - 4131; 
     RIGHT                 CONSTANT xlHAlign := - 4152; 	
  BEGIN
  	
  	 ...
  	 
  	 SET_APPLICATION_PROPERTY( CURSOR_STYLE, 'BUSY' ) ; -- cursor de sistema ocupado
  	 
  	 -- DECLARA RECIPIENTES PARA OBJETO DE APLICAÇÃO
     APPLICATION := OLE2.CREATE_OBJ( 'EXCEL.APPLICATION' ) ; 
     -- CRIA UMA COLEÇÃO DE WORKBOOKS E ADICIONA UM NOVO WORKBOOK
     WORKBOOKS := OLE2.GET_OBJ_PROPERTY( APPLICATION, 'WORKBOOKS' ) ; 
     WORKBOOK  := OLE2.GET_OBJ_PROPERTY( WORKBOOKS, 'ADD' ) ; 
     -- ABRE A WORKSHEET PLAN1 NO WORKBOOK
     ARGS := OLE2.CREATE_ARGLIST; 
     OLE2.ADD_ARG( ARGS, 'PLAN1' ) ; 
     WORKSHEET := OLE2.GET_OBJ_PROPERTY( WORKBOOK, 'WORKSHEETS', ARGS ) ; 
     OLE2.DESTROY_ARGLIST( ARGS ) ;
     ...
    /* Parâmetros: 
           PREENCHE_CEL(WORKSHEET,CELL,ARGS,Row_num,Col_num,TITULO CHAR,COL_WIDTH NUMBER,FONT_NAME VARCHAR2,FONT_SIZE VARCHAR2,
           FONT_BOLD BOOLEAN,FONT_ITAL BOOLEAN,COR_INDEX NUMBER, ALINHAMENTO, FORMATO NUMERICO, value ou formula?, BGColor )IS  
           0=Preto; 3=Vermelho; 5=Dark Blue ; 13=Cinza 
    */   
    ...
    -- supondo que C_GERAL seja seu cursor que retorna todos os dados necessários, faça:
     for d in C_GERAL 
     LOOP 
     	
        COLCOUNT   := 1; -- DIZ QUE ELE DEVE COMEÇAR A PREENCHER NA PRIMEIRA COLUNA
      
        PREENCHE_CEL( WORKSHEET, CELL, ARGS, ROWCOUNT, COLCOUNT, d.id_prof     , NULL, 'Arial', '10', FALSE, FALSE, 0 ) ; 
        -- codigo do profissional
        
        COLCOUNT := COLCOUNT + 1;  -- AGORA ELE DEVE PREENCHER NA SEGUNDA COLUNA
        PREENCHE_CEL( WORKSHEET, CELL, ARGS, ROWCOUNT, COLCOUNT, d.profissional, NULL, 'Verdana', '10', TRUE, FALSE, 0 ) ; 
        -- nome dele em bold Verdana
        
        COLCOUNT := COLCOUNT + 1;  -- AGORA ELE DEVE PREENCHER NA TERCEIRA COLUNA
        PREENCHE_CEL( WORKSHEET, CELL, ARGS, ROWCOUNT, COLCOUNT, To_char( d.dt_inclusao, 'DD/MM/RRRR' ) , 
        NULL, 'Arial', '10', FALSE, FALSE, 0, NULL, 'dd/mm/aaaa' ) ; 
        
        COLCOUNT := COLCOUNT + 1;  -- AGORA ELE DEVE PREENCHER NA QUARTA COLUNA
        PREENCHE_CEL( WORKSHEET, CELL, ARGS, ROWCOUNT, COLCOUNT, d.devedor , NULL, 'Arial', '10', FALSE, FALSE, 0, 
        NULL, '#.##0,00', 'VALUE', decode(d.devedor,0,3,5) ) ; 
        -- se devedor = 0, o fundo fica vermelho. Se devedor diferente de 0, fundo fica azul.
                
        COLCOUNT := COLCOUNT + 1;  -- AGORA ELE DEVE PREENCHER NA QUINTA COLUNA
        PREENCHE_CEL( WORKSHEET, CELL, ARGS, ROWCOUNT, COLCOUNT, v_p.total     , NULL, 'Arial', '10', FALSE, TRUE, 0, 
        NULL, '#.##0,00' ) ; -- total em itálico
        
        ROWCOUNT := ROWCOUNT + 1; -- ADICIONA UMA LINHA
     END LOOP;
     
     -- PRONTO, ELE CARREGOU TODOS OS DADOS DO CURSOR PARA DENTRO DO ARQUIVO EXCEL, TOTALMENTE FORMATADO.
        
     -- PERMITE AO USER VER A APLICAÇÃO DO EXCEL PARA VER O RESULTADO.
     OLE2.SET_PROPERTY( APPLICATION, 'VISIBLE', TRUE ) ; 
     ---------------------------------------------------------------------------------------------------------------- 
      -- SALVANDO O ARQUIVO 
      
               V_NOME = 'O_NOME_DO_ARQUIVO.XLS'; 
               DIRETORIO    := 'C:\sua_pasta\'||V_NOME; 
               V_DIR_MODELO := 'C:\sua_pasta\'; 
               
               ARGS         := OLE2.CREATE_ARGLIST; 
               OLE2.ADD_ARG( ARGS, DIRETORIO ) ; 
               OLE2.INVOKE( WORKSHEET, 'SaveAs', ARGS ) ; 
               OLE2.DESTROY_ARGLIST( ARGS ) ; 
     ------------------------------------------------------------------------------------------------------------------ 
       --FECHANDO O ARQUIVO E APLICAÇÃO -- comente para não fechar automaticamente.
               /*
               ARGS := OLE2.CREATE_ARGLIST; 
               OLE2.ADD_ARG(ARGS, 0);
               OLE2.INVOKE(WORKBOOK, 'Close', ARGS);
               OLE2.DESTROY_ARGLIST(ARGS);
               --*/ 
      ----------------------------------------------------------------------------------------------------------------  
       -- LIBERA RECIPIENTES DA MEMÓRIA
               OLE2.RELEASE_OBJ( WORKSHEET ) ; 
               OLE2.RELEASE_OBJ( WORKBOOK ) ; 
               OLE2.RELEASE_OBJ( WORKBOOKS ) ; 
               OLE2.RELEASE_OBJ( APPLICATION ) ; 
      
      ----------------------------------------------------------------------------------------------------------------  
       -- EXIBE UMA MENSAGEM CONFIRMANDO               
               
       SET_APPLICATION_PROPERTY( CURSOR_STYLE, 'DEFAULT' ) ; -- cursor volta ao normal.
       SET_ALERT_PROPERTY( 'AVISO', ALERT_MESSAGE_TEXT, 'Planilha gerada com sucesso em '|| DIRETORIO ) ; 
       V_ALERT := SHOW_ALERT( 'AVISO' ) ; 
    
  EXCEPTION          -- CASO ACONTEÇA ALGUMA COISA ERRADA NO MEIO DO CAMINHO:
  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;  
  


Para escolher as cores, http://www.mvps.org/dmcritchie/excel/colors.htm

Prontinho, agora você tem um programa que exporta dados do banco diretamente para uma planílha do Excel.
Testei no 97 e no 2000. Tudo ok.
Seria interessante testar no 2003 também. Se alguém se prontificar, maravilha.

Acredito que para usar no 10g e 9i seja necessário utilizar a biblioteca Webutil com a biblioteca CLIENT_OLE2

Espero ter ajudado.
elisetem
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qua, 25 Jun 2008 9:30 am
Localização: Porto Alegre/RS

Oi...
Funciona perfeitamente tudo o que esta descrito aqui, apenas não consigo gerar um arquivo com mais de 3 planilhas, que são as default do excel... plan1, plan2 e plan3.
Alguém sabe o comando para criar mais planilhas além dessas?
Obrigado.
elisetem
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qua, 25 Jun 2008 9:30 am
Localização: Porto Alegre/RS

Já descobri!

Ai vai os comandos:

worksheets := ole2.GET_OBJ_PROPERTY (workbook, 'Worksheets');
worksheet := ole2.invoke_obj (worksheets,'Add');
ricardorauber
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 96
Registrado em: Qua, 21 Jun 2006 11:33 pm
Localização: Canoas RS

Eu exporto minhas para Excel usando tags xml/html, é muito simples!

Selecionar tudo

...
v_linha := '<table><tr><td>opa</td><td bgcolor="blue">bah</td></tr></table>';
utl_file.put_line(f_arquivo, v_linha);
...
Ana
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qui, 21 Ago 2008 11:17 am
Localização: blumenau - sc

Olá
Na geração de planilha excell a partir do forms, como faço para colocar bordas nas células?? Consigo efetuar n formatações (cor de fundo, fonte, mesclar, etc...), mas a borda não sei como fazer..
Alguém pode me ajudar???
Aguardo
Obrigada
Ana
Alberes
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Qua, 17 Fev 2010 2:31 pm
Localização: Goiânia - GO

Como faço para exportar uma query qualquer diretamente do meu relatório executado pelo reports? Pelo PL/SQL ele você executo a select blzinha, select all e manda exportar to excell com botão direito do mouse, vai de boa. Existe algum método diretamente para o reports fazer isso? ignorar todas o layout e formatações e executar a query seca e exportar ela tabulada para o excell??
rteramae
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sáb, 23 Fev 2008 12:24 pm
Localização: São Paulo - SP

Srs,

boa tarde, estou usando este mesmo código, com as alterações do webutil, no forms 10 g porem na execução ele trava na linha abaixo

APPLICATION := CLIENT_OLE2.CREATE_OBJ( 'EXCEL.APPLICATION' );

alguém passou por isso? o que pode ser, pois nem mensagem de erro da, e outros forms 10g que utilizo o client_text_io roda normalmente.

Tem algum problema por ser servidor linux?
obrigado,
Renato Teramae
debby_acacio
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 51
Registrado em: Ter, 22 Jan 2008 11:38 am
Localização: Salvador - BA
Contato:

Boa tarde

Olá preciso saber como faz para mudar a cor de fundo de uma célula do excel. COm este exemplo eu consegui alterar a cor de fundo da fonte. Está perfeito, mas como façço para alterar a cor de fundo da célula toda ???

Grata desde já
Debby :)
davidmeloboy
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 54
Registrado em: Sex, 05 Set 2008 1:53 pm
Localização: Parobé - RS
Contato:
David.

Como faço para alterar o nome da planilha?
Por exemplo dentro de um worksheet eu tenho várias planilhas certo? PLAN1, PLAN2, PLAN3. Como faço para Renomear? Ao invés de mostrar PLAN1, Mostre "Planilha teste 1"?
davidmeloboy
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 54
Registrado em: Sex, 05 Set 2008 1:53 pm
Localização: Parobé - RS
Contato:
David.

davidmeloboy escreveu:Como faço para alterar o nome da planilha?
Por exemplo dentro de um worksheet eu tenho várias planilhas certo? PLAN1, PLAN2, PLAN3. Como faço para Renomear? Ao invés de mostrar PLAN1, Mostre "Planilha teste 1"?
Consegui:

Selecionar tudo

 OLE2.set_property(worksheet,'Name','Planilha teste 1');
Responder
  • Informação
  • Quem está online

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