Excel e Progress – Guia completo

Criando aplicação entre Progress e Excel e configurando planilha
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.
Segue abaixo modelo simples de utilização do Progress x Excel.

/******************************************************************************\
** Exemplo de programa de impressão Progress x Excel                          **
** Marcio Sacramoni                                                           **
** marcio@kconsulting.com.br                                                  **
\******************************************************************************/
/* 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.

 

6 thoughts on “Excel e Progress – Guia completo

  1. Excelente conteúdo, muito bem explicado para nós que estamos iniciando.
    Não temos muito conteúdo dessa linguagem na internet.

    Aproveitando uma sugestão, seria legal algo sobre como criar uma tela gráfica simples com alguns campos, e passar os parâmetros para o rp.p.

    Agradeço
    Eduardo

    1. Muito obrigado Eduardo,
      Estou preparando mais conteúdo para o site, sobre a tela gráfica costumo usar os template do appBuilder mas posso ver algo sim.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.