Page 1 of 1

De Excel a DBF

Posted: Wed Oct 11, 2006 7:25 pm
by Julio Cepeda
He bajado un ejemplo que hay por aquí por el foro para leer un archivo "XLS" y meterlo en una dbf.

Utilizo harbour con borland (BCC55)

Al compilar me da el siguiente error:
Error: Unresolved external '_HB_FUN_TOLEAUTO' referenced from C:\HARBPROG\_OTROS\EXCELDBF\EXCELDBF.OBJ

¿ Algún alma caritativa sabe si falta alguna librería ? Y abusando de vuestra amabilidad ¿ Dónde está dicha librería ?

Muchas gracias a todos y un cordial saludo.

Posted: Wed Oct 11, 2006 8:48 pm
by R.F.
La clase TOLEAUTO esta includa en xHarbour, mas no asi en Harbour, deberas incluir el archivo correspondiente (OLEAUTOMAT.LIB) para poder utilizar el ejemplo

Posted: Thu Oct 12, 2006 8:23 am
by Julio Cepeda
Muchas gracias Rene, no encuentro en ningún sitio la librería esa que me dices OLEAUTOMAT.LIB, pero lo he compilado con xHarbour y me da el siguiente error:

Error description: Error TOleAuto/-1 CO_E_CLASSSTRING: TOLEAUTO:NEW
Args:
[ 1] = C Excel.Application

Stack Calls
===========
Called from: => THROW(0)
Called from: win32ole.prg => TOLEAUTO:NEW(319)
Called from: ExcelDbf.prg => MAIN(7)

el código es el mismo que publicas tu en otro post:
#include "FiveWin.ch"

Function Main()

LOCAL oExcel, oHoja, nRows, nCols
LOCAL TCampos:={}, nRow, nCol

oExcel := TOleAuto():New( "Excel.Application" )

oExcel:Visible := .T. // por si quieres ver la hoja abierta

oExcel:WorkBooks:Open(cGetFile("*.XLS", "Seleccione Fichero"))

oHoja := oExcel:Get( "ActiveSheet" )

nRows := oHoja:UsedRange:Rows:Count()
nCols := oHoja:UsedRange:Columns:Count()
/*
USE <tu dbf>

FOR nRow := 2 TO nRows
APPEND BLANK
FOR nCol := 1 TO nCols
xValue := oHoja:Cells(nRow,nCol):Value
FieldPut(nCol,xValue)
SysRefresh()
NEXT
DBCOMMIT()
Memory(-1)
NEXT
*/
oExcel:Quit()
oHoja:End()
oExcel:End()

Return NIL

Supongo que estaré haciendo algo mal pero no se el qué.

Si esto llega a funcionar con xHarbour haré un ejecutable aparte que llamaré desde mi aplicaión compilada con harbour.

Muchas gracias de nuevo y un saludo.

Posted: Thu Oct 12, 2006 4:30 pm
by R.F.
Ese ejemplo precisamente lo hice yo, y me funciona estupendamente.

Necesitaria saber, que version de xHB estas usando y si tienes Excel debidamente instalado en el equipo donde estas probando el ejemplo.

Posted: Thu Oct 12, 2006 4:40 pm
by Julio Cepeda
Gracias Rene, vas a tener razón en lo del excel, pues yo no lo tengo instalado, sino que tengo un excel del Office 97 que lo copio al disco con sus dll's y no lo instalo.

A lo mejor no se registra correctamente.

En cuanto a la versión de xHarbour la he bajado esta mañana de la página de fivetech en la pagina que se entra con el password que me dio Silvia cundo adquirí la versión de FWH 2.8 hace unos días.

Porbaré con un Excel bien instalado.

Gracias y un saludo

Posted: Fri Oct 13, 2006 8:59 am
by Julio Cepeda
Efectivamente Rene no funcionaba porque no tenía el Excel instalado, pues ahora funciona perfectamente.

Lo único es que me daba un error al terminar por cerrar la hoja:

oHoja:End()
oHoja:Quit()

Me lo daba con los dos métodos, Quit y End pero se lo he comentado y funciona perfectamente.

Te lo agradezco mucho porque tengo 3 aplicaciones que se lo mandan en Excel y yo lo que hacía era guardarlo desde Excel como archivo DBF y despues desde este importarlo al mío, y era un rollo.

Al final el que me funciona bien es este:

#include "FiveWin.ch"


#define NL Chr( 10 ) + Chr( 13 )


Function MAin()

LOCAL oExcel, oHoja, nRows, nCols
LOCAL aCampos:={}, nRow, nCol
LOCAL cTexto := Space( 0 ), xValue

oExcel := TOleAuto():New( "Excel.Application" )

oExcel:Visible := .T. // por si quieres ver la hoja abierta

oExcel:WorkBooks:Open( cGetFile32("*.XLS", "Seleccione Fichero") )

oHoja := oExcel:Get( "ActiveSheet" )

nRows := oHoja:UsedRange:Rows:Count()
nCols := oHoja:UsedRange:Columns:Count()
/*
USE <tu dbf>

FOR nRow := 2 TO nRows
APPEND BLANK
FOR nCol := 1 TO nCols
xValue := oHoja:Cells(nRow,nCol):Value
FieldPut(nCol,xValue)
SysRefresh()
NEXT
DBCOMMIT()
Memory(-1)
NEXT
*/
FOR nRow := 2 TO nRows
cTexto := Space( 0 )
FOR nCol := 1 TO nCols
xValue := oHoja:Cells(nRow,nCol):Value
// MsgInfo( ValType( xValue ) )
cTexto += xValue + NL
// SysRefresh()
NEXT
MsgInfo( cTexto )
NEXT

Memory(-1)
// oHoja:End()
// oHoja:Quit()
oExcel:Quit()
// oExcel:End()


Return NIL

Muchisimas gracias de nuevo y quedo a tu disposición para lo que gustes.

Un saludo.