quarta-feira, 27 de novembro de 2013

Criando aplicação entre Progress e Excel e configurando planilha ( Datasul )


Criando variáveis COM-HANDLE para interação do Progress com o Excel

DEF VAR excelappl          AS COM-HANDLE NO-UNDO.
DEF VAR ChWorkSheet   AS COM-HANDLE NO-UNDO.

Criando a aplicação Excel

 CREATE "excel.application" excelappl.

Abrir um arquivo (2 formas).

1 – em branco
excelappl:workbooks:ADD().

2 – Utilizando um modelo já existente do excel
excelappl:workbooks:ADD(c-modelo).

Onde c-modelo é o nome do arquivo excel modelo. Essa variável deve ter o conteúdo completo do arquivo, ou seja, diretório + nome do arquivo (usar sempre arquivo .xlt -> modelo)

Fechando o Excel

excelappl:quit().

Usar apenas quando quiser fechar o excel, como por exemplo após uma impressão. Se quiser que o arquivo fique aberto para consulta ou para salvá-lo manualmente, não utilizar esse comando.

Esse comando fecha a planilha excel mas não libera o handle da aplicação, vide nota abaixo.

Liberando o Handle ao final da execução

(muito importante, inserir esse comando sempre ao final do programa, pois mesmo se o Excel é fechado pelo usuário, a handle fica na memória.)

RELEASE OBJECT excelappl     NO-ERROR.
RELEASE OBJECT chWorksheet NO-ERROR.

Repetir o Release para todas as variáveis com-handle.

Selecionar pastas

excelappl:worksheets:ITEM(1):SELECT.

O número relacionado ao ITEM é a pasta que deseja selecionar

Adicionar pastas   

excelappl:sheets:ADD.

Quando o comando acima é executado, a nova planilha criada passa a ser a corrente. Caso queira inserir informações em outras planilhas, é necessário selecionar a planilha desejada conforme tópico acima.
  
Copiar pastas

excelappl:sheets:item("Plan 1"):activate.
excelappl:Sheets("Plan 1"):Copy(excelappl:Sheets(1)).

"Plan 1" é o nome da pasta a ser copiada. (geralmente o excel sugere "Plan 1"). Se for diferente, basta substituir.
Sheets(1) é o lugar onde a pasta será copiada. 1 é a primeira pasta, caso queira inserir no final, criar uma variável de controle.

Renomear pastas

excelappl:worksheets:ITEM(i-item):SELECT.
excelappl:worksheets:ITEM(i-item):NAME = "XYZ".
excelappl:worksheets:ITEM(i-item):NAME = TRIM(item.it-codigo).

Não esquecer de selecionar a pasta primeiro. A variável i-item é a pasta a ser renomeada, que pode receber uma constante ou o valor de uma variável lembrando que não podem ser utilizados caracteres especiais como /, *, [, ].

Sugiro criar uma variável e substituir esses caracteres:
ASSIGN c-sheet = REPLACE(c-sheet,"/","_").
ASSIGN c-sheet = REPLACE(c-sheet,"\","_").
ASSIGN c-sheet = REPLACE(c-sheet,"[","(").
ASSIGN c-sheet = REPLACE(c-sheet,"]",")").
ASSIGN c-sheet = REPLACE(c-sheet,"*","x").
ASSIGN c-sheet = REPLACE(c-sheet,":",".").
ASSIGN c-sheet = REPLACE(c-sheet,"?","|").

 excelappl:worksheets:ITEM(i-item):SELECT.
 excelappl:worksheets:ITEM(i-item):NAME = c-sheet.

Visualizar arquivo Excel

excelappl:VISIBLE = FALSE.
excelappl:VISIBLE = TRUE.

Se True, o Excel é aberto e montado para visualização do usuário. Recomendável deixar false durante a execução do programa e no final repetir o comando, porém com TRUE. Isso deixa o programa mais rápido e evita um problema que pode acontecer caso o usuário selecione uma célula enquanto o progress monta o arquivo.

Ocultar/mostrar linhas de grade

excelappl:ActiveWindow:DisplayGridlines = False. (ou true)

obs.: não confundir linhas do arquivo com impressão de linhas de grade. Para Impressão, vide configuração de páginas.

Zoom do arquivo (visualização)

excelappl:ActiveWindow:Zoom = 65. /* 65 é o percentual desejado */


 Configurações da página (para impressão)

Obs.: alterar as configurações somente quando necessário, se não informado, o arquivo utiliza as configurações padrão do Excel.

Orientação da página

chWorkSheet:PageSetup:Orientation = 1.  /* Portrait (retrato) */
chWorkSheet:PageSetup:Orientation = 2.  /* Landscape (paisagem) */

Zoom da página (Impressão)

chWorkSheet:PageSetup:Zoom  = 75. /* 75 é o percentual desejado */

Não confundir com o zoom do arquivo, esse zoom é o ajuste para X % do tamanho normal na configuração da página

Ajustar página por X de Altura e Y de Largura (Impressão)

chWorkSheet:PageSetup:Zoom  = FALSE.  /* a zoom tem que ser desativado para funcionar */
chWorkSheet:PageSetup:FitToPagesWide = 1.   
chWorkSheet:PageSetup:FitToPagesTall = 1000.

Tipo/tamanho do Papel

chWorkSheet: PageSetup:PaperSize = “tipo do papel desejado”.

Qualidade de impressão

chWorkSheet: PageSetup:PrintQuality  = 600.

Número da primeira página

chWorkSheet: PageSetup:FirstPageNumber = 3.

Margens
Obs.: a medida é em  “inches”, é necessário converter para centímetros. Exemplo : 15 = 0.5 cm

chWorkSheet:PageSetup:LeftMargin   = 15. /* Margem esquerda */
chWorkSheet:PageSetup:RightMargin  = 15. /* Margem direita */
chWorkSheet:PageSetup:TopMargin    = 15. /* Margem superior */
chWorkSheet:PageSetup:BottomMargin = 15. /* Margem inferior */
chWorkSheet:PageSetup:HeaderMargin = 0.  /* Margem cabeçalho */
chWorkSheet:PageSetup:FooterMargin = 0.  /* Margem rodapé */

Centralizar página

chWorkSheet:PageSetup:CenterHorizontally = True. (ou False)
chWorkSheet:PageSetup:CenterVertically     = True. (ou False)

Cabeçalho e rodapé

chWorkSheet:PageSetup:CenterHeader = “Titulo do Relatorio”. /* cabeçalho */
/* rodapé */
chWorkSheet:PageSetup:LeftFooter   = "OBS.: " + FILL("_",60) +  CHR(10) +  FILL("_",66) +  CHR(10) +
                                               CHR(10) +  "____________________"     + CHR(10) + "     ASS. GESTOR".
chWorkSheet:PageSetup:CenterFooter = CHR(10) + CHR(10) + "_____ / _____ / ________" + CHR(10)
                                                                                             +  “Data do Visto".
chWorkSheet:PageSetup:RightFooter  = CHR(10) + CHR(10) + "PAGINA: " + "&P/&N".
Área de Impressão

chWorkSheet:PageSetup:PrintArea = "$A$1:$J$45". /* marca a área de impressão da célula A1 até a J45

Imprimir títulos

chWorkSheet:PageSetup:printTitleRows = "$1:$7". /* repete o range de linhas de 1 a 7 na impressão de todas as páginas */
chWorkSheet:PageSetup:printTitleColumns = " $A:$B". /* repete o range de colunas de A a B na impressão de todas as páginas */

Imprimir Linhas de Grade

chWorkSheet:PageSetup:PrintGridlines = False. Ou True

Obs.: esse comando funciona apenas para impressão. Para visualizar linhas de grade no arquivo, vide “Ocultar/mostrar linhas de grade”

Imprimir Preto e Branco

chWorkSheet:PageSetup:BlackAndWhite = False. Ou True

Imprimir Qualidade Rascunho

chWorkSheet:PageSetup:Draft = False. Ou True


Inserindo informações e configurando células

Inserir informação em uma célula (comando + usado)

excelappl:range("A1"):VALUE = “Item”.
excelappl:range("B1"):VALUE = item.it-codigo.

Controlar células por variáveis

excelappl:range("A" + STRING(i-linha, "999999") ):VALUE = item.it-codigo.
excelappl:range("P" + STRING(i-linha, "99999999")):VALUE = d-valor-total - d-val-adto.
excelappl:range("A" + STRING(i-linha, "99999999")):VALUE = “codigo “ + string(emitente.cod-emitente).

Obs.: cada célula recebe apenas um tipo de dado. Ou é caracter, ou inteiro, ou decimal, e assim por diante.
Caso queira colocar uma string + um valor, é necessário tranformar o valor em string como no último exemplo.

As colunas também podem ser controladas por variáveis, uma forma fácil de fazer isso é criar uma variável extent e controlar as colunas por números.

DEF VAR i-coluna                 AS INTEGER                            NO-UNDO.
DEF VAR c-coluna                 AS CHAR EXTENT 256                    NO-UNDO
    INITIAL ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","AA","AB","AC","AD","AE","AF","AG","AH","AI","AJ","AK","AL","AM","AN","AO","AP","AQ","AR","AS","AT","AU","AV","AW","AX","AY","AZ","BA","BB","BC","BD","BE","BF","BG","BH","BI","BJ","BK","BL","BM","BN","BO","BP","BQ","BR","BS","BT","BU","BV","BW","BX","BY","BZ","CA","CB","CC","CD","CE","CF","CG","CH","CI","CJ","CK","CL","CM","CN","CO","CP","CQ","CR","CS","CT","CU","CV","CW","CX","CY","CZ","DA","DB","DC","DD","DE","DF","DG","DH","DI","DJ","DK","DL","DM","DN","DO","DP","DQ","DR","DS","DT","DU","DV","DW","DX","DY","DZ","EA","EB","EC","ED","EE","EF","EG","EH","EI","EJ","EK","EL","EM","EN","EO","EP","EQ","ER","ES","ET","EU","EV","EW","EX","EY","EZ","FA","FB","FC","FD","FE","FF","FG","FH","FI","FJ","FK","FL","FM","FN","FO","FP","FQ","FR","FS","FT","FU","FV","FW","FX","FY","FZ","GA","GB","GC","GD","GE","GF","GG","GH","GI","GJ","GK","GL","GM","GN","GO","GP","GQ","GR","GS","GT","GU","GV","GW","GX","GY","GZ","HA","HB","HC","HD","HE","HF","HG","HH","HI","HJ","HK","HL","HM","HN","HO","HP","HQ","HR","HS","HT","HU","HV","HW","HX","HY","HZ","IA","IB","IC","ID","IE","IF","IG","IH","II","IJ","IK","IL","IM","IN","IO","IP","IQ","IR","IS","IT","IU","IV"].

O número máximo de colunas é 256.

Assign i-coluna = 5.  /* corresponde a coluna E */

excelappl:range(STRING(c-coluna[i-coluna]) + STRING(i-linha, "99999999")):VALUE = item.desc-item.

Com isso é também possível controlar as colunas por números.

Inserir Cálculo / Fórmula

excelappl:range("B20"):VALUE = "=SUM(B2:B19)".

excelappl:range("B" + STRING(i-linha, "999999")):VALUE = "=SUM(B" + STRING(i-linha-aux, "999999") + ":B" + STRING(i-linha - 2, "999999") + ")".

excelappl:range("B" + STRING(i-linha, "999999"):FormulaR1C1 = "=SUM(R[-" + string(i-conta) + "]C:R[-1]C)".

Obs.: comando SUM é o somatório, se precisar de outras fórmulas, vide nome no excel

O cálculo também pode ser manual:

excelappl:range("B" + STRING(i-linha, "999999")):VALUE = "=B12+C12+E12".

Manipulação de números (Configurar Separador Decimal e Separador de milhar)

excelappl:DecimalSeparator    = ",".
excelappl:ThousandsSeparator  = ".".
excelappl:UseSystemSeparators = FALSE.

Muito útil quando o relatório pode ser gerado em Excel instalado em Português e Inglês (dependendo do usuário). Essa opção funciona apenas no Office 2003 ou posterior, os outros não possuem essa opção que fica em Ferramentas / Opções / Internacional.
Dependendo da linguagem, os números saem distorcidos. Segue abaixo dica para correção:

DEF VAR c-DecimalSeparator       AS CHAR                               NO-UNDO.
DEF VAR c-ThousandsSeparator     AS CHAR                               NO-UNDO.
DEF VAR l-UseSystemSeparators    AS LOGICAL                            NO-UNDO.

No começo do programa.
ASSIGN c-DecimalSeparator     = excelappl:DecimalSeparator  
       c-ThousandsSeparator   = excelappl:ThousandsSeparator
       l-UseSystemSeparators  = excelappl:UseSystemSeparators.

excelappl:DecimalSeparator    = ",".
excelappl:ThousandsSeparator  = ".".
excelappl:UseSystemSeparators = FALSE.

/* imprimir valores desejados aqui */

No final do programa.
excelappl:DecimalSeparator    = c-DecimalSeparator.
excelappl:ThousandsSeparator  = c-ThousandsSeparator. 
excelappl:UseSystemSeparators = l-UseSystemSeparators.


Trocando formato da célula

excelappl:range("B1"):numberformat =  "#.##0".
excelappl:range("B1"):numberformat =  "#.##0,00".
excelappl:range("B1"):numberformat =  "@". /* texto */

IMPORTANTE: Colocar os formatos antes dos valores nas células, principalmente campos texto "@"
Verificar outros formatos do excel como data, hora, etc (exatamente como aparece na macro).

Alterando tamanho da coluna

excelappl:COLUMNS("A:A"):ColumnWidth = 15.00. /* 1 coluna */
excelappl:COLUMNS("B:J"):ColumnWidth = 12.00. /* N colunas */

ou
excelappl:COLUMNS("B:J"):SELECT.
excelappl:SELECTION:ColumnWidth = 12.00.

Alterando tamanho da linha

excelappl:Rows("1:1"):RowHeight = 20.5.  /* 1 linha */
excelappl:Rows("1:15"):RowHeight = 20.5. /* N linhas

Inserindo Linhas

excelappl:range("15:15"):INSERT()
ou
excelappl:range(string(i-linha, "9999") + ":" + string(i-linha, "9999")):INSERT().

Mesclar células

excelappl:range("A1:J10):SELECT.            
excelappl:SELECTION:merge.       

OBS.: Selecionar o range primeiro e fazer o merge depois

Ou fazer direto.

excelappl:range("A" + STRING(i-linha) + ":D" + STRING(i-linha)):Merge.
excelappl:range("A" + STRING(i-linha) + ":D" + STRING(i-linha + 10)):Merge.

“Desmesclar” células

excelappl:range("B" + STRING(i-linha, "999999")):SELECT.
excelappl:SELECTION:UNMERGE.

Reduzir tamanho da letra automaticamente para caber na célula

excelappl:range("A" + STRING(i-linha, "99999999")):ShrinkToFit = TRUE.

Quebrar texto automaticamente para caber na célula

excelappl:range("A" + STRING(i-linha, "99999999")): WrapText = TRUE.

Orientação do Texto dentro da célula

excelappl:range("A" + STRING(i-linha, "99999999")): Orientation = 0. /* horizontal */
excelappl:range("A" + STRING(i-linha, "99999999")): Orientation = 90. /* vertical */

O valor varia de -90 a 90 (graus)
Alinhamento do valor dentro da célula

excelappl:range("A1"):HorizontalAlignment = 3.

3 é o código do alinhamento (centralizado, por exemplo). Caso queira outro, trocar o número para alinhar a direita, esquerda, etc.

Para horizontal, os códigos são:

HorizontalAlignment = 1. /* Geral */
HorizontalAlignment = 2. /* Esquerda (recuo) */
HorizontalAlignment = 3. /* Centralizado */
HorizontalAlignment = 4. /* Direita (recuo) */
HorizontalAlignment = 5. /* Preencher */
HorizontalAlignment = 6. /* Justificar */
HorizontalAlignment = 7. /* Centralizar Seleção */

Para vertical, os códigos são:

VerticalAlignment = 1 /* Superior */
VerticalAlignment = 2 /* Centralizado */
VerticalAlignment = 3 /* Inferior */
VerticalAlignment = 4 /* Justificado */
VerticalAlignment = 5 /* Distribuído */

Alinhamento de um range de células

excelappl:COLUMNS("F:O"):SELECT.
excelappl:SELECTION:HorizontalAlignment = 3.

Ou
excelappl:range("A" + STRING(i-linha) + ":D" + STRING(i-linha)):HorizontalAlignment = 3.

Selecionar células

1 célula
excelappl:range("A1"):SELECT.

N células
excelappl:COLUMNS("F:O"):SELECT.
ou
excelappl:ROWS("2:15"):SELECT.
ou
excelappl:range("A" + STRING(i-linha) + ":D" + STRING(i-linha)): SELECT.

Trocar Fonte

excelappl:range("A1"):FONT:NAME  = "nome-da-fonte".                                                
excelappl:range("A1"):FONT:BOLD  = TRUE.  /* negrito */
excelappl:range("A1"):FONT:ITALIC = TRUE.
excelappl:range("A1"):FONT:UNDERLINE = TRUE.  /* Sublinhado */                    
excelappl:range("A1"):FONT:SIZE    = 12.
excelappl:range("A1"):Style = "comma"  /* style = aplica um tipo de fonte na célula.                  

excelappl:range("A1"):font:colorindex = 2. /* vide tabela de cores abaixo */

obs.: O range pode ser substituído por controle de variáveis como exemplo abaixo:

excelappl:range(STRING(c-coluna[1]) + STRING(i-linha, "99999999") + ":" + STRING(c-coluna[4]) + STRING((i-linha + 5), "99999999")):FONT:size = 12.
Trocar cor da célula

excelappl:range("A1"):interior:colorindex = 10. /* 10 é o código da cor. */

Tabela de cores

Vide tabela de cores mais usadas (precisando de outra cor, tem que testar):
01     preto
02     branco
03     vermelho
04     verde limão
05     azul
06     amarelo
07     rosa
08     azul claro
09     marron
10     verde abacate
11     azul marinho
12     terra
13     margenta
14     verde
15     cinza claro
16     cinza
17     azul marinho claro
18     roxo
19     amarelo claro
20     azul claro
21     cor de uva
22     vermelho claro
23     azul celeste
24     roxo claro
25     azul marinho
26     rosa
27     amarelo
28     azul
34     azul clarinho
44     laranja claro
45     laranja meio claro
46     laranja escuro

O valor máximo é 55.

Padrões (Sombreamento de célula)

excelappl:range("P" + STRING(i-linha)):interior:Pattern = 9.

9 é um dos padrões, verificar os outros no Excel.

Congelar painéis

excelappl:range("A" + STRING(i-linha, "99999999")):SELECT. /* precisa selecionar as células primeiro */
excelappl:ActiveWindow:FreezePanes = True.

Autofiltro

excelappl:range("A" + STRING(i-linha, "99999999")):SELECT. /* precisa selecionar as células primeiro */
excelappl:range("A" + STRING(i-linha, "99999999")):autofilter(,,,).



Autoajuste de células

excelappl:Cells:SELECT. /* precisa selecionar todas primeiro */
excelappl:Cells:EntireColumn:AutoFit.

Esse comando simula a ação de clicar no quadrado superior esquerdo entre as linhas e colunas (SELECT) e dar um duplo clique em uma das divisões de células para autoajuste (AUTOFIT)

Inserir Bordas

- Borda ao redor de uma seleção

excelappl:range("A6:A8"):borderaround(1,,48).
excelappl:range("A14:B18"):borderaround(1,3,1).

Onde (1,3,1) segue a seguinte regra:

1 – Estilo da Linha (LineStyle)
3 – Grossura da linha (Weight)
1 – Cor da linha (ColorIndex)

- Bordas individuais

excelappl:Range("b10:d10"):Borders(8):LineStyle = 12.                 
excelappl:Range("d10:d20"):Borders(2):LineStyle = 10.                 
excelappl:Range("b20:d20"):Borders(4):LineStyle = 12.                 
excelappl:Range("b10:b20"):Borders(1):LineStyle = 12.   

excelappl:Range("A" + string(i-linha)):Borders(8):Weight = 3.                 
excelappl:Range("A" + string(i-linha)):Borders(2):Weight = 2.                 
excelappl:Range("A" + string(i-linha)):Borders(4):Weight = 2.                 
excelappl:Range("A" + string(i-linha)):Borders(1):Weight = 3.  
Obs.: varia de 1 a 4

excelappl:Range("b10:d10"):Borders(8):ColorIndex = 1.                 
excelappl:Range("d10:d20"):Borders(2):ColorIndex = 1.                 
excelappl:Range("b20:d20"):Borders(4):ColorIndex = 2.                 
excelappl:Range("b10:b20"):Borders(1):ColorIndex = 2.   

Código para Borders          
01 coluna esquerda
02 coluna direita
03 linha inferior
04 linha inferior
05 descendo direita
06 subindo direita
07 nada
08 linha superior

Inserir Figura, Desenho

chworkSheet:Pictures:Insert("C:\temp\windows.jpg"):Select

  
Quebra de Página

Para inserir uma quebrar pagina no Excel.

1a forma:

chWorksheet:HPageBreaks:Add(chWorksheet:Range("A45")).  /* Horizontal */
chWorksheet:VPageBreaks:Add(chWorksheet:Range("L1")).   /* Vertical */

obs.: não é necessário utilizar os dois, pode-se usar apenas um de acordo com a necessidade.
                   
Lembrando que a quebra pode ser em uma célula variável, nesse caso fica assim:

chWorkSheet:HPageBreaks:Add(chWorksheet:Range("A" + STRING(i-linha))). /* onde i-linha é a variável de controle */

2a forma:

chBreakLine = chWorkSheet:Rows(STRING(i-linha)). /* Horizontal */
chBreakLine = chWorkSheet:COLUMNS("20").         /* Vertical */
chWorkSheet:HPageBreaks:Add(chBreakLine).
IMPORTANTE: A quebra de página não funciona se os tamanhos de altura e largura da página forem especificados como modelo abaixo:
chWorkSheet:PageSetup:Zoom  = FALSE.
chWorkSheet:PageSetup:FitToPagesWide = 1.
chWorkSheet:PageSetup:FitToPagesTall = 10.

PARA FUNCIONAR, O ZOOM NÃO PODE ESTAR DESABILITADO.

chWorkSheet:PageSetup:Zoom  = 100. /* PODE SER OUTRO VALOR, 70 POR EXEMPLO */



Manipulação do arquivo

Mostrar mensagens de Alerta (confirmação para salvar ou imprimir arquivos)

excelappl:APPLICATION:DisplayAlerts = FALSE.  (ou TRUE)

Esse comando é importante para controlar as mensagens do Excel. Por exemplo, para imprimir ou salvar um arquivo onde você não queira que aparece as mensagens de confirmação, basta deixar o parâmetro como FALSE. Sugiro colocar sempre.

Salvar arquivos

excelappl:Workbooks:Item(1):SaveAs("c:\temp\teste.xls",,,,,,).

Cada vírgula representa um parâmetro:

Os parâmetros do SaveAs são:
1 – Nome do arquivo
2 – Formato do arquivo (opcional)
3 – Senha (opcional)
4 – Senha para Escrita (opcional)
5 – Somente leitura (True or false) (opcional)
6 – Criar Backup (True or false) (opcional)

Obs.: é comum usar apenas o Nome do arquivo conforme exemplo acima.


Visualizar a impressão

excelappl:VISIBLE = TRUE. /* para funcionar a planilha tem que estar visível */
excelappl:ActiveWindow:SelectedSheets:PrintPreview.

Imprimir arquivos

excelappl:ActiveWindow:SelectedSheets:Printout.

Ou passando parâmetros:

Excelappl:ActiveWindow:SelectedSheets:PrintOut(1,true)

Onde: Copies:=1, Collate:=True

Verificar outros parâmetros do Excel caso necessário.

Obs.: para a impressão, sugiro deixar a planilha com “visible” = false e DisplayAlerts = False conforme modelo abaixo e sempre selecionar as planilhas a serem impressas antes de executar o comando.

excelappl:worksheets:ITEM(1):SELECT. /* selecionar a(s) planilha(s) a ser(em) impressa(s) */
excelappl:VISIBLE = FALSE.
excelappl:ActiveWindow:SelectedSheets:Printout.
excelappl:APPLICATION:DISPLAYALERTS = FALSE.

Obs2.: Imprime a planilha na impressora padrão do Windows.


Nota Importante: Verificar se a versão do Excel utilizada possui o comando desejado. Por exemplo, a configuração de campo para Separador Decimal não existe no Excel 2000, portanto o comando não vai funcionar.


Dica muito importante:

Todos os comandos podem ser obtidos através do próprio Excel através de Macro.
Para isso, basta abrir o Excel, escolher a opção FERRAMENTAS / MACRO / GRAVAR NOVA MACRO. (Anote o nome da Macro) e não fechar a macro – (parar gravação - quadrado / stop) na janelinha de parâmetro da Macro, até executar as tarefas necessárias.
Com essa janela da macro aberta, realizar todas as alterações desejadas, como configuração de célula, configuração de página, utilização dos botões do Excel, etc.
Depois de terminado, parar a macro (quadradinho da janela da macro).
Escolher a opção FERRAMENTAS / MACRO / MACRO (alt + F8), selecionar a macro criada e clicar no botão Editar. Verificar o código gerado e adaptar com os comandos progress.
Caso o comando não seja exatamente igual, é possível ver a sintaxe do comando no progress através do Pro Tool (componente Progress COM Object Viewer – Lupa com setinhas vermelhas)

Abrir o componente do Excel conforme modelo abaixo:


Note a sintaxe do comando RANGE do Progress:

<com-handle> é a variável definida no seu programa
Value é o comando desejado
= <anytype>-var é o valor que deseja colocar na célula

Exemplo prático:

excelappl:range("A1"):VALUE = d-valor.


Nesse manual estão apenas os comandos mais utilizados.
                           
Segue abaixo modelo simples de utilização do Progress x Excel.
/******************************************************************************\
** Exemplo de programa de impressão Progress x Excel                          **
**
\******************************************************************************/

/* Obs.: os comandos de formatação de célula são opcionais, se não informados, vão respeitar os padrões do Excel.
   Valido para toda a formatação: bordas, cores, tamanhos (de letra, linhas,  colunas), tipo de valor (texto, numérico), zoom de pagina, alinhamento, etc */

DEF VAR excelappl                AS COM-HANDLE                         NO-UNDO.
DEF VAR ChWorkSheet              AS COM-HANDLE                         NO-UNDO.
DEF VAR i-linha                  AS INTE                               NO-UNDO.
DEF VAR c-modelo                 AS CHAR                               NO-UNDO.
DEF VAR l-imprime                AS LOGICAL INIT NO                    NO-UNDO.

DEF VAR i-coluna                 AS INTEGER                            NO-UNDO.
DEF VAR c-coluna                 AS CHAR EXTENT 256                    NO-UNDO
    INITIAL ["A","B","C","D","E","F","G","H","I","J","K","L","M",
             "N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
             "AA","AB","AC","AD","AE","AF","AG","AH","AI","AJ","AK","AL","AM",  
             "AN","AO","AP","AQ","AR","AS","AT","AU","AV","AW","AX","AY","AZ",
             "BA","BB","BC","BD","BE","BF","BG","BH","BI","BJ","BK","BL","BM",
             "BN","BO","BP","BQ","BR","BS","BT","BU","BV","BW","BX","BY","BZ",
             "CA","CB","CC","CD","CE","CF","CG","CH","CI","CJ","CK","CL","CM",
             "CN","CO","CP","CQ","CR","CS","CT","CU","CV","CW","CX","CY","CZ",
             "DA","DB","DC","DD","DE","DF","DG","DH","DI","DJ","DK","DL","DM",
             "DN","DO","DP","DQ","DR","DS","DT","DU","DV","DW","DX","DY","DZ",
             "EA","EB","EC","ED","EE","EF","EG","EH","EI","EJ","EK","EL","EM",
             "EN","EO","EP","EQ","ER","ES","ET","EU","EV","EW","EX","EY","EZ",
             "FA","FB","FC","FD","FE","FF","FG","FH","FI","FJ","FK","FL","FM",
             "FN","FO","FP","FQ","FR","FS","FT","FU","FV","FW","FX","FY","FZ",
             "GA","GB","GC","GD","GE","GF","GG","GH","GI","GJ","GK","GL","GM",
             "GN","GO","GP","GQ","GR","GS","GT","GU","GV","GW","GX","GY","GZ",
             "HA","HB","HC","HD","HE","HF","HG","HH","HI","HJ","HK","HL","HM",
             "HN","HO","HP","HQ","HR","HS","HT","HU","HV","HW","HX","HY","HZ",
             "IA","IB","IC","ID","IE","IF","IG","IH","II","IJ","IK","IL","IM",
             "IN","IO","IP","IQ","IR","IS","IT","IU","IV"].

CREATE "excel.application" excelappl.
excelappl:workbooks:ADD().

/* Caso queira abrir um modelo, descomentar o trecho abaixo e comentar o ADD() acima
   assign c-modelo = "c:\temp\modelo.xlt".
   excelappl:workbooks:ADD(c-modelo). */

/* o numero 1 dentro do comando ITEM é a pasta a ser selecionada, caso queira a   segunda planilha, informar ITEM(2), ou ainda ITEM(i-pasta) onde i-pasta é uma variável inteira utilizada para controle. */

excelappl:worksheets:ITEM(1):SELECT.
chWorkSheet = excelappl:Sheets:Item(1).
excelappl:VISIBLE = FALSE. /* Pode ser true, o excel será aberto durante a montagem. Cuidado para nao clicar em nenhuma célula ate o final do processamento, pois o ponteiro se perde */

excelappl:worksheets:ITEM(1):NAME = 'RD' NO-ERROR.
excelappl:ActiveWindow:DisplayGridlines = False.
excelappl:ActiveWindow:Zoom = 75. /* zoom do arquivo, não confundir com % de zoom da impressão */

chWorkSheet:PageSetup:RightFooter  = "PAGINA: " + "&P/&N".

/* chWorkSheet:PageSetup:Zoom = 60. */ /* ajusta a impressão para 60 do tamanho */
/* chWorkSheet:PageSetup:FitToPagesWide = 1.  */
/* chWorkSheet:PageSetup:FitToPagesTall = i-pagina. */

excelappl:range("A1"):SELECT.

ASSIGN i-linha     = 1.

excelappl:Rows(STRING(i-linha, "99999999") + ":" + STRING(i-linha, "99999999")):RowHeight = 20.
excelappl:range("A" + STRING(i-linha) + ":C" + STRING(i-linha)):Merge.
excelappl:range("A" + STRING(i-linha)):HorizontalAlignment = 3. /* Centralizado */
excelappl:range("A" + STRING(i-linha)):FONT:size = 16.
excelappl:range("A" + STRING(i-linha, "99999999")):Font:Bold = TRUE.
excelappl:range("A" + STRING(i-linha) + ":C" + STRING(i-linha)):borderaround(1,2,1).

excelappl:range("A" + STRING(i-linha)):VALUE = "Teste de Impressao".

ASSIGN i-linha = i-linha + 1.

excelappl:range("A" + STRING(i-linha) + ":C" + STRING(i-linha)):interior:colorindex = 15.

excelappl:COLUMNS("A:A"):ColumnWidth = 17.00.
excelappl:COLUMNS("B:B"):ColumnWidth = 40.00.

excelappl:range("A" + STRING(i-linha)):VALUE = "Item".
excelappl:range("B" + STRING(i-linha)):VALUE = "Descricao".
/* a coluna também pode ser controlada por variáveis */
excelappl:range(STRING(c-coluna[3]) + STRING(i-linha)):VALUE = "Peso".

ASSIGN i-linha = i-linha + 1.

FOR EACH ITEM NO-LOCK:

  excelappl:range("A" + STRING(i-linha)):numberformat = "@". /* transforma em texto */
  excelappl:range("A" + STRING(i-linha)):VALUE = ITEM.it-codigo.

  excelappl:range("B" + STRING(i-linha)):numberformat = "@". /* transforma em texto */
  excelappl:range("B" + STRING(i-linha)):VALUE = ITEM.desc-item.
  excelappl:range("B" + STRING(i-linha, "99999999")):ShrinkToFit = TRUE. /* ajusta o conteudo para caber na célula. Tem que vir depois da inserção do valor. */

  excelappl:range("C" + STRING(i-linha)):numberformat = "#.##0,00".
  excelappl:range("C" + STRING(i-linha)):HorizontalAlignment = 4. /* Direita */
  excelappl:range("C" + STRING(i-linha)):VALUE = ITEM.peso-liquido.

  excelappl:range("A" + STRING(i-linha) + ":A" + STRING(i-linha)):borderaround(1,2,1).
  excelappl:range("B" + STRING(i-linha) + ":B" + STRING(i-linha)):borderaround(1,2,1).
  excelappl:range("C" + STRING(i-linha) + ":C" + STRING(i-linha)):borderaround(1,2,1).


  ASSIGN i-linha = i-linha + 1.

  IF i-linha > 20 THEN LEAVE. /* só para não ficar muito grande */

END.

ASSIGN i-linha = i-linha + 1.

excelappl:range("B" + STRING(i-linha)):VALUE = "Peso Total".

excelappl:range("C" + STRING(i-linha)):numberformat = "#.##0,00".
excelappl:range("B" + STRING(i-linha)):HorizontalAlignment = 4. /* Direita */
excelappl:range("C" + STRING(i-linha)):HorizontalAlignment = 4. /* Direita */
excelappl:range("C" + STRING(i-linha)):Font:Bold = TRUE.
excelappl:range("C" + STRING(i-linha)):VALUE = "=SUM(C3:C" + STRING(i-linha - 1, "999999") + ")".

excelappl:range("A" + STRING(i-linha) + ":C" + STRING(i-linha)):borderaround(1,2,1).

excelappl:worksheets:ITEM(1):SELECT.
excelappl:range("A1"):SELECT.

/* chWorkSheet:PageSetup:Zoom  = FALSE. */
/* chWorkSheet:PageSetup:FitToPagesWide = 1.  */
/* chWorkSheet:PageSetup:FitToPagesTall = 10. */

IF l-imprime = YES THEN
DO:
    excelappl:VISIBLE = FALSE.
    excelappl:ActiveWindow:SelectedSheets:Printout.
    excelappl:APPLICATION:DISPLAYALERTS = FALSE.

    excelappl:QUIT(). /* somente utilizar o commando quit caso não queira visualizar o arquivo na tela */

END.
ELSE
   excelappl:VISIBLE = TRUE.

RELEASE OBJECT excelappl   NO-ERROR.
RELEASE OBJECT chWorksheet NO-ERROR. 

Um comentário:

  1. Parabéns meu caro. Muito bacana esses comandos. Ajudou muito.

    ResponderExcluir