Page 1 of 1

Nueva Hoja o Utilizar Hoja Nro.2 (FileXLS)

Posted: Mon May 28, 2007 7:02 pm
by dbzap
Hola
Me gustaria pasar un segundo dbf a la segunda hoja de la planilla abierta ( y quizas un tercero y asi... )
Aqui esta el codigo que utilizo y no se como se hace.
agradeceria una poca de ayuda.
Saludos a todos.

Code: Select all

Static Function IniciarXLS( oPadre, cFile, oProgress, cDestino, cTitInforme, lMostrar, aNombres )
Local oFileXLS, i
Local cDestinoFinal
Local lIni := .t.
Local nReg := (cFile)->( RecNo() )
Local cActividad := ""
Local nFormat1, nFormat2
Local nFont1, nFont2, nFont3, nFont4
Local aRowActividad := {}
Local nTotReg := (cFile)->( LastRec() )
Local aCamposInforme := (cFile)->( dbStruct() )
Local cRazon := SacaNombre()

MEMVAR nRow, nCol  // estas variables tienen que ser declaradas publicas
                   // para poder ser procesadas en las formulas de Excel

DEFAULT aNombres := {}

If !Empty( cDestino )

   cDestinoFinal := AllTrim( cDestino ) + ".xls"

   DEFINE XLS FORMAT nFormat1 PICTURE '#,##0.00'
   DEFINE XLS FORMAT nFormat2 PICTURE 'dd/mm/yyyy'

   DEFINE XLS FONT nFont1 NAME "Arial" HEIGHT 16 BOLD
   DEFINE XLS FONT nFont2 NAME "Arial" UNDERLINE BOLD
   DEFINE XLS FONT nFont3 NAME "Arial" HEIGHT 8
   DEFINE XLS FONT nFont4 NAME "Arial" HEIGHT 8 BOLD

   XLS oFileXLS FILE (cDestinoFinal) AUTOEXEC

      XLS COL 1 WIDTH 1 OF oFileXLS

      nRow := 2
      @ nRow,2 XLS SAY cTitInforme FONT nfont1 OF oFileXLS
      nRow++
      @ nRow,2 XLS SAY cRazon FONT nfont2 OF oFileXLS
      nRow += 2

      For i := 1 To Len( aCamposInforme )
          XLS COL i+1 WIDTH aCamposInforme[i,3] OF oFileXLS
      Next

      If lMostrar
         oProgress:SetRange( 1, nTotReg )
      EndIf

      For i := 1 To Len( aCamposInforme )
          @ nRow,i+1 XLS SAY AllTrim( aCamposInforme[i,1] ) FONT nFont4 OF oFileXLS BORDER BORDER_ALL
      Next
      ++nRow

      (cFile)->( dbGoTop() )
      WHILE (cFile)->( !Eof() )

         For i := 1 To Len( aCamposInforme )
             If     aCamposInforme[i,2] == "D"
                    @ nRow,i+1 XLS SAY (cFile)->( FieldGet(i) ) FONT nFont3 OF oFileXLS FORMAT nFormat2
             ElseIf aCamposInforme[i,2] == "N"
                    @ nRow,i+1 XLS SAY (cFile)->( FieldGet(i) ) FONT nFont3 OF oFileXLS FORMAT nFormat1
             ElseIf aCamposInforme[i,2] == "L"
                    @ nRow,i+1 XLS SAY (cFile)->( FieldGet(i) ) FONT nFont3 OF oFileXLS
             ElseIf aCamposInforme[i,2] == "C"
                    @ nRow,i+1 XLS SAY (cFile)->( FieldGet(i) ) FONT nFont3 OF oFileXLS
             Else
                    @ nRow,i+1 XLS SAY (cFile)->( FieldGet(i) ) FONT nFont3 OF oFileXLS
             EndIf
         Next
         ++nRow

         If lMostrar
            oProgress:SetPos( (cFile)->(RecNo()) ) //  * 100 / nTotReg )
         EndIf

         (cFile)->( dbSkip() )

      ENDDO
      (cFile)->( dbGoTop() )

      SET XLS TO DISPLAY ;
          OF oFileXLS

      SET XLS TO PRINTER ;
          HEADER "&ZFecha: &F&CSISTEMICA S.A.&DPágina Nº &P" ;
          FOOTER "RANDOM (2006)" ;
          TOP MARGIN 0.6 ;
          BOTTOM MARGIN 0.8 ;
          LEFT MARGIN 0 ;
          OF oFileXLS

   ENDXLS oFileXLS

EndIf

Return NIL

Posted: Mon May 28, 2007 11:13 pm
by R.F.
No es posible hacerlo con FileXLS porque esta clase no maneja libros.

Tendiras que hacerlo usando la clase XLScript o bien por OLE puro y duro.

Sucede que Microsoft cambio la arquitectura interna del archivo XLS y por lo tanto en las versiones de Excel que soportan libros, no es posible crear el archivo XLS directamente a bajo nivel como lo hace la FileXLS.

Posted: Tue May 29, 2007 12:57 am
by dbzap
Gracias maestro