9 de julio de 2015

Importar datos de Excel en tablas VFP

Anteriormente baje una rutina para mostrar el contenido de las celdas en excel. Modifique un poco el codigo de tal forma que teniendo una Hoja Excel donde la primera linea contiene los nombre de los campos de una tabla VFP y las siguientes los datos a importar.

La rutina modificada, lee el nombre de campo en la primera fila Y lo compara con la de la tabla existente PARA poder saber que tipo de datos es el esperado realizando las transformaciones requeridas.

(No recuerdo que publico el codigo original, asi es que disculpas al autor original)

**** Importar Masivo desde Excel
* Poner en Primera Fila los Nombres de Campo, los que se 
* chequearan que coincidan en la tabla
* Modificado por Ludwig Corales M.
* 28/08/2009
CLEAR
xArchivo="C:\temp\santa_maría.xls"
xTabla="Planos"  &&Tabla destino
IF USED("&xTabla")  &&Verifica que no este en uso la tabla
  SELECT("&xTabla")
  USE
ENDIF
USE &xTabla IN 0

*-- Creo el objeto Excel
loExcel = CREATEOBJECT("Excel.Application")
WITH loExcel.APPLICATION
  .VISIBLE = .F.
  *-- Abro la planilla con datos
  .Workbooks.OPEN("&xArchivo")
  *-- Cantidad de columnas
  lnCol = .ActiveSheet.UsedRange.COLUMNS.COUNT
  *-- Cantidad de filas
  * Se resta la Fila 1 donde estan los campos
  lnFil = .ActiveSheet.UsedRange.ROWS.COUNT-1
  *-- Recorro todas las celdas
  ** el Recorrido es columnas y luego filas
  FOR lnJ = 2 TO lnFil
    SELECT("&xTabla")
    APPEND BLANK   && se inserta el nuevo registro
    FOR lnI = 1 TO lnCol
      xCampo=.activesheet.cells(1,lnI).VALUE  && Nombre del campo destino
      xTipoCampo=TYPE(xCampo)  && se obtiene de la tabla el tipo de campo
      xValor=.activesheet.cells(lnJ,lnI).VALUE  && Recupera el valor de la Celda en Excel
      *? xcampo+": "  && Muestra el nombre de campo
      *?? xValor         && Muestra el valor
      DO CASE
        CASE xTipoCampo="D"  && si el campo es de fecha
          IF ISNULL(xValor)  &&Es fecha en blanco o nulo
            REPLACE &xCampo WITH CTOD("  /  /  ") IN &xTabla
          ELSE
            REPLACE &xCampo WITH TTOD(xValor) IN &xTabla
          ENDIF
        CASE xTipoCampo="C"
          IF VARTYPE(xValor)="N"  && por si en excel el valor no es TEXT
            REPLACE &xCampo WITH ALLTRIM(UPPER(STR(xValor))) IN &xTabla
          ELSE
            REPLACE &xCampo WITH xValor IN &xTabla
          ENDIF
        CASE xTipoCampo="N"
          IF ISNULL(xValor)
            REPLACE &xCampo WITH 0 IN &xTabla
          ELSE
            REPLACE &xCampo WITH xValor IN &xTabla
          ENDIF

      ENDCASE
    ENDFOR
  ENDFOR
  *-- Cierro la planilla
  .Workbooks.CLOSE
  *-- Salgo de Excel
  .QUIT
ENDWITH
RELEASE loExcel
SELECT("&xTabla")
BROWSE
**** Fin del Codigo

Salu2

Ludwig

11 comentarios :

  1. gracias por tu aporte. precisamente ayer estuve trabajand o para modificar el programa(el autor original dio permiso para mejorarlo, porque estaba conciente de que no funcionaba correctamente), pero me encontre con con esta solucion. gracias.

    ResponderBorrar
  2. Gracias a personas que siempre comparten

    ResponderBorrar
  3. muy bueno muchas gracias por este aporte.

    ResponderBorrar
  4. muy buen aporte gracias por la ayuda

    ResponderBorrar
  5. Excelente aporte para la comunidad. Un abrazo desde Lima Perú.

    ResponderBorrar
  6. Saludos....! como validar cuando la aplicacion excel esta en uso. Para evitar el error "No se puede ejecutar porque el otro programa esta ocupado........."

    ResponderBorrar
  7. Buen aporte, sólo tengo una consulta si el archivo de excel o el libro tiene varias hojas y deseo sólo convertir una de ellas, por decir la hoja 2 y/o 3, en que lugar del código se haría el cambio o el agregado? Gracias por la respuesta. Saludos..

    ResponderBorrar

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.