quinta-feira, novembro 02, 2006

PowerBuilder - Exportando dados de uma DataWindow para o MS Excel

Texto retirado do grupo de discussão de PB

Exportando dados de uma DataWindow para o Excel ultilizando OLE AutomationX

O PowerBuilder tem uma função para exportar dados para MS-Excel, mas ela limitada a dados de DML , com esta rotina podemos exportar toda a DataWindow. É um código simples e pode ser aperfeiçoado para uma aplicação mais complexa.


Passo 1 : Crie um nonvisual object salve ente objeto como nca_excel


Passo 2 : Crie uma função neste objeto com o nome de GetColumns Insira o código abaixo :

// Monta uma lista de todas as colunas da DW para exportação

Long ll_I, ll_Cols

ll_Cols = Long( adw_DW.Describe( 'datawindow.column.count' ) )

FOR ll_I = ll_cols TO 1 STEP -1

as_columns[ ll_I ] = adw_DW.Describe( '#' + String( ll_I ) + '.Name' )

NEXT


Passo 3: Crie uma função neste objeto com o nome de GetData. Esta função retorna um ANY. Propositalmente esta função foi colocada separada porque ela pode ser expandida e tratar ambém um Datasource.Insira o código abaixo :

Long ll_Col

Any la_A

IF al_Row > adw_DW.RowCount() THEN RETURN ""

ll_Col = Long( adw_DW.Describe( as_Column + ".ID" ) )

IF ll_Col > 0 THEN la_A = adw_DW.object.data.primary.current[ al_Row, ll_Col ]

RETURN la_A

Passo 4:Crie uma função neste objeto com o nome de inttocolumn .Esta função retorna um String.

// Converte a posição da coluna para o spreadsheet da coluna no Excel

String ls_Col

Integer li_Min, li_Max

IF ai_col <= 0 THEN RETURN ""

li_Max = ai_col / 26

li_Min = ai_col - ( li_Max * 26 )

IF li_Max > 0 THEN

ls_Col = Char( 64 + li_Max )

END IF

ls_Col += String( Char( 64 + li_Min ) )

RETURN ls_Col


Passo 5: Esta é a rotina principal do Objeto Crie uma função neste objeto com o nome de ExportToExcel .

// Exportando dados para o Excel

OleObject lole_OLE, lole_Sheet

String ls_Columns[]

Long ll_Row, ll_Col, ll_Cols

lole_OLE = CREATE OleObject

SetPointer( HourGlass! )

lole_OLE.ConnectToNewObject( 'excel.application' )

lole_OLE.Workbooks.Add

lole_sheet = lole_OLE.Application.ActiveWorkbook.WorkSheets[1]

this.GetColumns( adw_DW, ls_Columns )

ll_Cols = UpperBound( ls_Columns )

FOR ll_col = 1 TO ll_cols

lole_Sheet.Cells[ 1, ll_Col ] = ls_Columns[ ll_Col ]

NEXT

FOR ll_Row = 2 TO al_rows + 1

FOR ll_Col = 1 TO ll_cols

lole_Sheet.Cells[ ll_Row, ll_Col ] = this.GetData( adw_DW, ll_Row - 1, ls_Columns[ ll_Col ] )

NEXT

NEXT

lole_Sheet.Range( inttocolumn( 1 ) + "1:" + inttocolumn( ll_Cols ) + "1").Select

lole_OLE.Selection.Font.Bold = True

lole_Sheet.Range("A1:A1").Select

lole_Sheet.Columns( inttocolumn( 1 ) + ":" + inttocolumn( ll_cols ) ).EntireColumn.AutoFit

lole_OLE.Application.Visible = TRUE

// Código corrigido por Cristina da ( Multipla )

lole_OLE.Application.Workbooks(1).Saveas("C:\TESTE.XLS")

// lole_OLE.DisconnectObject() DESTROY lole_OLE


Salve o objeto..... Na sua aplicação em um botão ou item de menu escreva a chamada do objeto.

nca_excel lnca_Excel

lnca_Excel.ExportToExcel( dw_1, dw_1.RowCount() )

Onde " dw_1" é a DataWindow que você quer exportar.

Um comentário:

Unknown disse...

Funcionou perfeitamente...
Muito obrigado