Automatizar Excel para exportar planilla como texto delimitado con pipe (ascci 124)

246 views
Skip to first unread message

mapner

unread,
Mar 22, 2016, 1:18:41 PM3/22/16
to Comunidad de Visual Foxpro en Español
Hola, 

Tengo la siguiente función que uso para importar Excels con gran cantidad de filas, o sea por medio de automatización la grabo como CSV y luego desde VFP hago APPEND FROM (cTempFile) DELIMITED WITH CHARACTER ","

El tema es que a veces se hace lío con los regionales (separadores decimales y etc) por lo que querría que desde Excel se grabara como archivo de texto separado por pipe "|" (ascii 124) y luego hacer APPEND FROM (cTempFile) DELIMITED WITH CHARACTER "|"

Alguien tiene alguna idea de como automatizar esa exportación en Excel?

gracias

Saludos!

**********
* ImpXLS_CSV importa excel en un cursor
PROCEDURE ImpXLS_CSV
LPARAMETERS cFileImport, calias
LOCAL loExcel, cTempFile

cTempFile = GETENV("TEMP")+'\'+SYS(2015)+'.csv'

nsel = SELECT()
CREATE CURSOR (calias) (a c(100) NULL)
FOR ix=2 TO 26
cf = CHR(64+ix)
ALTER TABLE (calias) ADD COLUMN &cf c(100) NULL
ENDFOR

loExcel = CREATEOBJECT("Excel.Application")

WITH loExcel.APPLICATION

lok = .T.
.VISIBLE = .F.
TRY
.workbooks.OPEN(cFileImport)
CATCH TO oerr
cmsg = oerr.MESSAGE
lok = .F.
ENDTRY
IF !lok
MESSAGEBOX('No se puede abir el archivo, verifique que no está abierto '+CHR(13)+cmsg,64,'Atención')
RETURN .F.
ENDIF
.workbooks.OPEN(cFileImport)
.activeworkbook.SAVEAS(cTempFile, 6, .F.)
SELECT (calias)
APPEND FROM (cTempFile) DELIMITED WITH CHARACTER ","
GO TOP
.displayalerts = .F.
.workbooks.CLOSE()
ENDWITH
IF FILE(cTempFile)
DELETE FILE(cTempFile)
ENDIF

SELECT (nsel)

ENDPROC

francisco prieto

unread,
Mar 22, 2016, 2:16:42 PM3/22/16
to Comunidad de Visual Foxpro en Español
Mauricio,

Hay una forma muy trucha de hacer eso, pero no se si te va a servir.

http://www.ehowenespanol.com/guardar-hoja-calculo-excel-delimitada-pipes-como_23779/

Saludos,

Pancho
Cordoba
Argentina

francisco prieto

unread,
Mar 22, 2016, 2:29:11 PM3/22/16
to Comunidad de Visual Foxpro en Español
Fijate que la macro esta hecha en excel, pero podrias codificarla desde VFP y ejecutarla desde tu programa.

La ventaja es que no tenes que tocar el Panel de Control
La desventaja es que tenes que traducir la macro a VFP

Saludos,

Pancho
Córdoba
Argentina
Message has been deleted

Jean Pierre Adonis De La Cruz Garcia

unread,
Mar 22, 2016, 5:12:25 PM3/22/16
to Comunidad de Visual Foxpro en Español
Lo que trato de entender es que deseas pasar datos de tu Excel a VFP directo, o me equivoco, si es asi me lo haces saber y te doy una solucion mas practica con menos lineas

mapner

unread,
Mar 22, 2016, 6:06:03 PM3/22/16
to Comunidad de Visual Foxpro en Español
Adonis,

En la universidad lo llaman interpretación de enunciados... :)

Te lo resumo en una frase "mediante automatización de Excel con VFP pasar una planilla a un archivo de texto con separador pipe (ascii 124), similar a un CSV"
 
Saludos


PD:

ya lo hice

**********
* XExpXLS exporta excel en un archivo de texto con separador pipe (ascii 124)
PROCEDURE XExpXLS
LPARAMETERS cFileImport, cFileExport, cCh
LOCAL loExcel, lok, lnCol, lnFil, lni, lnJ, cCol, uval, oDlgTh, nMin, cCB
IF EMPTY(cCh)
cCh = '|'
ENDIF 
loExcel = CREATEOBJECT("Excel.Application")

WITH loExcel.APPLICATION

lok = .T.
.VISIBLE = .F.
TRY
.workbooks.OPEN(cFileImport)
CATCH TO oerr
cmsg = oerr.MESSAGE
lok = .F.
ENDTRY
IF !lok
MESSAGEBOX('No se puede abir el archivo, verifique que no está abierto '+CHR(13)+cmsg,64,'Atención')
RETURN .F.
ENDIF
.workbooks.OPEN(cFileImport)
lnCol = .activesheet.UsedRange.COLUMNS.COUNT
lnFil = .activesheet.UsedRange.ROWS.COUNT

FOR lnJ = 1 TO lnFil
nMin = MIN(lnCol,26)
cLinea = ''
FOR lni = 1 TO nMin
* oDlgTh.UPDATE(INT(lnJ/lnFil*100),"Leyendo filas "+ALLTRIM(STR(lnJ))+'/'+ALLTRIM(STR(lnFil))+"-"+ALLTRIM(STR(lni))+'/'+ALLTRIM(STR(nMin)))
cCol = CHR(lni+64)
lLoop = .F.
TRY
uval = .activesheet.cells(lnJ,lni).VALUE
*IF EMPTY(uval)
* lLoop = .T.
*ENDIF
CATCH
uval = NULL
ENDTRY
IF lLoop
LOOP
ENDIF
cLinea = cLinea+TRANSFORM(NVL(uval,''))+cCh
ENDFOR
cLinea = LEFT(cLinea,LEN(cLinea)-1)+IIF(lnJ < lnFil,CHR(13)+CHR(10),'')
SET SAFETY OFF 
STRTOFILE(cLinea,cFileExport,lnJ>1)
SET SAFETY ON 
ENDFOR
.workbooks.CLOSE
ENDWITH

ENDPROC


Esteban H

unread,
Mar 22, 2016, 8:18:51 PM3/22/16
to publice...@googlegroups.com

Q grande Mauricio!!!

 

Muy bien…

 

Saludos.

 

Esteban.

Jean Pierre Adonis De La Cruz Garcia

unread,
Mar 23, 2016, 11:19:24 AM3/23/16
to Comunidad de Visual Foxpro en Español
Bueno, te lo decia, por que mencionastes primero pasar a TXT y despues VFP; son 2 pasos que debes hacer y solo se simplificaria en uno solo y menos lineas
te doy el ejemplo de pasar directo de Excel a VFP
************
cFileXLS = Getfile("XLS")
MsExcel = Createobject("Excel.Application")
MsExcel.visible=.T.

If Type("MsExcel") = "O" Then
  MsExcel.Workbooks.Open(cFileXLS)
  WkpGxtab = MsExcel.Worksheets(3) && en esta hoja que es la primera del libro es donde supuestamente están los registros o bien puede ir el nombre de la hora ejemplo: WkpGxtab = MsExcel.Worksheets("Clientes")
  For i = 9 To 2000 + 1 && Número de registros del archivo de Excel
      IF nvl(WkpGxtab.Cells(i+1,6).value,DATE()) = DATE() THEN 
      MESSAGEBOX("Termino")
EXIT
      ENDIF
      Insert into validar (fec, tdoc, ser1, num1, rucc, valgs,igvs, tots) Values (TTOD(WkpGxtab.Cells(i+1,6).value), allt(STR(WkpGxtab.Cells(i+1,8).value)), allt(STR(WkpGxtab.Cells(i+1,9).value)), allt(STR(WkpGxtab.Cells(i+1,11).value)), +;
      TRANSFORM(WkpGxtab.Cells(i+1,14).value,'99999999999'), +;
      WkpGxtab.Cells(i+1,16).value, WkpGxtab.Cells(i+1,17).value, WkpGxtab.Cells(i+1,25).value )
  ENDFOR
ENDIF

************

mapner

unread,
Mar 23, 2016, 12:33:17 PM3/23/16
to Comunidad de Visual Foxpro en Español
Adonis,

El procedimiento que muestras no es genérico, es adaptado al caso particular de una tabla determinada, o sea, no es práctico dado que si tienes que hacer varias de estas conversiones, tendrás que repetir toda tu rutina por cada caso. La solución que terminé planteando devuelve un cursor con campos A,B,C,D,... similar a como lo hace el comando de VFP - IMPORT FROM ... XLS
Buena la intención.

Saludos

Jean Pierre Adonis De La Cruz Garcia

unread,
Mar 23, 2016, 1:22:11 PM3/23/16
to Comunidad de Visual Foxpro en Español
Que bueno, si es que lo entiendes de esa manera esta bien, excelente
Feliz Miercoles Santo.
Reply all
Reply to author
Forward
0 new messages