Estimado experto, quisiera saber si ha pasado por esta experiencia. Yo genero un reporte de algo así como una solicitud de cotización la cual se envía por fax, pero también necesitaría almacenarla en un hoja de calculo (Excel). ¿Podría ud. Ayudarme con esto? Muchas Gracias.
1 respuesta
Respuesta de rastadj
1
1
rastadj, Derick Salazar, Coorporacion Imb-Pc Ciudad De Guatemala
Ok, mira lo que yo hago para mandar a excel es crear una consulta tipo dbf y la exporto con los campos pertinentes por ahí encontré esta función que no la hice yo pero es muy buena te la mando: * Procedimiento..: Dbf2Excel * Creada ........: Mayo 21, 2003 By Sukos * Uso ...........: Convierte una tabla a Excel, repartiendo los registros en varias hojas si * es necesario. * Llamada .......: Dbf2Excel(, , , ) * Donde .........: = Alias de la tabla a convertir, debe estar abierta * = Nombre que se asigna a cada hoja en Excel * = Numero de registros por hoja que se desean * = Nombre con que se salva el libro de Excel creado * Ejemplo .......: Dbf2Excel("Prueba","Regs",50000,"C:PruebaXls") * ---------------------------------------------------------------------------------------------------------------- Proc Dbf2Excel(Vl_Tabla, Vl_NomsHojas, Vl_LimReg,Vl_NomArchSal) Local Vl_Alias, Vl_TotRegs, Vl_NoHojas, Vl_CtaHoja, Vl_LimIni, Vl_LimFin, Vl_NomHoja Vl_Alias=Alias() && Guarda el alias de la tabla en uso actualmente If Used(Vl_Tabla) && Verifica que la tabla a convertir este abierta *** Averigua cuantas hojas de excel se necesitan Sele (Vl_Tabla) Vl_TotRegs=RecCount() Vl_NoHojas=Int(Vl_TotRegs/Vl_LimReg)+Iif(Mod(Vl_TotRegs,Vl_LimReg)=0,0,1) *** Crea un cursor temporal y lo llena con un reg por cada hoja que se requiere Create Cursor TablasTmp (NomHoja C(20), RangoIni N(9), RangoFin N(9), NomDbf C(15)) Vl_LimIni=1 For Vl_CtaHoja=1 To Vl_NoHojas Vl_LimFin=Vl_LimIni+Vl_LimReg-1 Vl_LimFin=Iif(Vl_LimFin>Vl_TotRegs,Vl_TotRegs,Vl_LimFin) Vl_NomHoja="C:TmpDbf"+PadL(Vl_CtaHoja,2,"0")+".Dbf" Sele TablasTmp Append Blank Replace TablasTmp.NomHoja With Vl_NomsHojas+"_"+TransForm(Vl_LimIni)+"_"+TransForm(Vl_LimFin) Replace TablasTmp.RangoIni With Vl_LimIni Replace TablasTmp.RangoFin With Vl_LimFin Replace TablasTmp.NomDbf With Vl_NomHoja Sele (Vl_Tabla) Copy To (Vl_NomHoja) Type Fox2X As 850 For RecNo()>=Vl_LimIni.And.RecNo()<=Vl_LimFin Vl_LimIni=Vl_LimFin+1 Next Vl_CtaHoja *** Crea el objeto Excel loExcel = CREATEOBJECT("Excel.Application") loExcel.Visible=.F. loExcel.WorkBooks.Add *** Prepara el libro de Excel agregandole o eliminando hojas segun sea necesario Do Case Case Vl_NoHojas>3 For Vl_CtaHoja=4 To Vl_NoHojas loExcel.Sheets.Add Next Vl_CtaHoja Case Vl_NoHojas<3 For Vl_CtaHoja=Vl_NoHojas+1 To 3 loExcel.Sheets(1).Activate loExcel.Sheets(1).Delete Next Vl_CtaHoja EndCase *** Carga las hojas en el libro de Excel y les cambia el nombre Vl_CtaHoja=1 Sele TablasTmp Go Top Do While !Eof() Wait "Espere un momento, convirtiendo hoja "+Allt(Str(Vl_CtaHoja))+" de "+Allt(Str(Vl_NoHojas)) Window At 10,10 NoWait NoClear loExcel. Workbooks. Open(Allt(TablasTmp. NomDbf)) loExcel.Range("A1:AZ65001").Select loExcel.Selection.Copy loExcel.ActiveWindow.ActivateNext loExcel.Sheets(Vl_CtaHoja).Activate loExcel.Sheets(Vl_CtaHoja).Name=Allt(TablasTmp.NomHoja) loExcel.ActiveSheet.Paste loExcel.ActiveSheet.Cells(1,1).Select loExcel.Application.CutCopyMode=.F. LoExcel. ActiveWindow. ActivateNext LoExcel. ActiveWindow. Close Vl_CtaHoja=Vl_CtaHoja+1 Sele TablasTmp Skip EndDo Wait Clear *** Salva el libro de Excel LoExcel. ActiveWorkbook. SaveAs(Vl_NomArchSal, -4143, "", "", .F., .F.) LoExcel. WorkBooks. Close Release loExcel && Libera el objeto Excel creado Use In TablasTmp && Cierra el cursor temporal *** Regresa el apuntador a la tabla que estaba activa Else MessageBox("La tabla debe estar abierta para efectuar conversion",48,"No se encuentra la tabla") EndIf If Len(Allt(Vl_Alias))>=1 Sele &Vl_Alias EndIf Return Espero esto te funcione... Por ahí tengo algo para convertir un reporte a excel pero dejame buscarlo y si me mandas tu E-mail te lo envío. (En este momento estoy de viaje así que tendrás que esperar unos 10 o 15 días)