olesetproperty
-
- Posts: 149
- Joined: Thu Jun 21, 2007 3:26 pm
olesetproperty
Hola. Tengo una aplicacion donde necesito leer una base dbf, y mostrarla en excel. Usando los samples de fivewin (tengo harbour 803), pude hacerla sin problemas. Pero uno de los campos de la dbf, a pesar de ser texto, tiene valores "001","002", etc. y se muestran en la planilla excel como numericos, cosa que no me sirve. ¿tienen idea como puedo hacer para que en la planillita me aparezca "001", "002", etc... o sea, el tipo de dato que quiero, no me sirve transformarlo antes a mi, porque puedo tener valores "001", "002", pero tambien "T5079-P1".
¿Hay algun propiedad para establecer la celda con formato "texto"? color a la fuente, bold, etc, le pude poner, pero esto no. Gracias. Atte.
¿Hay algun propiedad para establecer la celda con formato "texto"? color a la fuente, bold, etc, le pude poner, pero esto no. Gracias. Atte.
-
- Posts: 149
- Joined: Thu Jun 21, 2007 3:26 pm
Re: olesetproperty
diegopolverelli wrote:Hola. Tengo una aplicacion donde necesito leer una base dbf, y mostrarla en excel. Usando los samples de fivewin (tengo harbour 803), pude hacerla sin problemas. Despues tengo que tomar los datos modificados y validar algunas cosas. Pero si pongo un numero en una columna, no lo puedo recuperar. En realidad no puedo tratar el dato. ¿existe alguna funcion que me diga que tipo de dato es el que tengo? ej.: xart_codig=5 y despues como se si preguntar si xart_codig=0 o a "0" si que falle la aplicacion. Gracias.
- Willi Quintana
- Posts: 1025
- Joined: Sun Oct 09, 2005 10:41 pm
- Location: Cusco - Perú
- Contact:
- Antonio Linares
- Site Admin
- Posts: 42529
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 77 times
- Contact:
-
- Posts: 149
- Joined: Thu Jun 21, 2007 3:26 pm
Antonio, yo use un esquema similar a de los samples, utilizando OLESETPROPERTY y OLEGETPROPERTY. ¿como se puede invocar de la manera que me decis vos? tenes algun ejemplo. Te adjunto un codigo donde leo de una base y lleno una tabla xls.
Otra cosa, cuando la tabla es grande, por ej, 10000 reg. el proceso de llenar el .xls tarda muchisimo (10 /20 minutos) ¿que puede ser?
Gracias. Atte.
//---------------------
FUNCTION IMPO_LCOS(XLISPRE, odlg)
LOCAL oWnd, oOwc, hActiveWindow, nCounter, hsheet, x, cell, font, xfila, xfin, format
LOCAL XVERSION, xcompleta
// en la base ini guardo un parametro con la version del office
SELE 99
USE C:\TEMPO\INI SHARED
LOCA FOR INI->PARAMETRO='VERSION'
IF !EOF()
DO CASE
CASE VAL(LEFT(INI->VALOR,1))=1
XVERSION="OWC9.Spreadsheet"
CASE VAL(LEFT(INI->VALOR,1))=2
XVERSION="OWC10.Spreadsheet"
CASE VAL(LEFT(INI->VALOR,1))=3
XVERSION="OWC11.Spreadsheet"
CASE VAL(LEFT(INI->VALOR,1))=4
XVERSION="OWC12.Spreadsheet"
OTHERWISE
XVERSION="OWC"+ALLTRIM(SUBSTR(INI->VALOR,2,2))+".Spreadsheet"
ENDCASE
ELSE
XVERSION="OWC11.Spreadsheet"
ENDIF
SELE 99
USE
odlg:disable()
DEFINE WINDOW oWnd Title "IMPORTACION DE LISTA DE COSTOS "+alltrim(upper(xlispre))
@ 0, 0 ACTIVEX oOwc;
PROGID XVERSION
// PROGID "OWC10.Spreadsheet"
hActiveWindow = oOwc:GetProp( "ActiveWindow" )
OleSetProperty( hActiveWindow, "ColumnHeadings", 1, "Codigo" )
OleSetProperty( hActiveWindow, "ColumnHeadings", 2, "Descripcion" )
OleSetProperty( hActiveWindow, "ColumnHeadings", 3, "Precio" )
hSheet = oOwc:GetProp( "ActiveSheet" )
x:=1
sele 1
use &empre\costo.sx shared
COPY TO C:\TEMPO\TMPCOSTO FOR COSTO->CLI_LISPR=XLISPRE
USE C:\TEMPO\TMPCOSTO ALIAS COSTO
SELE 2
USE &EMPREST\ART.SX INDEX &EMPREST\ARTC SHARED
CURSORWAIT()
if msgyesno("Edita la lista de costos completa? (esta operacion tarda mas tiempo)","Atencion")
xcompleta=.t.
else
xcompleta=.f.
endif
SELE 1
INDEX ON COSTO->ART_CODIG TO C:\TEMPO\TMPART3
go top
do while !eof()
XART_CODIG:=COSTO->ART_CODIG
SELE 2
SET SOFTSEEK OFF
SEEK XART_CODIG
IF !EOF()
OleSetProperty( hActiveWindow, "RowHeadings", x, Str( x ) )
OleSetProperty( hSheet, "Cells", x, 1, "'"+XART_CODIG )
SELE 2
OleSetProperty( hSheet, "Cells", x, 2, ART->ART_DESCR )
SELE 1
OleSetProperty( hSheet, "Cells", x, 3, COSTO->PRECIO )
ENDIF
x:=x+1
if xcompleta=.f. .and. x>10
sele 1
go bott
endif
sele 1
skip
enddo
CURSORARROW()
// OleSetProperty( hActiveWindow, "ViewableRange", "A1:D6" )
hSheet = oOwc:GetProp( "ActiveSheet" )
oWnd:oClient = oOwc
ACTIVATE WINDOW oWnd valid VERIFICA(HSHEET,xlispre,odlg)
RETURN NIL
Otra cosa, cuando la tabla es grande, por ej, 10000 reg. el proceso de llenar el .xls tarda muchisimo (10 /20 minutos) ¿que puede ser?
Gracias. Atte.
//---------------------
FUNCTION IMPO_LCOS(XLISPRE, odlg)
LOCAL oWnd, oOwc, hActiveWindow, nCounter, hsheet, x, cell, font, xfila, xfin, format
LOCAL XVERSION, xcompleta
// en la base ini guardo un parametro con la version del office
SELE 99
USE C:\TEMPO\INI SHARED
LOCA FOR INI->PARAMETRO='VERSION'
IF !EOF()
DO CASE
CASE VAL(LEFT(INI->VALOR,1))=1
XVERSION="OWC9.Spreadsheet"
CASE VAL(LEFT(INI->VALOR,1))=2
XVERSION="OWC10.Spreadsheet"
CASE VAL(LEFT(INI->VALOR,1))=3
XVERSION="OWC11.Spreadsheet"
CASE VAL(LEFT(INI->VALOR,1))=4
XVERSION="OWC12.Spreadsheet"
OTHERWISE
XVERSION="OWC"+ALLTRIM(SUBSTR(INI->VALOR,2,2))+".Spreadsheet"
ENDCASE
ELSE
XVERSION="OWC11.Spreadsheet"
ENDIF
SELE 99
USE
odlg:disable()
DEFINE WINDOW oWnd Title "IMPORTACION DE LISTA DE COSTOS "+alltrim(upper(xlispre))
@ 0, 0 ACTIVEX oOwc;
PROGID XVERSION
// PROGID "OWC10.Spreadsheet"
hActiveWindow = oOwc:GetProp( "ActiveWindow" )
OleSetProperty( hActiveWindow, "ColumnHeadings", 1, "Codigo" )
OleSetProperty( hActiveWindow, "ColumnHeadings", 2, "Descripcion" )
OleSetProperty( hActiveWindow, "ColumnHeadings", 3, "Precio" )
hSheet = oOwc:GetProp( "ActiveSheet" )
x:=1
sele 1
use &empre\costo.sx shared
COPY TO C:\TEMPO\TMPCOSTO FOR COSTO->CLI_LISPR=XLISPRE
USE C:\TEMPO\TMPCOSTO ALIAS COSTO
SELE 2
USE &EMPREST\ART.SX INDEX &EMPREST\ARTC SHARED
CURSORWAIT()
if msgyesno("Edita la lista de costos completa? (esta operacion tarda mas tiempo)","Atencion")
xcompleta=.t.
else
xcompleta=.f.
endif
SELE 1
INDEX ON COSTO->ART_CODIG TO C:\TEMPO\TMPART3
go top
do while !eof()
XART_CODIG:=COSTO->ART_CODIG
SELE 2
SET SOFTSEEK OFF
SEEK XART_CODIG
IF !EOF()
OleSetProperty( hActiveWindow, "RowHeadings", x, Str( x ) )
OleSetProperty( hSheet, "Cells", x, 1, "'"+XART_CODIG )
SELE 2
OleSetProperty( hSheet, "Cells", x, 2, ART->ART_DESCR )
SELE 1
OleSetProperty( hSheet, "Cells", x, 3, COSTO->PRECIO )
ENDIF
x:=x+1
if xcompleta=.f. .and. x>10
sele 1
go bott
endif
sele 1
skip
enddo
CURSORARROW()
// OleSetProperty( hActiveWindow, "ViewableRange", "A1:D6" )
hSheet = oOwc:GetProp( "ActiveSheet" )
oWnd:oClient = oOwc
ACTIVATE WINDOW oWnd valid VERIFICA(HSHEET,xlispre,odlg)
RETURN NIL
quetal diego, aqui un ejemplo , de crear una xls
por bloques, usando la class TExcelScript():New('Victor') y
TClipBoard():New() aunque tambien se puede con ELE directo.
nRow := 2
nStart := nRow
cMemo := ""
dbselectArea( cArtics )
dbgotop()
do while !eof()
cMemo += field->codigo
cMemo += chr(9)+field->alterno
cMemo += chr(9)+field->unidad
cMemo += chr(9)+field->nombre
cMemo += CRLF
if len(cMemo) >= 20000 .or. eof()
oClip := TClipBoard():New()
oClip:Clear()
oClip:SetText( cMemo )
cCell := "A" + Alltrim( Str( nStart ) )
oRange := oExcel:oSheet:Range( cCell )
oRange:Select()
oExcel:oSheet:Paste()
oClip:End()
nStart := nRow
cMemo := ""
endif
sysrefresh()
dbselectArea(cArtics )
dbskip()
enddo
saludos.. Cesar C.C.
por bloques, usando la class TExcelScript():New('Victor') y
TClipBoard():New() aunque tambien se puede con ELE directo.
nRow := 2
nStart := nRow
cMemo := ""
dbselectArea( cArtics )
dbgotop()
do while !eof()
cMemo += field->codigo
cMemo += chr(9)+field->alterno
cMemo += chr(9)+field->unidad
cMemo += chr(9)+field->nombre
cMemo += CRLF
if len(cMemo) >= 20000 .or. eof()
oClip := TClipBoard():New()
oClip:Clear()
oClip:SetText( cMemo )
cCell := "A" + Alltrim( Str( nStart ) )
oRange := oExcel:oSheet:Range( cCell )
oRange:Select()
oExcel:oSheet:Paste()
oClip:End()
nStart := nRow
cMemo := ""
endif
sysrefresh()
dbselectArea(cArtics )
dbskip()
enddo
saludos.. Cesar C.C.
Cesar Cortes Cruz
SysCtrl Software
Mexico
' Sin +- FWH es mejor "
SysCtrl Software
Mexico
' Sin +- FWH es mejor "
- Antonio Linares
- Site Admin
- Posts: 42529
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 77 times
- Contact:
-
- Posts: 149
- Joined: Thu Jun 21, 2007 3:26 pm
disculpá mi ignorancia... ¿que es TOLEAuto? ¿hay algun ejemplito en SAMPLES de esto que me propones? con el excel.prg y excel2.prg arme lo que postié, y lento, pero camina... que es TOleAuto. ¿yo en que hice lo que subi? ¿el ejemplo que subio que decia TOle "Victor", o algo asi, es lo mismo que propones vos?
Gracias!!!
Gracias!!!
Antonio Linares wrote:Diego,
Es preferible usar la clase TOleAuto de Harbour/xHarbour cuando tienes que acceder a ese tipo de datos. El código es más simple.
- Antonio Linares
- Site Admin
- Posts: 42529
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 77 times
- Contact:
Diego,
Busca en estos foros por CreateObject ó por TOleAuto. Hay muchos ejemplos.
Aqui tienes un ejemplo de Enrico:
En cuanto a que es el TOleAuto, revisa esto:
http://en.wikipedia.org/wiki/OLE_Automation
Busca en estos foros por CreateObject ó por TOleAuto. Hay muchos ejemplos.
Aqui tienes un ejemplo de Enrico:
Code: Select all | Expand
FUNCTION MAIN()
LOCAL oExcel := CREATEOBJECT( "Excel.Application" )
LOCAL oSheet
oExcel:WorkBooks:Open( "E:\XHARBOUR\TEST.XLS" )
oSheet = oExcel:ActiveSheet
? oSheet:Cells( 1, 1 ):Value
? oSheet:Cells( 2, 1 ):Value
? oSheet:Cells( 3, 1 ):Value
? oSheet:Range( "A1" ):Value
oExcel:Quit()
RETURN NIL
En cuanto a que es el TOleAuto, revisa esto:
http://en.wikipedia.org/wiki/OLE_Automation
-
- Posts: 149
- Joined: Thu Jun 21, 2007 3:26 pm
disculpame, Antonio... busque y busque ademas "CreateObject" e "Include", pero siempre veo ejemplos donde lo unique que tienen en la cabecera es fivewin.ch.
Cuando copio lo que me mandaste me da el error de que no existe la funcion:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: Unresolved external '_HB_FUN_CREATEOBJECT' referenced from C:\FW192\SAROS
SX\F_EXCEL.OBJ
* There are errors
donde esta createobject???
¿para que me funcione lo que me pasaste, el ejemplito, que tengo que agregar??? despues yo investigo y lo saco. Gracias y disculpa... CHAU...!!!
Cuando copio lo que me mandaste me da el error de que no existe la funcion:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: Unresolved external '_HB_FUN_CREATEOBJECT' referenced from C:\FW192\SAROS
SX\F_EXCEL.OBJ
* There are errors
donde esta createobject???
¿para que me funcione lo que me pasaste, el ejemplito, que tengo que agregar??? despues yo investigo y lo saco. Gracias y disculpa... CHAU...!!!
Antonio Linares wrote:Diego,
Busca en estos foros por CreateObject ó por TOleAuto. Hay muchos ejemplos.
Aqui tienes un ejemplo de Enrico:Code: Select all | Expand
FUNCTION MAIN()
LOCAL oExcel := CREATEOBJECT( "Excel.Application" )
LOCAL oSheet
oExcel:WorkBooks:Open( "E:\XHARBOUR\TEST.XLS" )
oSheet = oExcel:ActiveSheet
? oSheet:Cells( 1, 1 ):Value
? oSheet:Cells( 2, 1 ):Value
? oSheet:Cells( 3, 1 ):Value
? oSheet:Range( "A1" ):Value
oExcel:Quit()
RETURN NIL
En cuanto a que es el TOleAuto, revisa esto:
http://en.wikipedia.org/wiki/OLE_Automation
- Antonio Linares
- Site Admin
- Posts: 42529
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 77 times
- Contact:
-
- Posts: 149
- Joined: Thu Jun 21, 2007 3:26 pm