Jump to content
Fivewin Brasil

xBrowse ToExcel (problema na formatação numérica)


oribeiro

Recommended Posts

Veja se este exemplo te ajuda:



#include "FiveWin.ch"
#Include "Ado.ch"
#include "xBrowse.ch"

FUNCTION VerMYSQL(oWindow)

LOCAL oWndVerMdb, oRs, oBrw, oCol
LOCAL oBar, oSay, nTotal:=0

DEFINE WINDOW oWndVerMdb MDICHILD OF oWindow FROM 5,0 TO 30,80 ;
TITLE "Visualizar tabla CUENTAS" ;

oBar := TBar():New(oWndVerMdb,50,45,.T.)

@ 01,10 SAY oSay PROMPT '' SIZE 90,20 OF oBar

// -- Creamos RecordSet----
TRY
oRs:=TOleAuto():New("adodb.recordset")
CATCH oError
MsgStop( "No se ha podido crear el RECORDSET de Cuentas Contables !", oApp:cAplicacion)
ShowError(oError)
oRs:= NIL
RETURN(.F.)
END

oRs:CursorLocation := adUseClient
oRs:CursorType := adOpenDynamic
oRs:LockType := adLockOptimistic
oRs:Source := "SELECT * FROM WCUENTAS ORDER BY CUENTA"
oRs:ActiveConnection(oApp:oCon)

TRY
oRs:Open()
CATCH oError
MsgStop( "No se ha podido abrir el RECORDSET de Cuentas Contables !", oApp:cAplicacion)
ShowError(oError)
RETURN(.F.)
END
//--

oBrw := TXBrowse():New( oWndVerMdb )


* le voy agregando esto
oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW // Con cursor de todo el renglón
oBrw:nColDividerStyle := LINESTYLE_LIGHTGRAY
oBrw:nRowDividerStyle := LINESTYLE_LIGHTGRAY
oBrw:lColDividerComplete := (.F.) // (.T.) Mantiene siempre llena la pantalla
oBrw:nHeaderHeight := 25 // Altura de los encabezados
oBrw:nRowHeight := 22 // Altura del renglón
oBrw:nHeaderLines := 1 // Número de líneas de encabezados
oBrw:nDataLines := 1 // Número de líneas de detalle
oBrw:nFooterHeight := 20 // Altura del footer
oBrw:nFooterLines := 1 // Número de líneas en el footer
oBrw:lFooter := (.T.) // Sí queremos línea de footer
oBrw:lHScroll := (.F.) // Quitamos el scroll horizontal
oBrw:lFastedit:= (.F.) // Permite edicion de campos

oBrw:SetAdo(oRs)

oBrw:aCols[1]:cHeader := "Nro.Cuenta"
oBrw:aCols[1]:nWidth := 65

oBrw:aCols[2]:cHeader := "Descripcion"
oBrw:aCols[2]:nWidth := 200
oBrw:aColS[2]:cFooter := "TOTAL SALDO INICIAL"

oBrw:aCols[3]:cHeader := "Tipo"
oBrw:aCols[3]:nWidth := 50

oBrw:aCols[4]:cHeader := "Grupo"
oBrw:aCols[4]:nWidth := 50

oBrw:aCols[5]:cHeader := "SDO INICIAL"
oBrw:aCols[5]:nWidth := 150
oBrw:aColS[5]:nHeadStrAlign := AL_RIGHT
oBrw:aColS[5]:nDataStrAlign := AL_RIGHT
oBrw:aCols[5]:nEditType := 1
oBrw:aCols[5]:cEditPicture := "@Z 999.999.999.999,99"

*oBrw:aCols[5]:ltotal := .t.
*oBrw:aCols[5]:ntotal := 0

*oBrw:aCols[5]:bFooter = {|| TRANSFORM(nTotal,"9,999,999,999.99") }

oBrw:MakeTotals()
oBrw:refresh()

oBrw:bSeek := { | c | Busca(c,oRs) }
oBrw:oSeek := oSay
AEval(oBrw:aCols,{|oCol|oCol:bLClickHeader:={|f,c,h,oCol|Ordena(oBrw,oRs,oCol)}})

oBrw:CreateFromCode()

oWndVerMdb:oClient:=oBrw

ACTIVATE WINDOW oWndVerMdb ON INIT oBrw:SetFocus()

RETURN NIL


Link to comment
Share on other sites

Realmente não funciona quando exporto para o Broffice/Excel.



#include 'fivewin.ch'
#include 'xbrowse.ch'

function Main()

local oWnd, oBar, oBrw, nTotal:=0

/*
A. American format: "999,999,999.99"
E. European format: "999.999.999,99"
I. Indian format: "99,99,999.99"
*/
fwNumFormat( 'E', .t. ) // Italian format

USE CUSTOMER

DEFINE WINDOW ownd

DEFINE BUTTONBAR oBar OF oWnd SIZE 80,32 2007

DEFINE BUTTON OF oBar PROMPT 'Excel' ;
ACTION MsgMeter( { |oMeter, oText, oDlg, lEnd | ;
Export2Excel( oBrw, oMeter, oText, oDlg, @lEnd ) } )

DEFINE BUTTON OF oBar PROMPT 'Quit' ACTION WndMain():End()

SET MESSAGE OF oWnd TO '' 2007

@ 0,0 XBROWSE oBrw OF oWnd ALIAS 'CUSTOMER' AUTOCOLS CELL LINES

// Salary/Salario
//oBrw:aCols[10]:cEditPicture := "@E 9.999.999,99"

oBrw:aCols[ 10 ]:bClrStd := {|| { iif( Field->Salary > 100000, CLR_HRED, CLR_HBLUE), CLR_GRAY } }
oBrw:aCols[ 10 ]:nDataStrAlign := AL_RIGHT

// Realmente nao funciona quando exporto para o Broffice/Excel
oBrw:aCols[10]:bFooter = {|| TRANSFORM(Field->Salary, "@E 9.999.999,99") }

oBrw:MakeTotals()
oBrw:refresh()

oBrw:CreateFromCode()

oWnd:oClient := oBrw

ACTIVATE WINDOW oWnd

CLOSE DATA

return nil

static function Export2Excel( oBrw, oMeter, oText, oDlg, lEnd )

oBrw:ToExcel( { |n,t| oMeter:nTotal := t, ;
oMeter:Set( n ), ;
oText:SetText( Str(n) + '/' + Str(t) ), ;
oDlg:Update(), .t. } )

return nil

Link to comment
Share on other sites

João,

Veja os valores exportados no exemplo abaixo: nem os valores nem os totais vão corretos.

#include 'fivewin.ch'
#include 'xbrowse.ch'

function Main()
   local oWnd, oBar, oBrw, nTotal:=0
   /*
   A. American format: "999,999,999.99"
   E. European format: "999.999.999,99"
   I. Indian   format: "99,99,999.99"
   */
   FwNumFormat( 'E', .T. )  // European Format
   DBCREATE("TESTXLS",{{"DESC   ","C",010,000},;
                       {"VAL1   ","N",010,001},;
                       {"VAL2   ","N",010,002},;
                       {"VAL3   ","N",010,003},;
                       {"VAL4   ","N",010,004},;
                       {"VAL5   ","N",010,005}})

   USE TESTXLS NEW ALIAS TESTXLS
   FOR nTotal=1 To 20
      APPEND BLANK
      REPL DESC WITH "Linha "+STRZERO(nTotal,2)
      REPL VAL1 WITH 99999 * nTotal / 777
      REPL VAL2 WITH 99999 * nTotal / 777
      REPL VAL3 WITH 99999 * nTotal / 777
      REPL VAL4 WITH 99999 * nTotal / 777
      REPL VAL5 WITH 99999 * nTotal / 777
   NEXT

   DEFINE WINDOW ownd

   DEFINE BUTTONBAR oBar OF oWnd SIZE 80,32 2007

   DEFINE BUTTON OF oBar PROMPT 'Excel' ;
          ACTION MsgMeter( { |oMeter, oText, oDlg, lEnd | ;
          Export2Excel( oBrw, oMeter, oText, oDlg, @lEnd ) } )

   DEFINE BUTTON OF oBar PROMPT 'Quit'  ACTION WndMain():End()

   SET MESSAGE OF oWnd TO '' 2007

   @ 0,0 XBROWSE oBrw OF oWnd ALIAS 'TESTXLS' AUTOCOLS CELL LINES

   // Realmente nao funciona quando exporto para o Broffice/Excel
   oBrw:aCols[2]:bFooter = {|| TRANSFORM(Field->VAL1, "@E 9.999.999,99") }
   oBrw:aCols[3]:bFooter = {|| TRANSFORM(Field->VAL2, "@E 9.999.999,99") }
   oBrw:aCols[4]:bFooter = {|| TRANSFORM(Field->VAL3, "@E 9.999.999,99") }
   oBrw:aCols[5]:bFooter = {|| TRANSFORM(Field->VAL4, "@E 9.999.999,99") }
   oBrw:aCols[6]:bFooter = {|| TRANSFORM(Field->VAL5, "@E 9.999.999,99") }

   oBrw:MakeTotals()
   oBrw:refresh()

   oBrw:CreateFromCode()

   oWnd:oClient      := oBrw

   ACTIVATE WINDOW oWnd MAXIMIZED

   CLOSE DATA

return nil

static function Export2Excel( oBrw, oMeter, oText, oDlg, lEnd )
   oBrw:ToExcel( { |n,t| oMeter:nTotal := t, ;
                         oMeter:Set( n ), ;
                         oText:SetText( Str(n) + '/' + Str(t) ), ;
                         oDlg:Update(), .t. } )
return nil

Link to comment
Share on other sites

Oscar, sinceramente, não entendi a resposta, se bem que não uso nada para excel, mas que me parece que não está correto, me parece. No xBrowse mostra a formatação corretamente, mas na hora que vai para o Excel, vai como se ele pegasse diretamente do banco de dados, estranho, mui estraño...

http://forums.fivetechsupport.com/viewtopic.php?f=6&t=29499

Se conseguires uma solução, eu gostaria de ver. Pela primeira vez, fiquei "rendido". kkkkkkkkkkkkkkk

Abs.

Link to comment
Share on other sites

ùnica forma que não deu diferença, embora não assumiu 9.999,99 e sim 9999.99, acredito não ser problema de conversão e sim de configuração do Excel, acho, mas enfim, assim deu certo...mais testes amanhã, pq agora irei tomar aquela antártica gelada....que ninguém é de ferro, certo!!!

@ 00,000 XBROWSE oBrw SIZE 300,100 PIXEL OF oDlg DATASOURCE ::oDbf LINES
 	ADD COLUMN TO XBROWSE oBrw DATA ::oDbf:nom HEADER "Descrição do Produto"
	ADD COLUMN TO XBROWSE oBrw DATA ::oDbf:mar HEADER "Marca"
	ADD COLUMN TO XBROWSE oBrw DATA ::oDbf:atu HEADER "Estoque" PICTURE "@E 999.999" RIGHT
	ADD COLUMN TO XBROWSE oBrw DATA ::oDbf:ven HEADER "Vlr.Venda" PICTURE "@E 9,999,999.99" RIGHT
	ADD COLUMN TO XBROWSE oBrw DATA ::oDbf:des HEADER "%.Desconto" PICTURE "@E 999.99 %" RIGHT
	
	oBrw:lRecordSelector   := .F.
	oBrw:lAllowColSwapping := .F.		// Não Move a Coluna
	oBrw:lAllowRowSizing   := .F.		// Não Altera o Tamanho da Linha
	oBrw:lAllowColHiding   := .F.		// Não Mostra o Menu
	
	AEVAL(oBrw:aCols,{|o| o:bPopUp:={|o| o:nHeadStrAlign := AL_CENTER, o:lAllowSizing  := .F. })
		
oBrw:CreateFromCode()

Link to comment
Share on other sites

Somente para complementar

Existe um problema tbem no metodo METHOD ClpText() CLASS TXBrwColumn

METHOD ClpText() CLASS TXBrwColumn

local RetVal := ""
local cDtFmt, cTmFmt

if nxlLangID == nil
SetExcelLanguage()
endif

// Aqui tive que ajustar tbem devido ao seguinte problema :

Se der um CTRL C em cima de uma celula numerica ou Nil como por exemplo um bitmap da erro de Alltrim

*if ::bEditValue == nil
* if ::bStrData == nil
* RetVal := ""
* else
* RetVal := AllTrim( Eval( ::bStrData, nil, Self ) )
* endif

Mudei para :

if ::bEditValue == nil
if ::bStrData == nil
RetVal := ""
else
RetVal := Eval( ::bStrData )
IF Valtype(RetVal) == "N"
RetVal := AllTrim(STR(RetVal) )
ELSEIF Valtype(RetVal) == "C"
RetVal := AllTrim(RetVal)

ELSEIF Valtype(RetVal) == "U"
RetVal := ""
ENDIF
endif

Link to comment
Share on other sites

Apesar de não saber se ajudou ou não os testes continuam. e usando array ( um amigo ) usou desta maneira xBrowse( aArray ) e converteu normalmente para o excel, o que ele acha é que como não tinha nada de picture a coisa funcionou, precisa de mais testes para entender porem, o tempo escasso e a falta de saber se está ajudando ou não .... vai ficando para o fim da lista. rsrsrsrs

Link to comment
Share on other sites

Amiguinhos,

Eu faço uso massisso do velho tBrowse de Hernan e nele fiz alterações e inclusões. Uma delas foi criar a opção de gerar uma planilha com os dados que aparecem no browse.

Com um pouco de esmero é possivel modificar para usar com xBrowse.

Basta passar o objeto que contém o browse( quase sempre usamos oLbx ) e complementar( caso queira ) os outros parâmetros.

function ReporteXLS( oRPTLbx, cTitle, lPreview, cTitle2, aColunas )
   local oRpt
   local nRecNo := If( Upper( oRPTLbx:cAlias ) != "ARRAY", ( oRPTLbx:cAlias )->( RecNo() ), 0 )
   local aData  := Eval( oRPTLbx:bLine )
   local n
   local nCharWidth
   local oRPTFont1, oRPTFont2, oRPTFont3
   public nCreditos := 0
   public nDebitos  := 0
   nCharWidth := GetTextWidth( 0, "B", If( oRPTLbx:oFont != nil, oRPTLbx:oFont:hFont, 0 ))
   DEFAULT cTitle := oRPTLbx:oWnd:cTitle, lPreview := .t.
   sColunas := ""
   //FOR nPos = 1 TO LEN(aColunas)
   //    if aColunas[nPos] <> "0"
   //       sColunas := sColunas + str(nPos,1) + ";"
   //    endif
   //NEXT
   CursorWait()
   Eval( oRPTLbx:bGoTop )
   oExcel := TOleAuto():New( "Excel.Application" )
   oExcel:WorkBooks:Add()
   oPasta  := oExcel:Get( "ActiveSheet" )
   nRow := 1
   for nCol := 1 TO len( oRPTLbx:aHeaders )
       oPasta:Columns( nCol ):Font:Bold := .T.
       if aColunas <> nil
          if aColunas[ nCol ] = "0"
             loop
          else
             oPasta:Cells( nRow, nCol ):Value := oRPTLbx:aHeaders[ nCol ]
          endif
       endif
   next
   nRow := 2
   do while .t.
      aData := Eval( oRPTLbx:bLine )
      for nCol := 1 to len( oRPTLbx:aHeaders )
          oPasta:Columns( nCol ):Font:Bold := .F.
          if aColunas <> nil
             if aColunas[ nCol ] = "0"
                loop
             else
                oPasta:Cells( nRow, nCol ):Value := aData[ nCol ]
             endif
          endif
      next
      //oRPTLbx:Skip( 1 )
      nRow := nRow + 1
      skip
      if Eof()
         exit
      endif
   enddo
   for nCol := 1 to len( oRPTLbx:aHeaders )
       oPasta:Columns( nCol ):AutoFit()
   next
   oExcel:Visible := .T.
   oPasta:End()
   oExcel:End()
   CursorArrow()
   if Upper( oRPTLbx:cAlias ) != "ARRAY"
      ( oRPTLbx:cAlias )->( DbGoTo( nRecNo ) )
   endif
   oRPTLbx:Refresh()
   return nil

Link to comment
Share on other sites

  • 4 years later...
 

Amiguinhos,

Eu faço uso massisso do velho tBrowse de Hernan e nele fiz alterações e inclusões. Uma delas foi criar a opção de gerar uma planilha com os dados que aparecem no browse.

Com um pouco de esmero é possivel modificar para usar com xBrowse.

Basta passar o objeto que contém o browse( quase sempre usamos oLbx ) e complementar( caso queira ) os outros parâmetros.


function ReporteXLS( oRPTLbx, cTitle, lPreview, cTitle2, aColunas )
   local oRpt
   local nRecNo := If( Upper( oRPTLbx:cAlias ) != "ARRAY", ( oRPTLbx:cAlias )->( RecNo() ), 0 )
   local aData  := Eval( oRPTLbx:bLine )
   local n
   local nCharWidth
   local oRPTFont1, oRPTFont2, oRPTFont3
   public nCreditos := 0
   public nDebitos  := 0
   nCharWidth := GetTextWidth( 0, "B", If( oRPTLbx:oFont != nil, oRPTLbx:oFont:hFont, 0 ))
   DEFAULT cTitle := oRPTLbx:oWnd:cTitle, lPreview := .t.
   sColunas := ""
   //FOR nPos = 1 TO LEN(aColunas)
   //    if aColunas[nPos] <> "0"
   //       sColunas := sColunas + str(nPos,1) + ";"
   //    endif
   //NEXT
   CursorWait()
   Eval( oRPTLbx:bGoTop )
   oExcel := TOleAuto():New( "Excel.Application" )
   oExcel:WorkBooks:Add()
   oPasta  := oExcel:Get( "ActiveSheet" )
   nRow := 1
   for nCol := 1 TO len( oRPTLbx:aHeaders )
       oPasta:Columns( nCol ):Font:Bold := .T.
       if aColunas <> nil
          if aColunas[ nCol ] = "0"
             loop
          else
             oPasta:Cells( nRow, nCol ):Value := oRPTLbx:aHeaders[ nCol ]
          endif
       endif
   next
   nRow := 2
   do while .t.
      aData := Eval( oRPTLbx:bLine )
      for nCol := 1 to len( oRPTLbx:aHeaders )
          oPasta:Columns( nCol ):Font:Bold := .F.
          if aColunas <> nil
             if aColunas[ nCol ] = "0"
                loop
             else
                oPasta:Cells( nRow, nCol ):Value := aData[ nCol ]
             endif
          endif
      next
      //oRPTLbx:Skip( 1 )
      nRow := nRow + 1
      skip
      if Eof()
         exit
      endif
   enddo
   for nCol := 1 to len( oRPTLbx:aHeaders )
       oPasta:Columns( nCol ):AutoFit()
   next
   oExcel:Visible := .T.
   oPasta:End()
   oExcel:End()
   CursorArrow()
   if Upper( oRPTLbx:cAlias ) != "ARRAY"
      ( oRPTLbx:cAlias )->( DbGoTo( nRecNo ) )
   endif
   oRPTLbx:Refresh()
   return nil

Alguem converteu esta rotina para xBrowse e que possa compartilhar, estou tendo problema com a rotina do xbrowse para enviar para excel, os campos numericos até vao direitinho, só que o usuario não consegue fazer calculos com este campo no Excel...

 

Link to comment
Share on other sites

Amiguinhos,

Theotokos

Ao repassar os campos numéricos verifique se esta repassando numeros com ponto no lugar de vírgula, pois mesmo que teu excel seja em português internamente números são tratados com pontuação americana.

Ao repassar um campo numérico com vírgula seu conteúdo pode ser entendido como caracter e portanto não calcular.

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...