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:
Funcionou perfeitamente...
Muito obrigado
Postar um comentário