Excel in csv

257 views
Skip to first unread message

Gaetano Quattrocchi

unread,
Oct 20, 2018, 12:08:05 PM10/20/18
to Comunidad de Visual Foxpro en Español
buenos días a todos, alguien tiene una función para convertir un archivo excel a csv con un separador ; ?
muchas gracias

Este método me pone la coma "," como separador.


oExcel = CREATEOBJECT("Excel.Application")
oWorkBook=oExcel.Workbooks.Open("P:\InventoryFeed\inventory.xls")
#DEFINE xlCSV 6
oWorkbook.SaveAs("P:\InventoryFeed\inventory.csv",xlCSV)
oWorkbook.Close()
oExcel.Quit()

RELEASE oWorkbook
RELEASE oExcel
RETURN

Martín E. Lezama

unread,
Oct 20, 2018, 9:06:12 PM10/20/18
to publice...@googlegroups.com
Siempre tuve problemas con esa función. Por eso simplemente lo que hago es trabajar con un archivo a bajo nivel.

FCREATE() para crear el archivo CSV, y después te ponés a trabajar en la cadena. Hace rato que ya no estoy programando en Visual FoxPro, pero te paso el espíritu de los comandos para rumbearte un poco.

lnManejador = FCREATE("F:\micsv.csv")
lcCadena = ""

SELECT (mitablaamigrar)
GO TOP

SCAN

lcCadena = lcCadena + campo1 + ";" + campo2 + ";" + campo3 + ";" + campo4
FPUTS(lcCadena,lnManejador)
lcCadena = ""

ENDSCAN

FCLOSE(lnManejador)

O sea, no recuerdo bien las opciones. Si mal no recuerdo, FCREATE() creaba el archivo y te devolvía el número de manejador. Y FPUTS() te escribía la cadena en el archivo correspondiente al manejador agregando un retorno de carro. Seguramente vas a necesitar una función adicional que te convierta todo a tipo character, o sea... si tengo fechas, que haga la conversión DTOC() de la fecha, si tengo lógicos que devuelva la cadena "Verdadero" o "Falso" según corresponda, si es entero que devuelva un ALLTRIM(STR(TuNumeroAConvertir)), etcétera etcétera. Por algún lado tengo esas funciones, si no te alcanza esta explicación después rebusco en mi código fuente de Visual FoxPro y te los paso.

Antes de entrar en el bloque SCAN / ENDSCAN, yo obtenía la estructura de la tabla en un array, poniendo esa primera línea en la opción de títulos. También hay modos de recuperar el comentario de los campos, entonces, si vos al crear los DBF en un DBC le ponías un buen título en los comentarios, eso lo podés utilizar para tu primera fila de títulos en el CSV.

Abrazo, espero que te sea útil esta pequeña pisteada.

Gaetano Quattrocchi

unread,
Oct 21, 2018, 10:32:51 AM10/21/18
to Comunidad de Visual Foxpro en Español
No tengo una tabla dbf, sino un archivo excel xls para convertir en csv con;

Ricardo Pina

unread,
Oct 21, 2018, 11:09:06 AM10/21/18
to Grupo VFP
Gaetano 
El separador que utiliza Excel depende de la configuración regional de Win.
Siguiendo la idea de Martín reemplazaría el separador en el archivo csv generado.

Saludos

El dom., 21 oct. 2018 a las 11:32, Gaetano Quattrocchi (<qgaet...@gmail.com>) escribió:
No tengo una tabla dbf, sino un archivo excel xls para convertir en csv con;


--
            

                   Ricardo Pina

Desarrollo y Servicios Informáticos

                  Profesionales
               www.dsip.com.ar

 

 

Gaetano Quattrocchi

unread,
Oct 21, 2018, 11:23:14 AM10/21/18
to Comunidad de Visual Foxpro en Español
Probé el mismo código en forma de vb.net, y el separador y el;

Martín E. Lezama

unread,
Oct 21, 2018, 6:39:59 PM10/21/18
to publice...@googlegroups.com
No, ahí me mataste.

Carlos Miguel FARIAS

unread,
Oct 22, 2018, 6:40:33 AM10/22/18
to publice...@googlegroups.com
Por que no lo haces directamente desde excel?
O es una funcionalidad del sistema?

Gaetano Quattrocchi

unread,
Oct 22, 2018, 4:03:12 PM10/22/18
to Comunidad de Visual Foxpro en Español

es una funcionalidad del sistema , visual FoxPro
9

Carlos Miguel FARIAS

unread,
Oct 22, 2018, 4:20:31 PM10/22/18
to publice...@googlegroups.com
VFP no maneja xlsx, por lo que debes ejecutar por automation.
Lo que puedes leer la hoja de excel hacia un cursor y luego desde VFP exportar a csv con el separador que te guste.

Martín E. Lezama

unread,
Oct 22, 2018, 4:24:41 PM10/22/18
to publice...@googlegroups.com
Exactamente. Y ahí es donde entra lo que le sugerí yo, que es crear el CSV como archivo de bajo nivel.

Martín E. Lezama

unread,
Oct 22, 2018, 4:29:36 PM10/22/18
to publice...@googlegroups.com
Igualmente, estaría bueno que Gaetano describa un poco la idea de agregar esta migración de Excel a CSV. O sea, ¿cuál sería la idea de utilización para un operador de su sistema, por ejemplo? O ¿en qué casos precisaría que un robot directamente vaya a buscar en cierta carpeta un archivo XLS o XLSX y lo tenga que convertir a CSV? Porque así en el aire, se hace más difícil darle una mano.

Por ejemplo, una cosa es que me digas "tengo una carpeta en la cual tengo un timer a la escucha porque.. no sé, el SAP me tira archivos ahí en Excel y los tengo que pasar a CSV para manejarlos", a que me digas "tengo un USUARIO que necesita abrir un Excel desde mi programa, en donde tengo un listado de inventario de SAP que tengo que almacenar en mi sistema" (esto segundo lo tuve que hacer, puntualmente, en Visual FoxPro). Una cosa es un proceso automático, en donde no hay necesidad de operador y en donde estamos más restringidos, y la segunda cosa es un proceso con intervención de usuario en donde se puede jugar más.

Gaetano Quattrocchi

unread,
Oct 23, 2018, 10:09:20 AM10/23/18
to Comunidad de Visual Foxpro en Español
Gracias a todos los intereses de x, el problema es el siguiente: desde foxpro con un temporizador, cada 1 comprueba la presencia de un archivo xls y lo convierte a csv con; para hacer que funcione un procedimiento antiguo, para hacer este uso automatice excel con esta función, pero el separador no es el;

Ricardo Pina

unread,
Oct 23, 2018, 10:38:11 AM10/23/18
to Grupo VFP
Hola Gaetano.

Prueba con las demás variantes de formatos csv soportados.


Saludos

Martín E. Lezama

unread,
Oct 23, 2018, 10:38:48 AM10/23/18
to publice...@googlegroups.com
Bueno, pero ahí sí podrías hacerlo con una función a bajo nivel, Gaetano. OJO, estoy comprendiendo que tenés un archivo XLS, no un archivo XLSX. Hay diferencias entre uno y otro. Un XLS puede ser abierto mediante Visual FoxPro, un XLSX no.

O sea, abro el archivo Excel con una función de automatización, lo leo y bajo su contenido a un cursor. Y a ese cursor lo voy leyendo y lo convierto en un archivo .CSV a bajo nivel. ¿Por qué opté por esta opción yo, particularmente? Porque en Visual FoxPro tenés obviamente maneras de abrir y copiar un archivo XLS. El FoxPro lo lee, y podés hacer simplemente "COPY TO F:\miarchivocsv.csv DELIMITED WITH ;".

Ahora bien, yo no sé en Visual FoxPro 8 o 9, pero sé a fe cierta que en Visual FoxPro 6 o 7 esta modalidad de abrir archivos Excel y copiarlas no andaba bien. Simplemente, PERDÍA FILAS. Por qué lo hace, ignoro, ignoro si es porque no puede manejar muchas filas, o bien porque pierde las filas que tengan columnas  en blanco, o cuál fue efectivamente el motivo.

Yo en tu lugar investigaría bien CÓMO puedo recorrer el oExcel que tenés abierto, para recorrerlo y bajar fila por fila a un archivo de bajo nivel. Es el modo que me resultó más confiable para exportar a CSV.


Gaetano Quattrocchi

unread,
Oct 23, 2018, 11:33:56 AM10/23/18
to Comunidad de Visual Foxpro en Español
Ya lo intenté, no vaya ... usando el 24 con vb.net funciona el; como separador, en foxpro no

Gaetano Quattrocchi

unread,
Oct 23, 2018, 11:37:22 AM10/23/18
to Comunidad de Visual Foxpro en Español
gracias Martin, esperaba que hubiera una forma más sencilla, entre otras cosas utilizo la automatización de excel

Foxero

unread,
Nov 4, 2018, 10:54:41 PM11/4/18
to Comunidad de Visual Foxpro en Español
Hola
Se me ocurre que lo hagas en 2 pasos:

1. convierte tu archivo de excel a csv con el codigo que utilizas
2. una vez creado el csv separado con ","  lo abres en bajo nivel, buscas las comas y las sustituyes con ";"

Asi lo haria yo.
Saludos
David

Gaetano Quattrocchi

unread,
Nov 5, 2018, 7:48:54 AM11/5/18
to Comunidad de Visual Foxpro en Español
El problema de que hay campos de moneda donde hay, escribe 1,25

Foxero

unread,
Nov 5, 2018, 2:16:16 PM11/5/18
to Comunidad de Visual Foxpro en Español
Hola

Creo que entonces lo que tienes que hacer es modificar el formato de las columnas con campo moneda (o cualquier otra con ",")
Y ya con las columnas de moneda convertidas a numero sin separación de comas, lo guardas como csv.

Saludos
David



oExcel = CREATEOBJECT("Excel.
Application")
oWorkBook=oExcel.Workbooks.Open("P:\InventoryFeed\inventory.xls")

<--------Aqui inserta el código para modificar el formato de las columnas que sean moneda---->

#DEFINE xlCSV 6
oWorkbook.SaveAs("P:\InventoryFeed\inventory.csv",xlCSV)
oWorkbook.Close()
oExcel.Quit()

Gaetano Quattrocchi

unread,
Nov 5, 2018, 2:37:56 PM11/5/18
to Comunidad de Visual Foxpro en Español
Grazias foxero
Reply all
Reply to author
Forward
0 new messages