segunda-feira, 10 de setembro de 2007

E a torcida grita: OLE !

Você faz parte daquela torcida que adora experimentar novos recursos em seus aplicativos ? Conheça um pouco mais sobre a tecnologia OLE e experimente alguns desses recursos na manipulação de uma planilha do Excel.

Uma colaboração de Roberto Rinaldi.

Segundo o Wikipédia, o OLE é um sistema de objetos distribuídos e protocolo criado pela Microsoft, que permite a comunicação entre programas. Ele permite a um editor disponibilizar parte de um documento para outro editor, e então reimportá-lo. Por exemplo, um sistema de editoração gráfica pode enviar texto para um processador de texto ou uma figura para um editor gráfico usando OLE.

Neste post vamos nos ater ao padrão OLE 2.0 que nos permite utilizar um recurso chamado "automação OLE". Em nosso exemplo, vamos manipular uma planilha do Excell.

Inclua a seguinte diretiva no início do programa:

$set ooctrl(+P)

Essa diretiva é necessária em programas que utilizam a OLE. Em seguida, na class-control, vamos definir a classe referente ao objeto OLE que desejamos criar:

class-control.
MSExcel is class "$OLE$Excel.Application".

Defina as variáveis que serão utilizadas:

working-storage section.
77 ExcelObject object reference value null.
77 WorkBooksCollection object reference value null.
77 WorkBook object reference value null.
77 WorkSheet object reference value null.
77 Cell object reference value null.
77 CellRange object reference value null.
77 ActiveWindow object reference value null.
77 SelectedSheets object reference value null.

77 Linha pic xx comp-5 value zeros.
77 Coluna pic xx comp-5 value zeros.
77 Pagina object reference value null.
77 Valor pic xx comp-5 value zeros.

Agora vamos mostrar alguns recursos que podem ser usados com o objeto OLE:

procedure division.

*> Cria uma nova instância
invoke MSExcel "new" returning ExcelObject

*> informa que o aplicativo está visível
invoke ExcelObject "setVisible" using by value 1

*> retorna uma coleção de planilhas da pasta ativa
invoke ExcelObject "getWorkBooks" returning WorkBooksCollection

*> Adiciona uma planilha na pasta e retorna seu objeto
invoke WorkBooksCollection "add" returning WorkBook

*> Preenchimento das células
*> Linha de 1 até 5

perform varying Linha from 1 by 1 until Linha greater 5
....*> coluna de "A" até "D"
....perform varying coluna from 1 by 1 until Coluna greater 4
........*> Retorna a célula pelas coordenadas da linha e coluna
........invoke ExcelObject "getCells" using by value Linha
........by value Coluna returning Cell
........compute Valor = Linha * Coluna
........*> Estabelece o valor para a célula retornada
........invoke Cell "setValue" using by value Valor
........*> libera a memória destuindo o objeto
........invoke Cell "finalize" returning Cell
....end-perform
end-perform

*> Retorna o objeto referente as colunas A até D
invoke ExcelObject "getColumns" Using Z"A:D"
Returning CellRange

*> Formata a faixa selecionada
invoke CellRange "setNumberFormat" using Z"#.##0,00"

*> Retorna a página da planilha ativa
Invoke Workbook "GetActiveSheet" returning WorkSheet

*> Retorna as configurações de página
invoke WorkSheet "getPageSetup" returning Pagina

*> faz com que as linhas de grade sejam impressas
*> todas as configurações de página podem ser setadas aqui
invoke Pagina "setPrintGridLines" using by value 1

invoke Workbook "SaveAs" Using Z"teste.xls"

*> Retorna a janela ativa
invoke ExcelObject "getActiveWindow" returning ActiveWindow

*> retorna a planilha ativa
invoke ActiveWindow "getSelectedSheets"
returning SelectedSheets

*> Visualiza a impressão
invoke SelectedSheets "PrintPreview"

*> encerra todos objetos
invoke ExcelObject "finalize" returning ExcelObject
invoke WorkBooksCollection "finalize"
returning WorkBooksCollection
invoke WorkBook "finalize" returning WorkBook
invoke WorkSheet "finalize" returning WorkSheet
invoke Cell "finalize" returning Cell
invoke CellRange "finalize" returning CellRange
invoke ActiveWindow "finalize" returning ActiveWindow
invoke SelectedSheets "finalize" returning SelectedSheets
invoke Pagina "finalize" returning Pagina

*> encerra o programa
stop run.

Nenhum comentário: