leer archivo Excel

1,443 views
Skip to first unread message

Arnaldo Toledano

unread,
Jul 6, 2010, 12:42:42 PM7/6/10
to publice...@googlegroups.com
Recurro a Ustedes con una actitud de "vago", pero bueno, por alli la idea del grupo es ayudarnos.

Tengo que tomar los precios de un archivo Excel y pasarlo a mi sistema para actualizar los precios.
Todo seria facil, si los archivos excel fueran todos iguales.
Pero resulta que son de distintos proveedores y por ende son distintas las configuraciones
Algunos archivos tienen el codigo del articulo en la celda  A7, el precio en la G7, etc.

Seguro que existe, pero yo lo desconozco, la manera de acceder a una celda determinada y a partir de alli correrme hacia abajo en el archivo excel.
Les agradeceria si alguien tiene alguna idea de como hacerlo.


Arnaldo

Walter R. Ojeda Valiente

unread,
Jul 6, 2010, 1:00:11 PM7/6/10
to publice...@googlegroups.com
Hola Arnaldo

Para acceder a una planilla Excel puedes utilizar un código similar al siguiente:

  NombrePlanilla = "MIPLANILLA.XLS"

  RutinaError = On("ERROR")
 
  NumError = 0
 
  on Error NumError = Error()
 
  oExcel = GetObject(NombrePlanilla)
 
  on Error &RutinaError
 
  if NumError == 0     && Si se pudo abrir EXCEL
    with oExcel.Application
      .Visible  = .F.
      .Application.WorkBooks.Open(NombrePlanilla)
      .Cells(5, 2).Value = 21     && Para poner un valor en una celda, en este caso la fila 5 y la columna B
      Valor = .Cells(7, 3)          && Para obtener el valor de una celda, en este caso la fila 7 y la columna C
    endwith
    Release oExcel
  else
    =MessageBox("No se pudo abrir EXCEL")
  endif


Si tienes varios modelos de planillas distintas, deberías identificarlas de alguna forma (quizás por el nombre, las que empiezan con "A-" son de un proveedor, las que empiezan con "B-" son de otro proveedor, etc.) y luego utilizar CASE...ENDCASE.

Saludos.

Walter.

Hotmail: Trusted email with powerful SPAM protection. Sign up now.

Arnaldo Toledano

unread,
Jul 6, 2010, 1:11:22 PM7/6/10
to publice...@googlegroups.com
Gracias Walter.
Veo que es interesante y no muy dificil.
La idea es que el usuario coloque la celda inicial del codigo y del precio.
A partir de alli al incremetar la variable, estaria todo OK.
Incluso para llegar al final seria cuestion de analizar si la celda esta vacia, es porque se termino.
Lo vamos a poner en practica.

Gracias nuevamente Walter

Arnaldo

Luis Maria Guayan

unread,
Jul 6, 2010, 2:25:57 PM7/6/10
to publice...@googlegroups.com
-- Recorrer una planilla Excel desde VFP --
http://www.portalfox.com/article.php?sid=516


Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

 

miguel perez

unread,
Jul 6, 2010, 3:44:11 PM7/6/10
to Comunidad de Visual Foxpro en Español
Siguiendo con este tema, es posible leer una planilla y ponerla los
datos en un cursor?
Como seria?

MPerez M.


On 6 jul, 14:25, Luis Maria Guayan <luisma...@portalfox.com> wrote:
> -- Recorrer una planilla Excel desde VFP --http://www.portalfox.com/article.php?sid=516
>
> Luis María Guayán
> Tucumán, Argentina
> _________________________http://www.PortalFox.com

Walter R. Ojeda Valiente

unread,
Jul 6, 2010, 4:53:07 PM7/6/10
to publice...@googlegroups.com
Hola Miguel

Claro que sí puedes hacerlo. Una vez que obtienes el valor de una celda de tu planilla Excel puedes hacer con ese valor lo que desees.

Yo utilizo esta técnica para integrar mis sistemas con sistemas ajenos. Les pido a los otros programadores que generen una planilla Excel con los datos que necesito, capturo esos datos y los grabo en mis tablas.

Para que sea visualmente más atractivo y más práctico, los valores obtenidos de la planilla Excel los muestro en una grilla. Es agradable a la vista ver como rapidamente van pasando los registros y eso les gusta a los usuarios.

Saludos.

Walter.



Siguiendo con este tema, es posible leer una planilla y ponerla los
datos en un cursor?
Como seria?

MPerez M.




Hotmail: Free, trusted and rich email service. Get it now.

miguel perez

unread,
Jul 6, 2010, 5:44:32 PM7/6/10
to Comunidad de Visual Foxpro en Español
Si Walter, esa es la idea, pero como seria eso?

MPerez M.
> _________________________________________________________________
> Hotmail: Trusted email with powerful SPAM protection.https://signup.live.com/signup.aspx?id=60969

Walter R. Ojeda Valiente

unread,
Jul 7, 2010, 12:01:00 AM7/7/10
to publice...@googlegroups.com
Hola Miguel

Para colocar en una tabla el contenido de una planilla Excel podrías utilizar un código similar al siguiente:


select VENTAS

DELETE FOR VEN_SISTEM == 1 && Borra todos los registros generados anteriormente a partir de una planilla Excel
&& Las ventas cargadas manualmente tendrán VEN_SISTEM = 0

Fila = 2 && Primera fila que tiene datos, la fila Nº 1 tiene los nombres de las columnas, así que no será procesada


with oExcel.Application
.Visible = .F.
.Application.WorkBooks.Open(NombrePlanilla)
  M.VEN_FECHAX = .Cells(Fila, 1)     && En la primera columna (A) se encuentra la fecha de la venta
do while VarType(M.VEN_FECHAX) <> "U" && Condición para saber donde terminan los datos, se podrían agregar más condiciones
M.VEN_NRODOC = .Cells(Fila, 2) && En la segunda columna (B) se encuentra el número del documento de venta
M.VEN_MONTOX = .Cells(Fila, 3) && En la tercera columna (C) se encuentra el importe total de la venta
M.VEN_SISTEM = 1 && Indica que este registro proviene de una planilla Excel
append blank && Se agrega un registro en blanco a la tabla de ventas
gather memvar && Se graban los campos en el registro
ThisForm.Grid1.Refresh() && Se refresca la grilla, para que se vea el registro recién agregado
Fila = Fila + 1 && Se procesará la siguiente fila
M.VEN_FECHAX = .Cells(Fila, 1) && En la primera columna se encuentra la fecha de la venta
enddo
endwith

Fíjate que el campo VEN_SISTEM es necesario para evitar que un usuario procese 2 veces la misma planilla y así duplique las ventas. También podrías
borrar las ventas que ocurrieron en un rango de fechas, algo como:

DELETE FOR VEN_SISTEM == 1 .and. DtoS(VEN_FECHAX) >= FechaIni .and. DtoS(VEN_FECHAX) <= FechaFin && Borrará las ventas entre esas fechas, inclusive

Desde luego que este código puede ser mejorado pero la idea básica es esa.

Saludos.

Walter.



Hotmail: Powerful Free email with security by Microsoft. Get it now.
Reply all
Reply to author
Forward
0 new messages