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