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
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
Valora esta pregunta
0