Como evito que esta rutina me formate las celdas en Excel

611 views
Skip to first unread message

Alejandro Garcia G.

unread,
Aug 4, 2011, 5:43:16 PM8/4/11
to Comunidad de Visual Foxpro en Español
Utilizo esta funcion que encontre en algun lado, sirve para exportar
una tabla a Excel, el detalle es que al pasarme los datos numericos me
quedan como texto ya que me deja el punto decimal (.00) y no lo deseo
asi.

¿Se puede modificar, que puedo modificar?. Gracias.

********************************************************************
*!* FUNCTION Exp2Excel( [cCursor, [cFileSave, [cTitulo]]] )
*!*
*!* Exporta un Cursor de Visual FoxPro a Excel, utilizando la
*!* técnica de importación de datos externos en modo texto.
*!*
*!* PARAMETROS OPCIONALES:
*!* - cCursor Alias del cursor que se va a exportar.
*!* Si no se informa, utiliza el alias
*!* en que se encuentra.
*!*
*!* - cFileName Nombre del archivo que se va a grabar.
*!* Si no se informa, muestra el libro generado
*!* una vez concluída la exportación.
*!*
*!* - cTitulo Titulo del informe. Si se informa, este
*!* ocuparía la primera file de cada hoja del libro.
********************************************************************
Function Exp2Excel( cCursor, cFileSave, cTitulo )
Local cWarning
cWarning = "Exportar a EXCEL"
If Empty(cCursor)
cCursor = Alias()
Endif
If Type('cCursor') # 'C' Or !Used(cCursor)
Messagebox("Parámetros Inválidos",16,cWarning)
Return .F.
Endif
*********************************
*** Creación del Objeto Excel ***
*********************************
Wait Window 'Abriendo aplicación Excel.' Nowait Noclear
oExcel = Createobject("Excel.Application")
Wait Clear

If Type('oExcel') # 'O'
Messagebox("No se puede procesar el archivo porque no tiene la
aplicación" ;
+ Chr(13) + "Microsoft Excel instalada en su computador.",
16,cWarning)
Return .F.
Endif

oExcel.VISIBLE = .t.
oExcel.workbooks.Add

Local lnRecno, lnPos, lnPag, lnCuantos, lnRowTit, lnRowPos, i,
lnHojas, cDefault

cDefault = Addbs(Sys(5) + Sys(2003))

Select (cCursor)
lnRecno = Recno(cCursor)
Go Top

*************************************************
*** Verifica la cantidad de hojas necesarias ***
*** en el libro para la cantidad de datos ***
*************************************************
lnHojas = Round(Reccount(cCursor)/65000,0)
Do While oExcel.Sheets.Count < lnHojas
oExcel.Sheets.Add
Enddo

lnPos = 0
lnPag = 0

Do While lnPos < Reccount(cCursor)

lnPag = lnPag + 1 && Hoja que se está procesando

Wait Windows 'Exportando cursor ' + Upper(cCursor) + ' a Microsoft
Excel...' ;
+ Chr(13) + '(Hoja ' + Alltrim(Str(lnPag)) + ' de ' +
Alltrim(Str(lnHojas)) ;
+ ')' Noclear Nowait

If File(cDefault + cCursor + ".txt")
Delete File (cDefault + cCursor + ".txt")
Endif

Copy Next 65000 To (cDefault + cCursor + ".txt") Delimited With
Character ";"
lnPos = Recno(cCursor)

oExcel.Sheets(lnPag).Select

XLSheet = oExcel.ActiveSheet
XLSheet.Name = cCursor + '_' + Alltrim(Str(lnPag))

lnCuantos = Afields(aCampos,cCursor)

********************************************************
*** Coloca título del informe (si este es informado) ***
********************************************************
If !Empty(cTitulo)
XLSheet.Cells(1,1).Font.Name = "Arial"
XLSheet.Cells(1,1).Font.Size = 12
XLSheet.Cells(1,1).Font.BOLD = .T.
XLSheet.Cells(1,1).Value = cTitulo

XLSheet.Range(XLSheet.Cells(1,1),XLSheet.Cells(1,lnCuantos)).MergeCells
= .T.
XLSheet.Range(XLSheet.Cells(1,1),XLSheet.Cells(1,lnCuantos)).Merge

XLSheet.Range(XLSheet.Cells(1,1),XLSheet.Cells(1,lnCuantos)).HorizontalAlignment
= 3
lnRowPos = 3
Else
lnRowPos = 2
Endif

lnRowTit = lnRowPos - 1
**********************************
*** Coloca títulos de Columnas ***
**********************************
For i = 1 To lnCuantos
lcName = aCampos(i,1)
lcCampo = Alltrim(cCursor) + '.' + aCampos(i,1)
XLSheet.Cells(lnRowTit,i).Value=lcName
XLSheet.Cells(lnRowTit,i).Font.BOLD = .T.
XLSheet.Cells(lnRowTit,i).Interior.ColorIndex = 15
XLSheet.Cells(lnRowTit,i).Interior.Pattern = 1

XLSheet.Range(XLSheet.Cells(lnRowTit,i),XLSheet.Cells(lnRowTit,i)).BorderAround(7)
Next

XLSheet.Range(XLSheet.Cells(lnRowTit,
1),XLSheet.Cells(lnRowTit,lnCuantos)).HorizontalAlignment = 3

*************************
*** Cuerpo de la hoja ***
*************************
oConnection = XLSheet.QueryTables.Add("TEXT;" + cDefault +
cCursor + ".txt", ;
XLSheet.Range("A" + Alltrim(Str(lnRowPos))))

With oConnection
.Name = cCursor
.FieldNames = .T.
.RowNumbers = .F.
.FillAdjacentFormulas = .F.
.PreserveFormatting = .T.
.RefreshOnFileOpen = .F.
.RefreshStyle = 1 && xlInsertDeleteCells
.SavePassword = .F.
.SaveData = .T.
.AdjustColumnWidth = .T.
.RefreshPeriod = 0
.TextFilePromptOnRefresh = .F.
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = 1 && xlDelimited
.TextFileTextQualifier = 1 && xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = .F.
.TextFileTabDelimiter = .F.
.TextFileSemicolonDelimiter = .T.
.TextFileCommaDelimiter = .F.
.TextFileSpaceDelimiter = .F.
.TextFileTrailingMinusNumbers = .T.
.Refresh
Endwith

XLSheet.Range(XLSheet.Cells(lnRowTit,
1),XLSheet.Cells(XLSheet.Rows.Count,lnCuantos)).Font.Name = "Arial"
XLSheet.Range(XLSheet.Cells(lnRowTit,
1),XLSheet.Cells(XLSheet.Rows.Count,lnCuantos)).Font.Size = 8

XLSheet.Columns.AutoFit
XLSheet.Cells(lnRowPos,1).Select
oExcel.ActiveWindow.FreezePanes = .T.

Wait Clear

Enddo

oExcel.Sheets(1).Select
oExcel.Cells(lnRowPos,1).Select

If !Empty(cFileSave)
oExcel.DisplayAlerts = .F.
oExcel.ActiveWorkbook.SaveAs(cFileSave)
oExcel.Quit
Else
oExcel.Visible = .T.
Endif

*!* Go lnRecno

Release oExcel,XLSheet,oConnection

If File(cDefault + cCursor + ".txt")
Delete File (cDefault + cCursor + ".txt")
Endif

Return .T.

Endfunc

Oscar Calderon Fuentes

unread,
Aug 4, 2011, 6:43:27 PM8/4/11
to publice...@googlegroups.com
El cuerpo de esta rutina se basa en crear un archivo de texto delimitado que posteriormente se importa en Excel.
A mi nunca me ha dado problemas al respecto, pues esta rutina la postee yo mismo en portal fox. ¿puedes mandarme parte de la data para probar?
 
Saludos,

--
Oscar Calderón Fuentes
Santiago - Chile
 

Yvan GMail

unread,
Aug 4, 2011, 5:52:02 PM8/4/11
to publice...@googlegroups.com
Yo aplico este formato a la celda que quiero sea numérica
oExcel.Cells(NFILA,10).NumberFormat = "#,##0"
oExcel.Cells(NFILA,10).VALUE = 180


Yvan Carranza
285-7627

-----Mensaje original-----
De: publice...@googlegroups.com
[mailto:publice...@googlegroups.com] En nombre de Alejandro Garcia G.
Enviado el: jueves, 04 de agosto de 2011 16:43
Para: Comunidad de Visual Foxpro en Español
Asunto: [vfp] Como evito que esta rutina me formate las celdas en Excel

Oscar Calderon Fuentes

unread,
Aug 4, 2011, 7:19:13 PM8/4/11
to publice...@googlegroups.com
Yvan Gmail,
 
En este caso la exportación no se hace celda a celda, sino por importación de una data de texto delimitado.

Irlandes 1960

unread,
Aug 4, 2011, 8:04:52 PM8/4/11
to publice...@googlegroups.com
¿Por que tan complicado? ¿No alcanza con:
 
export to (planilla) type xl5

Despues la abris con el excel para darle lo que quieras agregar, tal como titulos, formatos de celdas, colores, formulas de totales, o cualquier cosa parecida.
o con el Opencalc si el excel no esta instalado.
Suerte

Oscar Calderon Fuentes

unread,
Aug 4, 2011, 8:06:50 PM8/4/11
to publice...@googlegroups.com
Nop, se trata de grandes cantidades de información y va generando las hojas necesarias para ello con un maximo de 65000 filas por hoja.

Oscar Calderon Fuentes

unread,
Aug 4, 2011, 8:13:45 PM8/4/11
to publice...@googlegroups.com
Alejandro,
 
Adjunto rutina mejorada. Pruébala y me cuentas.
 
Saludos,

El 4 de agosto de 2011 17:43, Alejandro Garcia G. <bitnet...@gmail.com> escribió:
program1.prg

Irlandes 1960

unread,
Aug 4, 2011, 8:22:40 PM8/4/11
to publice...@googlegroups.com
¿mas de 65000 filas de excel?
¿y el usuario sobrevive?

Oscar Calderon Fuentes

unread,
Aug 4, 2011, 8:29:13 PM8/4/11
to publice...@googlegroups.com
Sip, de hecho la tuve que crear por lo mismo. La base la tomé de una rutina similar, pero lo hacia celda a celda. Era demasiado demorosa. Asi que yo la hice por importación de texto delimitado, es bastante más rápida. No te quepa la menor duda que el usuario sobrevive.
 
Saludos,

El 4 de agosto de 2011 20:22, Irlandes 1960 <irland...@gmail.com> escribió:
¿mas de 65000 filas de excel?
¿y el usuario sobrevive?



Alejandro Garcia G.

unread,
Aug 5, 2011, 10:32:05 AM8/5/11
to Comunidad de Visual Foxpro en Español
Oscar, gracias por tus respuestas. No sabia que tu habias sido el
creador de la rutina, bajo informacion y a veces no se de donde la
bajo.

Te doy el credito, tu rutina me ha salvado en un monton de veces. Voy
a progar tu nueva version para ver si me sirve.

Que sucedio yo exportaba una tabla con valores, luego algunos usuarios
toman ese archivo y realizan varios calculos y cosa asi, sucede que
como se exportaba en formato texto las formulas no les daba, y como
los usuarios (de Excel de mi oficina) solo saben sumar y restar, no
saben dar formatos y quitar parte de informacion de una celda, pues
queria evitar que me estuvieran llamanda cada vez que hagan este
archivo.

Lo pruebo y luego les digo como me fue.

Gracias nuevamente Oscar, voy a colocar tu nombre y correo en la
rutina.

On 4 ago, 19:29, Oscar Calderon Fuentes <ocalder...@gmail.com> wrote:
> Sip, de hecho la tuve que crear por lo mismo. La base la tomé de una rutina
> similar, pero lo hacia celda a celda. Era demasiado demorosa. Asi que yo la
> hice por importación de texto delimitado, es bastante más rápida. No te
> quepa la menor duda que el usuario sobrevive.
>
> Saludos,
>
> El 4 de agosto de 2011 20:22, Irlandes 1960 <irlandes1...@gmail.com>escribió:
>
> > ¿mas de 65000 filas de excel?
> > ¿y el usuario sobrevive?
>
> --
> *Oscar Calderón Fuentes*
> *Santiago - Chile*

Oscar Calderon Fuentes

unread,
Aug 5, 2011, 10:43:05 AM8/5/11
to publice...@googlegroups.com
No hay de que.
 
Una de las cualidades principales de esta versión es identificar el dato numérico y formatear la celda a numero o moneda (currency en VFP) según sea el caso.
 
Saludos,

Alejandro Garcia G.

unread,
Aug 5, 2011, 10:51:22 AM8/5/11
to Comunidad de Visual Foxpro en Español
Oscar, disculpa la molestia, en esta nueva version tienes una
instruccion IS_RUN, ¿cual es esa instruccion?, me arroja un error
siempre y es que no pude instanciar la aplicacion (Excel).

¿Me podrias colaborar?, y disculpa nuevamente.

On 5 ago, 09:43, Oscar Calderon Fuentes <ocalder...@gmail.com> wrote:
> No hay de que.
>
> Una de las cualidades principales de esta versión es identificar el dato
> numérico y formatear la celda a numero o moneda (currency en VFP) según sea
> el caso.
>
> Saludos,
>
> El 5 de agosto de 2011 10:32, Alejandro Garcia G.
> <bitnetsoft...@gmail.com>escribió:

Oscar Calderon Fuentes

unread,
Aug 5, 2011, 1:17:28 PM8/5/11
to publice...@googlegroups.com
Disculpa, aqui va.
Funcion Is_Run.prg

Antonio Estrada

unread,
Oct 15, 2012, 12:47:08 AM10/15/12
to publice...@googlegroups.com
EstimadoOscar:
 
Ante todo felicitarte por tu excelente aporte, recientemente encontré tu función y la he venido usando donde se requiera.
 
Trabajo en una universidad en Lima-Perú donde aún empleamos aplicaciones en VFox 6.0, una versión bastante vieja lo sé, pero sin embargo tu rutina ha podido trabajar bastante bien.
 
Sin embargo sólo se me ha presentado un inconveniente y es que algunas cadenas con caracteres con tildes, diéresis, eñes u otros ascii's suben distorsionados al Excel.
 
Quisiera que me dijeras si sabías que esto podía suceder, o sino que podría estar haciendo mal para poder superar este problema. Te envío un archivo txt con un par de carreras cuyos nombres llegan mal al Excel.
 
Agradezco el tiempo que te tomes para responder a mi pregunta y nuevamente te felicito por tu trabajo.
 
Antonio Estrada
CUR_TEMPO.txt

Carton Jeston (9.0.0.7423)

unread,
Jan 22, 2016, 5:50:24 AM1/22/16
to Comunidad de Visual Foxpro en Español
Mira que el tema es viejo, pero por aquí estaba el autor.

He encontrado un problema con cadenas de caracteres que tienen numero, se come los ceros a la izquierda del mismo. Por ejemplo:

001    -> 1  seria un código de articulo
03001 -> 3001 seria un código postal

He intentado con mascaras .numberformat="@" intentar que no cambiara, pero como bien dices, debería modificarse antes de volcar.

¿alguna idea?

de momento he vuelto al *COPY TO xxx.xls  TYPE XLS hasta que encuentre el fallo o hacer un hibrido que use este metodo.

Fidel Charny

unread,
Jan 22, 2016, 10:47:59 AM1/22/16
to Comunidad de Visual Foxpro en Español
* Suponiendo que loSheet es la referencia al objeto Sheet, te copio la parte de la rutina que hace eso.
* Lo de "lnMinLen_ " se puede obviar.
lnMinLen_
= 2
WITH loSheet
    DO CASE
        CASE VARTYPE
(m.lx_FieldValue)="C"
            DO CASE
                CASE fonlydigit
(m.lx_FieldValue)==TRIM(m.lx_FieldValue) ;
                    AND LEN
(m.lx_FieldValue)> lnMinLen_
                   
.NumberFormat = "@"
                   
.Value=m.lx_FieldValue

            ENDCASE

    ENDCASE
ENDWITH

* Donde FonlyDigit() es:
PROCEDURE
FonlyDigit(tcString)
***********************************
** Luis María Guayan
** Devuelve únicamente los números que contiene una cadena
return CHRTRAN(tcString,CHRTRAN(tcString,"1234567890",""),"")
ENDPROC

Luis Maria Guayan

unread,
Jan 22, 2016, 10:58:11 AM1/22/16
to publice...@googlegroups.com
Agregales el caracter ' al inicio

001    ->  '001
03001 -> '03001

Luis María Guayán
Tucumán, Argentina
_______________________________
Comunidad Visual FoxPro en Español
http://comunidadvfp.blogspot.com

El 22/01/16 a las 07:50, Carton Jeston (9.0.0.7423) escribió:

Carton Jeston (9.0.0.7423)

unread,
Jan 22, 2016, 12:08:46 PM1/22/16
to Comunidad de Visual Foxpro en Español
Gracias a los dos, he probado y sigo igual porque que yo sepa, hay variantes de la misma función. Si os parece bien, nos centramos en la original que esta en el blog que presenta el mismo problema y no tiene añadidos posteriores.

http://comunidadvfp.blogspot.com/search/?q=exp2excel

Fidel, yo tengo también un control con vartype, pero quizás no este en el lugar apropiado. ¿donde se pondría en la rutina original?

Luis María, si te entendí bien, pongo el apostrofe delante del campo antes de pasarlo a excel y me sale tal cual con apostrofe y todo. Si ese es el método, no se debería ocupar ese carácter porque si un campo tiene 5 caracteres y usas los 5+apostrofe, no seria factible.

Aunque probablemente lo he entendido al revés... necesito vacaciones del foxpro :-)

Fidel Charny

unread,
Jan 22, 2016, 3:02:13 PM1/22/16
to Comunidad de Visual Foxpro en Español
Hacé esta prueba y después lo acomodás:

loExcel = NEWOBJECT("Excel.application")
loExcel.Workbooks.Add
loSheet = loExcel.ActiveSheet
loSheet.Cells(1,1).NumberFormat="@"
loSheet.Cells(1,1).Value = "00364215"
loExcel.Visible = .t.
loSheet.Cells(2,1).Value= "00364215"
loSheet.Cells(3,1).Value = SPACE(1)+"00364215"

Miguel Canchas

unread,
Jan 22, 2016, 3:17:42 PM1/22/16
to publice...@googlegroups.com

Lo que tienes que hacer es formatear la columna según quieras..

Por el ejemplo quiero formatearlo para texto :

 

    oExcel.Application.Columns("R:R").Select

oExcel.Application.Selection.NumberFormat = "@"

 

MK

Reply all
Reply to author
Forward
0 new messages