Página 1 de 1

tExcelScript() desde xHarbour -> a Harbour

Publicado: Lun Jun 01, 2015 6:39 pm
por Israel Solis
Colegas:

Durante años he usado la clase TExcelScript() de Vikthor para leer archivos de Excel no he tenido problemas con Xailer 2.x y xHarbour

Ahora, POR FIN, estoy migrando a Xailer 4 y Harbour y esta clase ya me marca múltiples errores, para no reinventar el hilo negro.. alguien ya ha resuelto la migración de esta clase para lectura de archivos de Excel u otra equivalente ?

GRACIAS

SALUDOS

Israel

Re: tExcelScript() desde xHarbour -> a Harbour

Publicado: Mié Jun 03, 2015 1:15 pm
por bingen
Hola Israel no hay problemas para leer archivos excel por OLE siempre y cuando tengas instalado Excel en la máquina, para eso no necesitas ninguna librería, el problema es leer o generar archivos excel sin tener el office instalado.

Aquí tienes una función para leer una excel

//*/
// FUNCION que abre un archivo Excel selecciona una página la lee y nos devuelve un array

// @author Bingen Ugaldebere
// @param cFile Archivo excel a abrir
// @param xColumnas Opcional. Número de columnas a leer si no se indica se leen todas, si se indica un nº limitado se acelera mucho el proceso.
// También se puede indicar un array {nFilas,nColumnas} para leer solo un área determinada desde la posición 1,1
// @param nHojaExcel Opcional. Nº de la hoja excel a leer por defecto la 1
// @param nFilasVacias Opcional. Al de cuantas filas consecutivas vacias se deja de leer la hoja, por defecto 20
// @param lConvertNulls Opcional. Si las celdas vacias se convierten a '' por defecto .T.

// @return aDatos Array con el contenido de la hoja leida
///

FUNCTION ReadFromExcel( cFile, xColumnas, nHojaExcel, nFilasVacias, lConvertNulls )

LOCAL oExcel, oPage
LOCAL aDatos := {}, aLinea := {}, nLine := 0, nCol := 0, lVacio := .F., nContador:=0
LOcal nFilas:=0, nColumnas:=0

DEFAULT xColumnas TO 256
DEFAULT nHojaExcel TO 1
DEFAULT nFilasVacias TO 20
DEFAULT lConvertNulls TO .T.


IF !File( cFile )
MsgStop( "No existe el documento Excel " + cFile)
RETURN {}
ENDIF

TRY
oExcel := GetActiveObject( "Excel.Application" )
CATCH
TRY
oExcel := CreateObject( "Excel.Application" )
CATCH
MsgInfo( "Excel no disponible. [" + Ole2TxtError() + "]" )
RETURN .F.
END
END

oExcel:WorkBooks:Open( cFile )
oPage := oExcel:WorkSheets( nHojaExcel )

If ValType(xColumnas)="A"
nFilas:=xColumnas[1]
nColumnas:=xColumnas[2]
Else
nColumnas:=xColumnas
Endif

WaitOn( "Leyendo datos de Hoja Excel",,"Excel" )
FOR nLine := 1 TO 65536
lVacio := .T.
aLinea := {}
FOR nCol := 1 TO nColumnas
AAdd( aLinea, IF(lConvertNulls .And. oPage:Cells( nLine, nCol ):Value=Nil,'',oPage:Cells( nLine, nCol ):Value ) )
IF lVacio .AND. !Vacio( aLinea[ Len( aLinea ) ] )
lVacio := .F.
nContador := nFilasVacias
ENDIF
NEXT

//Limite de filas si se ha requerido
If nFilas<>0 .And. nLine>nFilas
Exit
Endif

IF lVacio
nContador--
IF nContador = 0
EXIT
ENDIF
ELSE

AAdd( aDatos, aLinea )
ENDIF
NEXT

oExcel:Quit()

WaitOff()

ProcessMessages()

RETURN aDatos

Re: tExcelScript() desde xHarbour -> a Harbour

Publicado: Mié Jun 03, 2015 5:00 pm
por Israel Solis
Bingen:

Mil gracias, como siempre haz salvado una vez mas mi cuello