viernes, 8 de julio de 2011

Cómo importar datos desde una hoja Excel

Más de una vez los usuarios nos habrán solicitado la posibilidad de importar datos desde una hoja Excel en las aplicaciones. Desgraciadamente PowerBuilder no incluye la funcionalidad para hacer esto.


El control DataWindow sí incluye la función ImportFile que nos permitirá importar otro tipo de orígenes de datos. Así que siempre tenemos la posibilidad de indicar al usuario que guarde la hoja Excel según el formato que nos convenga y luego lo importe. Pero si queremos hacerlo evitando este paso el código necesario es muy simple.

Os cuento las dos opciones que he utilizado yo en mi trabajo:

Utilizar el portapapeles de Windows (ImportClipboad)

La opción más simple (en cuanto a código) es utilizar la opción de copiar el contenido del porta papeles al DW utilizando la función ImportClipboard. Realmente este método no realiza una importación desde Excel. Para que funcione tendremos que decirle al usuario que seleccione las celdas que quiere copiar de la Excel, las copie al porta papeles de Windows y posteriormente pulse el botón correspondiente en la aplicación para que pegue el contenido en el DW.

Este método, por su fácil implementación, puede ser una buena solución para el usuario. En mi caso al menos lo fue.

Integer li_res
String ls_msgerr

dw_datos.Reset()

li_res = dw_datos.ImportClipboard()

choose case li_res
       case -1  
             ls_msgerr = "No rows or startrow value supplied is greater than the number of rows in the string"
       case -3
             ls_msgerr = "Invalid argument"
       case -4
             ls_msgerr = "Origen de datos incompatible. Verifique que los campos numéricos no incluyen símbolo de euro"
       case -11
             ls_msgerr = "XML Parsing Error; XML parser libraries not found or XML not well formed"
       case -12
             ls_msgerr = "XML Template does not exist or does not match the DataWindow"
       case -13
             ls_msgerr = "Unsupported DataWindow style for import"
       case -14
             ls_msgerr = "Error resolving DataWindow nesting"
       case else
end choose

if ls_msgerr = "" then
       MessageBox("Atención", ls_msgerr)
end if

 

Utilizar Ole para leer el contenido de la hoja Excel
Este método es algo más laborioso que la opción anterior pero permite importar cualquier hoja Excel con un margen de posibilidades mayor. La pega que le veo yo a este método es que necesitas tener instalada una versión de Microsoft Excel en el equipo en el que quieras realizar la importación. Por lo demás este método es realmente sencillo de utilizar y totalmente ajustable a cualquier necesidad.

// variables
string       ls_pathFileName, ls_fileName, ls_AppPath, ls_string, ls_msgerr
oleobject    lole_excel, lole_worksheet
long         ll_excel_first_row = 2, ll_excel_actual_row, ll_long
any          la_null
datetime     ldt_datetime

GetFileOpenName("Seleccione el archivo Excel a importar", ls_pathFileName, ls_fileName)

lole_excel = create oleobject

if lole_excel.ConnectToNewObject("Excel.Application") < 0 then
       ls_msgerr = "No es posible ejecutar Microsoft Excel. Valide que tiene instalada la aplicación"
else
       TRY
             lole_excel.WorkBooks.Open(ls_PathFileName)
             lole_worksheet = lole_excel.Application.WorkBooks(1).WorkSheets(1)
      
             SetNull(la_null)
      
             do while not IsNull(lole_worksheet.Cells(ll_excel_first_row + ll_excel_actual_row, 2).Value)
                    // se leen los datos del registro de la Excel
                    ll_long                    = wf_ifnull(lole_worksheet.Cells(ll_excel_first_row + ll_excel_actual_row, 1).Value, Long(la_null))
                    ldt_datetime = wf_ifnull(lole_worksheet.Cells(ll_excel_first_row + ll_excel_actual_row, 2).Value, DateTime(la_null))
                    ls_string           = wf_ifnull(lole_worksheet.Cells(ll_excel_first_row + ll_excel_actual_row, 3).Value, String(la_null))
                   
                    // aquí faltaría el código para traspasar los valores que hemos leído de la Excel al DW que queramos
                    // dw_datos.SetItem(numero, "campo", ll_long)
                    // ...
                   
                    ll_excel_actual_row ++
             loop
      
             lole_excel.Application.ActiveWorkBook.Close()
             lole_excel.DisconnectObject()
            
       CATCH (throwable excep)
             ls_msgerr = "Se ha producido un error al importar el fichero Excel:~r~n~r~n" + excep.GetMessage()
       END TRY
      
       destroy lole_excel
end if

if ls_msgerr <> "" then
       MessageBox("Mensaje", ls_msgerr)
end if

Y el contenido de la función wf_ifnull:

public function any wf_ifnull (readonly any la_value, readonly any la_return_if_null);
if IsNull(la_value) then
       Return la_return_if_null
else
       Return la_value
end if
end function

No hay comentarios:

Publicar un comentario