Está en la página 1de 5

Function From_Excel(lcXls As String, lcCur As String, lnCab As Integer, lcDelim As

String, lnHojas As Integer, lnIniCol As Integer)

***********************************************************************************
*******************************************
*!* Convierte un archivo "XLS" / "XLSX" / "CSV" / "SLK" en un cursor.

***********************************************************************************
*******************************************
*!* Parametros:
*!* lcXls: Ruta completa y nombre de archivo excel (Obl.).
Si se omite la ruta, se tomará la carpeta actual.
*!* lcCur: Nombre del cursor a generar (Opc.). Si se
omite, se genera uno automáticamente.
*!* lnCab: Nº de lineas antes de la que contiene los
nombres de columnas (Opc.)
*!* lcDelim: Carácter delimitador de campos, si el archivo que se
está leyendo es un CSV. (Opc.)
*!* Si el archivo es XLS o XLSX, no se tomará en cuenta.
*!* lnHojas: Nº de hojas a leer (incluida la 1ª). Si se omite, se
tomará 1. Si se pasa '999', tomará todas. (Opc.)
*!* lnIniCol: Nº de columna donde se encuentra el 1er. campo a
leer. Por omisión 1. (Opc.)
*!*
*!* Valor Devuelto: Nombre del cursor generado (Char)

***********************************************************************************
*******************************************
*!* Ejemplo de uso:
*!* From_Excel("C:\EXODUS\CLIENTES.XLS","MisClientes")
*!* From_Excel("C:\EXODUS\CLIENTES.XLSX","MisClientes")
*!* myCur = From_Excel("C:\EXODUS\CLIENTES.XLS",,2) --> La variable
'myCur', devolverá el nombre del cursor generado.

***********************************************************************************
*******************************************
Local lcXLBook, lcCursor, lnSheetCount, lnSheet
*
If Vartype(lcXls)<>'C'
lcXLBook = Getfile('xls, xlsx, xlsm, xlsb, csv, slk', 'Archivo:',
'Aceptar', 0, 'Seleccione una hoja excel')
Else
lcXLBook = lcXls
Endif
If Empty(m.lcXLBook)
Return .F.
Endif

If Empty(Justpath(lcXLBook))
lcXLBook = Fullpath("") + lcXLBook
Endif

If Not File(m.lcXLBook)
Messagebox("Archivo no encontrado", 16)
Return .F.
Endif

If Vartype(lcCur)<>'C'
lcCursor = Sys(2015)
Else
If !Empty(lcCur)
lcCursor = lcCur
Else
lcCursor = Sys(2015)
Endif
Endif

* Comprobar variable con nº lineas antes del encabezado con los nombres de
campos
If Vartype(lnCab)<>'N'
lnCab = 0
Endif

* Comprobar variable con "Delimitador", si se está leyendo un fichero .CSV


If Vartype(lcDelim)<>'C'
lcDelim = ";"
Else
If !Inlist(lcDelim, ",", ";", "|", " ", Chr(9))
lcDelim=';'
Endif
Endif

* Nº Total de Hojas de archivo Excel a leer.


If Vartype(lnHojas)<>'N'
lnHojas = 1
Else
lnHojas = Max(1, lnHojas)
Endif

* Nº Columna a partir de la que empiezan los datos a leer


If Vartype(lnIniCol)<>'N'
lnIniCol = 1
Endif

*-
*-- Crear Objeto Excel
Local loExcel As Excel.Application
loExcel = Createobject("Excel.application")

If Vartype(m.loExcel, .T.) <> 'O'


Messagebox("No se puede procesar el archivo porque no tiene la
aplicación" ;
+ Chr(13) + "Microsoft Excel instalada en su computador.", 16)
loExcel = Null
Release m.loExcel
Return .F.
Else
loExcel.DisplayAlerts = .F.
Endif

* Abrir archivo Excel


If Upper(Justext(m.lcXLBook)) = 'CSV'
m.loExcel.workbooks.Open(m.lcXLBook,,.F.,6,,,,2,lcDelim,,,,,.T.)
Else
m.loExcel.workbooks.Open(m.lcXLBook)
Endif

* Comprobar nº de hojas
If lnHojas = 999
lnSheetCount = m.loExcel.sheets.Count
Else
lnSheetCount = lnHojas
Endif

* Repasar hojas para capturar datos


For lnSheet = 1 To m.lnSheetCount
Sheet2Cursor(m.loExcel, m.lnSheet, m.lnCab, m.lnIniCol)
If m.lnSheet = 1
Select * From curTmp Into Cursor (m.lcCursor) Readwrite
Else
Select (m.lcCursor)
Append From Dbf("curTmp")
Endif
Use In Select("curTmp")
Endfor

loExcel.DisplayAlerts = .F.
m.loExcel.ActiveWindow.Close(.F.)
m.loExcel.Quit()
loExcel = Null

Return lcCursor

Endfunc

*-----------------------------------------------------------------------------
Procedure Sheet2Cursor(toExcel As Excel.Application, tnSheet As Integer, tnCab As
Integer, tnIni As Integer)

#Define xlLastCell 11

Local Array laData[1, 1], ;


laCampo[1, 18], laTit[1]
Local lcSheet

Local loLastCell As Excel.Range, ;


lnImportedColumns, ;
lnField, ;
lnReg

Local lcTipoCampo, lnAncho, lnCol, ;


lnColumns, lnDigDec, lnDigEnt, lnFilas

If tnSheet > 1
tnCab = 0
Endif

m.toExcel.sheets(1).Select
lcSheet = m.toExcel.sheets(m.tnSheet).Name

With m.toExcel.ActiveWorkBook.ActiveSheet
loLastCell = .Cells.SpecialCells( xlLastCell )
laTit = .Range(.Cells(1 + tnCab, tnIni), .Cells(1 + tnCab,
m.loLastCell.Column)).Value
laData = .Range(.Cells(2 + tnCab, tnIni), m.loLastCell).Value
Endwith
lnColumns = Alen(m.laTit)
lnFilas = Alen( m.laData, 1 )
Dimension m.laCampo[m.lnColumns, 18]
laCampo = ""
For lnCol = 1 To m.lnColumns
*
cTitulo = Chrtran(m.laTit[m.lnCol],[ºªÜÁÉÍÓÚüáéíóú ()/\.,%],
[oaUAEIOUuaeiou_____]) && m.laTit[m.lnCol]
cTitulo = Strtran(m.cTitulo,[__],[_])
lcTipoCampo = Vartype(m.laData[2, m.lnCol])
*
laCampo[m.lnCol, 1] = m.cTitulo
laCampo[m.lnCol, 2] = m.lcTipoCampo
laCampo[m.lnCol, 3] = 1
laCampo[m.lnCol, 4] = 0

laCampo[m.lnCol, 5] = .T.
laCampo[m.lnCol, 6] = .F.
laCampo[m.lnCol, 17] = 0
laCampo[m.lnCol, 18] = 0

If m.lcTipoCampo $ "DT"
laCampo[m.lnCol, 3] = 8
laCampo[m.lnCol, 4] = 0
Endif
Endfor

lnImportedColumns = Alen( m.laData, 2 )


For lnField = 1 To m.lnImportedColumns
For lnReg = 1 To Alen( m.laData, 1 )
lcTipoCampo = Vartype(m.laData[m.lnReg, m.lnField])
Do Case
Case m.lcTipoCampo == "N"
lnDigEnt = DigEnt(m.laData[m.lnReg, m.lnField])
lnDigDec = DigDec(m.laData[m.lnReg, m.lnField])
lnAncho = m.lnDigEnt + m.lnDigDec + 2
If m.lnAncho > m.laCampo[m.lnField, 3]
laCampo[m.lnField, 3] = m.lnAncho
Endif
If m.lnDigDec > m.laCampo[m.lnField, 4]
laCampo[m.lnField, 4] = m.lnDigDec
Endif
Case m.lcTipoCampo == "C"
laData[m.lnReg, m.lnField] = Trim(m.laData[m.lnReg,
m.lnField])
lnAncho =
Len(m.laData[m.lnReg, m.lnField])
If m.lnAncho > 254
laCampo[m.lnField, 2] = "M"
laCampo[m.lnField, 3] = 4
laCampo[m.lnField, 4] = 0
Else
If m.laCampo[m.lnField, 2] <> "M"
If m.lnAncho > m.laCampo[m.lnField, 3]
laCampo[m.lnField, 3] = m.lnAncho
laCampo[m.lnField, 4] = 0
Endif
Endif
Endif
Endcase
Endfor
Endfor

Create Cursor curTmp ;


FROM Array m.laCampo
Insert Into curTmp ;
FROM Array m.laData

Endproc

*-----------------------------------------------------------------------------
Function DigEnt(tnNumero As Number)

Return Iif(m.tnNumero = 0, 1, Int(Log(Abs(m.tnNumero)) / Log(10)) + 1)

Endfunc

*-----------------------------------------------------------------------------
Function DigDec(tnNumero As Number)

Local lcDig, lcDigDec, lcParteDec, llIgn0, lnParteDec, lnPos, lnSetDecim

lnSetDecim = Set("Decimals")
Set Decimals To 18

lnParteDec = Abs(m.tnNumero) - Int(Abs(m.tnNumero))


lcParteDec = Transform(m.lnParteDec)
lcDigDec = ""
llIgn0 = .T.
For lnPos = Len(m.lcParteDec) To 3 Step - 1
lcDig = Substr(m.lcParteDec, m.lnPos, 1)
If m.llIgn0 And m.lcDig == "0"
Loop
Endif
llIgn0 = .F.
lcDigDec = m.lcDig + m.lcDigDec
Endfor

Set Decimals To(m.lnSetDecim)

Return Len(m.lcDigDec)

Endfunc

También podría gustarte