FoxPro/Visual FoxPro - Exportar un dbf a excel conservando ceros inciales

   
Vista:

Exportar un dbf a excel conservando ceros inciales

Publicado por Yimy (2 intervenciones) el 04/01/2011 21:28:27
Estoy intentando utilizar un ejemplo que encontre en internet para exportar una tabla o un cursor dbf a excel de forma rapida (uso visualfoxpro 9). Para ello recomiendan exportar el cursor a un archivo txt y luego mandar ese txt separado por como o punto y como a excel através de Querytables. El problema es que tengo un campo con un numero en formato texto que contiene entre 16 y 20 digitos. Este campo queda en excel en una columna de formato general y el numero lo pone en forma exponencial. Yo quiero que el numero aparezca como texto con los ceros que tenga adelante.
Parte del codigo que utilizo e este.
WITH oConnection
.NAME = cCursor
.FieldNames = .T.
.RowNumbers = .F.
.FillAdjacentFormulas = .F.
.PreserveFormatting = .T.
.RefreshOnFileOpen = .F.
.RefreshStyle = 1 && xlInsertDeleteCells
.SavePassword = .F.
.SaveData = .T.
*.AdjustColumnWidth = .T.
.AdjustColumnWidth = .F.
.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.
.TextFileColumnDataTypes = Array(2,2,1,2,2)
*.TextFileFixedColumnWidths = (20,40,60)
.REFRESH
ENDWITH
Al ejecutar el programa foxpro me responde con el siguiente mensaje de error provocado por la linea TextFileColumnDataTypes = Array(2,2,1,2,2):
"file array.prg does not exist"
Alguien me puede ayudar por favor, quiero usar la automatizacion de esta manera porque de otra forma es muy lento el exportar la tabla a excel.
Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Exportar un dbf a excel conservando ceros incia

Publicado por xx (378 intervenciones) el 05/01/2011 13:23:33
Evidentemenete el problema que te tira es que la funcion/procedimiento ARRAY no existe o no esta al alcance:

* Si esto es una ARRAY es matriz, no deberias nombrarlo asi (como una palabra reservada ) y hasta donde se en VFP puedes tener hasta 2 dimensiones y la forma de accederlo es matriz[fila,columna]

* Si es un metodo o funcion tampoco deberias nombrarlo como una palabra reservada, deberia estar accesible, es decir verificas que el .PRG en el que esta lojado este cargado en memoria mediante la instruccion SET PROCEDURE TO

Yo en tu lugar exportaria directamente del VFP a EXCEL por medio de automatización es un poco mas lento pero es mas manejable y no requiere participación del usuario que siempre esta listo para cometer errores.

O podrias tambien enviar al archivo de texto con funciones de bajo nivel como FOPEN(),FWRITE(), FPUTS(), FCLOSE() etc

O podrias convertir la estructura de tu cursor al formato que mas se adapte a tu planilla excel y lo exportas con COPY TO ... TYPE XLS/XL5

Ten en cuenta que tiene importancia la versión del excel que utilizas.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Exportar un dbf a excel conservando ceros inciales

Publicado por Mario Rodriguez (3 intervenciones) el 08/02/2012 17:32:38
Hola yo ando en algo parecido

a logre exportar un base de datos y le puedo poner una imagen oncluso te paso el codigo y lo estudias a ver si te sirve

a la mejor el acomodo de la programación no es muy ortodoxa pues he apprendido a programar empíricamente y con la ayuda de este foro- una disculpa por la basura que pueda llevar el codigo -

algunas lineas la he ido tomando de distintas paginas y la he combinado

********* ritona que srive para exportar el presupuesto en ceros y sin año
******** genera un archivo en excel con los datos para llenar ****
***** al temrinar lo guarda *****

LOCAL bs_nw,ult_yer
ult_yer = 2000

clavempr = "tengo un campo con la empresa activa "

**** primero creo un cursor



IF !USED("miBase")
USE &mypath\pvt\"miBase".dbf IN 0 SHARED
ENDIF
SELECT PTO_VTA

GOTO top
CALCULATE MAX(year_di) TO ult_yer
*** 7 19
SELECT miBase.*;
FROM presups!"miBase;
WHERE allt(Pto_vta.id_emp) = clavempr and year_di = ult_yer = .t.;
INTO CURSOR ptto_exp READWRITE

SELECT miBase
use

eMessageTitle = ccredit + ' Exportando presupuesto'
eMessageText = ' poner en ceros las cifras?'
nDialogType = 4 + 16 + 256
* 4 = Yes and No buttons
* 16 = Stop sign icon
* 256 = Second button is default

nAnswer = MESSAGEBOX(eMessageText, nDialogType, eMessageTitle)

DO CASE
CASE nAnswer = 6
FOR gnCount = 6 TO 19 &&& FCOUNT( ) && Loop for number of fields
sf= FIELD(gnCount) && Display each field
SELECT ptto_exp
GOTO top
DO WHILE !EOF()
REPLACE &sf WITH 0
SKIP
enddo
NEXT
CASE nAnswer = 7

FOR gnCount = 6 TO 19 &&& FCOUNT( ) && Loop for number of fields
sf= FIELD(gnCount) && Display each field
SELECT ptto_exp
GOTO top
DO WHILE !EOF()
SKIP
enddo
NEXT

ENDCASE

SELECT ptto_exp


LOCAL num_fil


SELECT ptto_exp
GOTO top
num_fil = RECCOUNT()+7

IF FILE("c:\ptto_empty.xls") = .t.
answer = MESSAGEBOX("El archivo ptto_empty.xls ya existe" + CHR(13)+;
"Pulse reintentar para eliminar el archivo actual," + CHR(13)+;
" o cancelar el proceso",21,ccredit + " Archvo existente")

DO case
CASE answer = 2
RETURN

CASE answer = 4
ERASE c:\ptto_empty.Xls
COPY TO c:\ptto_empty.xls TYPE xl5

otherwise
RETURN

ENDCASE
else
COPY TO c:\ptto_empty.xls TYPE xl5
ENDIF


***Ahora vamos a trabajar con una planilla ya creada. Creamos nuevamente el objeto Excel:
loExcel=CREATEOBJECT("Excel.application")
loExcel.APPLICATION.VISIBLE=.T.

**Abrimos el libro Excel que ya existe:
loExcel.APPLICATION.workbooks.OPEN("C:\ptto_empty")

**Cambiamos el nombre de la hoja activa:
loExcel.APPLICATION.activesheet.NAME = "Ptto"

**Hacemos referencia directamente a "Ptto", y ponemos valores en una celda y le damos formato:
loExcel.APPLICATION.Sheets("Ptto").Rows("1:5").Insert

**loExcel.APPLICATION.Sheets("Ptto").cells(1,1).NumberFormat = "0.00%"


XLSheet = loExcel.APPLICATION.ActiveSheet

range_sq = "A6:u"+ALLTRIM(STR(num_fil))
range_sqr = '"'+range_sq+'"'

WITH XLSheet.Range(&range_sqr).Borders(3)&&xlEdgeLeft
XLSheet.Columns().AutoFit
ENDWITH

* .LineStyle = xlContinuous
* .Weight = xlThin
* .ColorIndex = xlAutomatic




lcRango= "A1:u"+ALLTRIM(STR(num_fil))

range_s2 = "A7:u"+ALLTRIM(STR(num_fil))
range_s2r = '"'+range_s2+'"'

range_s3 = "F7:S"+ALLTRIM(STR(num_fil))
range_s3r = '"'+range_s3+'"'

WITH XLSheet.Range(&range_s2r)
.Font.Size= 9
.Interior.ColorIndex = 19
ENDWITH

WITH XLSheet.Range(&range_s3r)
.Font.Size= 9
.Interior.ColorIndex = 2


ENDWITH


*** FORMULANMOS

FOR i = 7 TO num_fil
fxm = '"=suma(f'+ALLTRIM(STR(i))+ ':q' + ALLTRIM(STR(i)) + ')"'
loExcel.APPLICATION.Sheets("Ptto").cells(i,18).value = (&fxm) &&"=(A1+B1)")
ENDFOR


loExcel.APPLICATION.Sheets("Ptto").cells(1,3).VALUE = "Formato de presupuesto"
* .HorizontalAlignment=xlCenter &&Aliniar al centro *
* .VerticalAlignment=xlCenter
**** formato del encabezado principal
WITH XLSheet.Range("c1:o1")
.Merge
.Font.Bold=.t.
.Font.Size=16
.HorizontalAlignment=xlCenter
.Interior.ColorIndex = 20

ENDWITH

WITH XLSheet.Range("a6:u6")
.Borders(2)
.Font.Bold=.t.
.Font.Size= 9
.HorizontalAlignment=xlCenter
.Interior.ColorIndex = 22

ENDWITH

WITH XLSheet.Range("a6:u6")
.Borders(2)
.Font.Bold=.t.
.Font.Size= 9
.HorizontalAlignment=xlCenter
.Interior.ColorIndex = 22

ENDWITH




*** .Interior.ColorIndex = 15 GRIS 10 VERDE 1 NEGRO 2 BLANCO 3 ROJO 4 VERDE CLARO
** 5 AZUL INTENSO 6 AMARILLO 7 FUISHA 8 CYAN 9 MARRON 11 AZUL FUERTE12 AMARILLO OBSCURO
** 13 MORADO 14 VERDE AZUL 16 GRIS 17 LILA 19 AMARILLO CLARO 20 AZUL


loExcel.APPLICATION.Sheets("Ptto").cells(2,3).VALUE = "Instrucciones: Llenar los datos de importes para presupuesto (la informacion puedes manipularla en otras hojas"
**loExcel.APPLICATION.Sheets("Ptto").cells(1,1).NumberFormat = "#,##0.00"
loExcel.APPLICATION.Sheets("Ptto").cells(3,3).VALUE = "en esta hoja no moficiar nombres ni columnas , no olvides anotar el año ejercicio y revisa que todoas las familias se consideraron"
loExcel.APPLICATION.Sheets("Ptto").cells(4,3).VALUE = "Para importar a Gennie grabe la información en un archivo excel a partir de la fila 6"

LOCAL lcImagen, lcPlanilla, lo
*-- Selecciono imagen y nombre de planilla (xls)
lcImagen = MYPATH+"\SALIDAGRAFICA.BMP" &&&GETPICT()
*-- Selecciono la celda donde estará la posición de la imagen

loExcel.Cells(1,1).Select
loExcel.ActiveSheet.Pictures.Insert(lcImagen).Select
loExcel.Selection.ShapeRange.LockAspectRatio = 0
loExcel.Selection.ShapeRange.Height = 58 && pixeles
loExcel.Selection.ShapeRange.Width = 90 && pixeles

*** configurar area de impresion

with loExcel.APPLICATION.ActiveSheet.PageSetup
.TopMargin = 30
.BottomMargin = 40
.RightMargin = 15
.LeftMargin = 15
.LeftFooter = cempresa + " Archivo para presupuestos - informaicón confidencial"
.PrintHeadings = .f.
.Orientation = xlLandscape
.PaperSize = xlPaperLetter
.PrintArea = lcRango

ENDWITH


loExcel.APPLICATION.activeworkbook.SAVE

**loExcel.APPLICATION.QUIT && no cierro excel porque quiero ver el archivo

**RELEASE loExcel



saludos {:-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar