Buenas tardes. Hace tiempo encontré la siguiente función para importar desde excel de una forma bastante rápida. El único detalle que tienes que checar es el archivo resultante, pues la mayoria de los campos te los genera como MEMO, cosa que puedes resolver creando una función que recorra el cursor haciendo las conversiones necesarias.
Lee el contenido de la primera hoja del archivo excel, parámetro que puedes pasar como lcNombreHoja, punto que modifiqué para evitar que siempre sea Hoja1$.
Espero te sea de ayuda.
*-----------------------------------
* AUTHOR: Trevor Hancock
* CREATED: 02/15/08 04:55:31 PM
* ABSTRACT: Code demonstrates how to connect to
* and extract data from an Excel 2007 Workbook
* using the "Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)"
* from the 2007 Office System Driver: Data Connectivity Components
*-----------------------------------
FUNCTION ImportarDesdeXls_Xlsx
PARAMETERS lcXLBook, lcNombreHoja
LOCAL loExcel, lcArchio AS STRING, lnSQLHand AS INTEGER, lcSQLCmd AS STRING, lnSuccess AS INTEGER, lcConnstr AS STRING
IF USED('xlResults')
USE IN xlResults
ENDIF
llError = .f.
TRY
loExcel = CreateObject([Excel.Application])
CATCH
llError = .t.
ENDTRY
IF !llError AND VARTYPE(loExcel)="O"
llError = .f.
TRY
loLibro = loExcel.Workbooks.Open(lcXLBook)
CATCH
llError = .t.
ENDTRY
IF !llError
loHoja = loLibro.ActiveSheet
lcNombreHoja = loHoja.Name
loLibro.Close
loExcel.Quit
*!*
*!* Driver XLS
*!*
lcConnstr = [Driver=] + [{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};] + [DBQ=] + lcXLBook
IF !FILE( lcXLBook )
MESSAGEBOX('No se encontró el archivo '+ALLTRIM(lcXLBook)+'.', 16, 'Atención')
RETURN .F.
ENDIF
lcArchivo = JUSTSTEM(lcXLBook)
*-- Attempt a connection to the .XLSX WorkBook.
*-- NOTE: If the specified workbook is not found,
*-- it will be created by this driver! You cannot rely on a
*-- connection failure - it will never fail. Ergo, success
*-- is not checked here. Used FILE() instead.
lnSQLHand = SQLSTRINGCONNECT( lcConnstr )
*-- Connect successful if we are here. Extract data...
lcSQLCmd = [Select * FROM "]+lcNombreHoja+[$"]
lnSuccess = SQLEXEC( lnSQLHand, lcSQLCmd, [xlResults] )
IF lnSuccess<0
lcSQLCmd = [Select * FROM "Hoja1$"]
lnSuccess = SQLEXEC( lnSQLHand, lcSQLCmd, [xlResults] )
ENDIF
SQLDISCONNECT( lnSQLHand )
IF lnSuccess < 0
LOCAL ARRAY laErr[1]
AERROR( laErr )
MESSAGEBOX(laErr(3), 16, 'Atención')
RETURN .F.
ELSE
RETURN .T.
ENDIF
ENDIF
ENDIF
RETURN .f.
Saludos desde México, D.F.