Se ha escrito mucho acerca de exportar datos a Excel. Pero esta funcion que modifique gracias a rutinas encontradas en este Blog, me ha sacado de apuros.
*------------------------------------------------------------------------------------- *----------- FUNCTION EXPORTAR A MS EXCEL -------------------------------------------- *------------------------------------------------------------------------------------- *-- MarcoMolina("27/07/2006") *-- Genere una instruccion SQL READWRITE partiendo de una Tabla/Cursor *-- con el formato que se desea. *-- Limitacion exporta solo 26 campos a MS Excel *-- USO: *-- Exportar_Excel("CursorSQL","Encabezado del Reporte",Dsd,Hst,"Nombre de la Empresa",.f.) * Dsd : Fecha que inicia el rango del reporte, si no se requiere deje "" * Dsd : Fecha que final del rango del reporte, si no se requiere deje "" * CursorSQL : Nombre de la Tabla/Cursor * .t./.f. : Indica que protege la hoja de excel con password *--Forma de USO: CLOSE DATABASES SELECT 0 USE OrigenDatos SELECT CAST(Camp0 AS N(1)) AS "I",; Camp1 AS Campo1,; Camp2 AS Campo2,; Camp3 AS Campo3; FROM OrigenDatos; WHERE BETWEEN(Fecha,Dsd,Hst); INTO CURSOR CursorSQL READWRITE *--Instrucciones para dar formato al CursorSQL. Si se requiere. IF RECCOUNT() > 0 =Exportar_Excel("CursorSQL","Encabezado del Reporte",Dsd,Hst,"Nombre de Empresa",.F.) ELSE WAIT WIND "No existen registros para procesar" ENDIF FUNCTION Exportar_Excel PARAMETERS cTabla,cTitulo,cDesde,cHasta,cEmpresa,cproteg IF VARTYPE(cProteg) = "U" cProteg = .F. &&la hoja de excel estara protegida=.t. - modificable=.f. ENDIF IF TYPE("cDesde") = "L" OR TYPE("cHasta") = "L" Periodo = "" ELSE IF !EMPTY(cDesde) AND !EMPTY(cHasta) IF TYPE("cDesde") = "D" OR TYPE("cHasta") = "D" Periodo = "Desde: " + ALLTRIM(DTOC(cDesde)) +" Hasta: "+ ALLTRIM(DTOC(cHasta)) ELSE Periodo = "Desde: " + ALLTRIM(cDesde) +" Hasta: "+ ALLTRIM(cHasta) ENDIF ELSE Periodo = "" ENDIF ENDIF *--Selecciona la tabla pasada por parametro - Resultado del SQL SELECT (cTabla) AreaTabla = SELECT() COUNT FOR !DELETED() TO Lineas *--Identificacion de la columna de la hoja Excel *--ID_Col = Nombres de las columnas A1,B2,C3... *--AnchoCol = Ancho de la columna *--TipoCmp = Formato del campo si es Caracter, Numerico, Fecha. CREATE CURSOR LargoCol (ID_Col C(10),AnchoCol N(8),TipoCmp C(1)) *--Separa los campos de la tabla por comas *--Identifica la columna en la tabla ...A1,B2,C3,D4..... *--Solo 26 campos permite identificar de A-Z SELECT (AreaTabla) cString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" STORE "" TO cLago,cCh,nCampo FOR xCta = 1 TO FCOUNT() *--Lista de campos separados por comas. nCampo = nCampo + FIELD(xCta) + "," *--Largo de cada campo cLago=FSIZE(FIELD(xCta)) *--Tipo de campo cTipo=TYPE(FIELD(xCta)) *--Establece el ancho de la columna como minimo 13 espacios IF cLago <= 10 cLago = 13 ENDIF *--Identifica las columnas A1 B2 C3.. cCh = SUBSTR(cString,xCta,1) gCh = cCh+ALLTRIM(STR(xCta)) *--Guarda la configuracion del tamñano de los campos y nombre etc. INSERT INTO LargoCol (AnchoCol,ID_Col,TipoCmp) VALUES (cLago,gCh,cTipo) *--Reestablece la tabla SELECT (AreaTabla) NEXT SELECT (AreaTabla) *--Quita la ultima "," de la concatenacion de los nombres de campos del cursor nCampo = SUBSTR(nCampo,1,LEN(nCampo)-1) *--Determinar la ultima columna del reporte SELECT LargoCol xEnca = LEFT(ALLTRIM(Id_Col),1) + "5" xHay = LEFT(ALLTRIM(Id_Col),1) + ALLTRIM(STR(Lineas+7)) *--Solo 26 campos son exportables IF xCta > 26 =MESSAGEBOX("La tabla... &cTabla tiene...(" + ALLTRIM(STR(xCta)) + ") " + ; "campos, de los cuales solo... (26) pueden ser " + CHR(13)+; "exportados a MS Excel.",48,Titulo) CLOSE DATABASES RETURN ENDIF *--------------------------------------------------------- *-- EXPORTA LA TABLA *--------------------------------------------------------- WAIT WINDOW "Abriendo MS Excel..." NOWAIT SELECT (AreaTabla) *-- Nombre y path de la hoja TxtFilename = FULLPATH("Temps\Exprt_Excel"+Usuario) EXPORT FIELDS &nCampo TO ALLTRIM((TxtFileName)) TYPE XL5 oExcel = CREATEOBJECT("Excel.Application") WITH oExcel .DisplayAlerts = .F. .Workbooks.OPEN(TxtFilename) .ActiveWindow.DisplayZeros = "FALSE" *- Renombra la hoja de calculo cHoja=RIGHT(TxtFileName,13) &&"Exprt_Excel"+Usuario .Sheets("&cHoja").SELECT .Sheets("&cHoja").NAME = "MM-Empresarial" *--Inserta lineas en blanco para titulos del reporte .RANGE("A1:A4").SELECT .SELECTION.EntireRow.INSERT *--Formatea el ancho de las columnas en la hoja SELECT LargoCol SCAN ALL _Col = ALLTRIM(ID_Col) _Cls = LEFT(_Col,1) _Ach = AnchoCol .COLUMNS("&_Cls:&_Cls").COLUMNWIDTH = _Ach *--Si la columna es numerica le da el formato IF ALLTRIM(TipoCmp) = "D" .RANGE("&_Cls:&_Cls").HorizontalAlignment = -4152 ENDIF IF ALLTRIM(TipoCmp) = "N" *--Alinemiento del encabezado de la columna .RANGE("&_Cls:&_Cls").HorizontalAlignment = -4152 _Fin = "&_Cls"+ALLTRIM(STR(Lineas+50)) .RANGE("A1:&_Fin").SELECT .SELECTION.NumberFormat = "#,##0.00" ENDIF *--Coloca las mayusculas a los encabezados de columna _Clu = LEFT(ALLTRIM(ID_Col),1) _DsdA5 = "&_Clu"+"5" .RANGE("&_DsdA5:&_DsdA5").SELECT .RANGE("&_DsdA5:&_DsdA5").VALUE = UPPER(.RANGE("&_DsdA5:&_DsdA5").VALUE) ENDSCAN *--Inserta nombre de la empresa y titulo del reporte .RANGE("A1:A1").SELECT .RANGE("A1:A1").VALUE = UPPER(ALLTRIM(lpEmpresa)) .RANGE("A2:A2").SELECT .RANGE("A2:A2").VALUE = cTitulo .RANGE("A3:A3").SELECT .RANGE("A3:A3").VALUE = Periodo *--Formato/Presentacion de hoja .RANGE("A1:&xHay").SELECT .SELECTION.AutoFormat(1,.T.,.T.,.T.,.T.,.T.,.T.) *--Color del fondo de encabezado de columnas .RANGE("A5:&xEnca").SELECT WITH .SELECTION.Interior .ColorIndex = 36 .PATTERN = 1 ENDWITH *--Fuente para la hoja .RANGE("A6:&xHay").SELECT WITH .SELECTION.FONT .NAME = "Arial" .SIZE = 9 ENDWITH *--Fuente para el titulo del reporte .RANGE("A1:A1").SELECT WITH .SELECTION.FONT .NAME = "Arial" .SIZE = 12 ENDWITH *--Inserta una columna en blanco .SELECTION.EntireColumn.INSERT IF xCta > 3 .COLUMNS("A:A").COLUMNWIDTH = 8 ELSE .COLUMNS("A:A").COLUMNWIDTH = 3 ENDIF *---Protege la hoja con password IF cProteg *--Proteje la hoja .ActiveSheet.PROTECT("MaMh,.t.,.t.") ENDIF .VISIBLE = .T. ENDWITH WAIT CLEAR RETURN ENDPROC
Gracias Comunidad de VFP en Español y adelante.
Tonny Molina
genial
ResponderBorrar