La Web del Programador: Comunidad de Programadores
https://www.lawebdelprogramador.com/foros/Power-Builder/1220571-Importar-archivo-Excel-a-Datawindow.html

Importar archivo Excel a Datawindow

Importar archivo Excel a Datawindow

Publicado por Daniel Rodas (27 intervenciones) el 10/08/2010 20:32:33
Buenas tardes.

Esta es una aportacion, no una pregunta.

Voy mostrar como importar un archivo de excel a una datawindow y posteriormente ya procesar lo que hay en la DW, sin usar ODBC ni archivos CSV.

01. Crear una ventana con dos Datawindow, una de parametros (encabezado y otra de detalle, que puede ir invisible o no.)

02. Codificar en el evento buttonclicked de la dw_parametros lo siguiente:

integer li_Rtn

ids_xls_detalle = create datastore
ids_xls_detalle.dataobject = 'd_carga_archivo_top_prod'

Choose Case dwo.Name
Case 'b_abrir'
If GetFileOpenName("Elija el nombre del archivo Excel", &
is_PathFileName, is_FileName, "XLS", &
"Archivo (*.xls),*.xls,") = SUCCESS Then

li_Rtn = dw_detalle.ImportFile(is_FileName)
this.object.rutaarchivo[1] = is_PathFileName

Yield ()

Choose Case li_Rtn // Despliega mensaje de error en la carga del XLS.
Case 0
MessageBox('Error', 'Imposible leer archivo XLS.(El archivo tiene muchas filas o tiene un formato no válido.)', StopSign!)
Return FAILURE
Case -10 To -1
If li_Rtn = -9 Then
MessageBox('Error', 'Imposible leer archivo XLS. Posiblemente la estructura encontrada en el XLS no es la esperada.'+String(li_Rtn), StopSign!)
Return FAILURE
Else
MessageBox('Error', 'Imposible leer archivo XLS. '+String(li_Rtn), StopSign!)
Return FAILURE
End If
End Choose
End If
End Choose

02. Declarar en Instance Variables lo que haga falta

03. Para ser mas ordenado crear un proceso que llame una funcion, en mi caso nombre la funcion: of_procesa_excel()
Long li_total_filas, ll_i, ll_codigo_consejera
Integer il_pais, il_zona, il_estop_prod
string ls_nombre_consejera
decimal dl_volumen, dl_estrellas

//Verifica y genera la conexion hacia excel
io_archivo_importado= Create OleObject

// Se procede a conectar a Excel
If io_archivo_importado.ConnectToNewObject ('Excel.Application') < 0 Then
MessageBox ('Error','Imposible Conectarse a Excel')
Return -1
End If

//Se debe de abrir el archivo en excel

if isnull(is_PathFileName) or is_PathFileName='' then
return -1
end if

io_archivo_importado.workBooks.Open(is_PathFileName)

li_total_filas = 1509//dw_parm.object.no_linea[1]

dw_detalle.reset()
dw_detalle.dataobject = 'd_marca_archivo_top_prod'

//se procede a leer el archivo. Comenzara siempre de la fila 2, ya que en la fila 1 siempre iran los titulos
For ll_i=2 To li_total_filas

//Vamos a utilizar el Workbook No. 1 y la WorkSheet No. 1)
If isnull(io_archivo_importado.Application.workbooks(1).worksheets(1).Cells(ll_i,1).Value ) Then
//Return -1
Else
il_pais = integer(io_archivo_importado.Application.workbooks(1).worksheets(1).Cells(ll_i,1).Value)
il_zona = integer(io_archivo_importado.Application.workbooks(1).worksheets(1).Cells(ll_i,2).Value)
ll_codigo_consejera = long(io_archivo_importado.Application.workbooks(1).worksheets(1).Cells(ll_i,3).Value)
ls_nombre_consejera = string(io_archivo_importado.Application.workbooks(1).worksheets(1).Cells(ll_i,4).Value)

dw_detalle.settransobject(SQLCA)

dw_detalle.insertrow(0)

dw_detalle.object.pais[ll_i - 1] = il_pais
dw_detalle.object.zona[ll_i - 1] = il_zona
dw_detalle.object.code[ll_i - 1] = ll_codigo_consejera
dw_detalle.object.nombre[ll_i - 1] = ls_nombre_consejera
dw_detalle.object.volumentop[ll_i - 1] = CERO//dl_volumen
dw_detalle.object.estrellastop[ll_i - 1] = CERO//dl_estrellas
dw_detalle.object.es_top_prod[ll_i - 1] = UNO//il_estop_prod

st_mensajes.text = 'Importando consejera: ' + string(ll_codigo_consejera) + ' '+ls_nombre_consejera+ ' Zona: ' + string(il_zona) + ' Registro No. ' + string (ll_i - 1)
End If

Next

io_archivo_importado.Application.ActiveWorkbook.Close()

io_archivo_importado.DisconnectObject()

Destroy io_archivo_importado

of_act_cons_top() //Funcion que hace proceso despues de importar el archivo Excel.

return 1

04. Crear otra funcion para ejecutar el proceso que necesiten hacer

NOTA: Este proceso es mucho mas rapido que con ODBC y no necesitan instalar nada en las maquina cliente. Funciona con archivos XLS, XLSX.

Espero les sirva

RE:Importar archivo Excel a Datawindow

Publicado por eduardo.v (34 intervenciones) el 10/08/2010 22:00:24
GRACIAS lo voy a probar

RE:Importar archivo Excel a Datawindow

Publicado por Daniel Rodas (27 intervenciones) el 10/08/2010 22:04:39
Lo unico que tienen que averiguar(no he podido encontrarlo) es como saber dinamicamente el numero de filas que trae el archivo Excel.

RE:Importar archivo Excel a Datawindow

Publicado por Juan Felipe Ocampo (2 intervenciones) el 24/02/2017 16:15:48
Solo valida que la columna no es nula asi recorre todas las columnas, ya que no hay manera de consultar el numero de columnas que tiene el archivo
sin imagen de perfil

Importar archivo Excel a Datawindow

Publicado por Juan Figueroa (2 intervenciones) el 20/06/2012 21:08:20
HOLA DANIEL...

TENGO UN PROBLEMA CON LA SOLUCION QUE DISTE.

La función 'ImportFile' para la datawindows no acepta la extensión 'XLS'.

¿Cómo haces para que te funcione?
sin imagen de perfil

Importar archivo Excel a Datawindow

Publicado por Roberto (3 intervenciones) el 23/01/2014 23:36:54
Gracias por la ayuda, tu ejemplo me ayudo en este tema

Importar archivo Excel a Datawindow

Publicado por Felipe (4 intervenciones) el 03/10/2020 01:04:23
Una consulta porque no reconoce SUCCESS y FAILURE, que son variables? o funciones especiales.