Clipper e Excel:??

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Vittor_Malkavian
Usuário Nível 1
Usuário Nível 1
Mensagens: 1
Registrado em: 12 Mar 2009 11:39
Localização: Taiobeiras MG

Clipper e Excel:??

Mensagem por Vittor_Malkavian »

Tipo criei um programinha para fechar relatorios mensais na empresa, mais tem um pequeno problema gostaria que
os dados fossem enviados a uma planilha no excel.

Tem como???

Obs: sou iniciante no Clipper!
Editado pela última vez por Toledo em 18 Abr 2014 19:14, em um total de 1 vez.
Razão: O presente tópico foi movido da seção Bate Papo.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Clipper e Excel:??

Mensagem por Pablo César »

Oi Vittor, como eu falei no chat podes encontrar algo nestes links:

viewtopic.php?f=1&t=8383&p=47098&hilit=excel+clipper#p47096
viewtopic.php?f=1&t=9019&p=50950&hilit=excel+Clipper#p50947

Ahhh e outra vez: Bem vindo ao fórum !
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Clipper e Excel:??

Mensagem por alxsts »

Bem vindo Vittor.

Nesta semana precisei gerar uma planilha com uma consistencia de arquivos. Estou postando para voce utilizar como exemplo, se possível.

Eu varro um arquivo .DBF e gero cada linha de erro num array (várias colunas), converto o array numa string no formato .CSV e gravo num arquivo texto com extensão .CSV. Ao final, se o usuário desejar, abro o arquivo com o Excel. Isto é possível com as associações de arquivo do Windows (a extensão .CSV, por padrão, está associada ao Excel).
Voce pode fazer isso nos seus relatórios embora eu ache um pouco trabalhoso. Voce teria que gerar uma versão para impressão e outra versão planilha...

Código: Selecionar todos

/*------------------------------------------------------------------------------

   Este programa varre o  cadastro de exames, verificando
   se cada exame tem materiais cadastrados em EXAAUX
   Se nao existir gera linha na planilha com mensagem apropriada
   Se existir, verifica se o material existe em TABELAS, codigo MTR
      Se nao existir em TABELAS (MTR) gera linha na planilha com mensagem apropriada

   Alexandre Santos - 09/03/2009 - 18:27:02

   Compilar: Clipper VerifExa /N/W
   Link    : Exospace FI VerifExa
------------------------------------------------------------------------------*/

#include "Box.Ch"
#include "Set.Ch"
#include "FileIo.Ch"
#include "Common.Ch"

#define K_CRLF Chr(13) +  Chr(10)

PROCEDURE VerifExa()

   LOCAL cMessage, aMateriais, nInd, nLen, nHandle, cString, cFile
   LOCAL nOffSet, aSetores := { "BM","BQ","BQD","CT","IM","MC","PA","UR" }

   CLS

   DispBox( 0,0,23,79, B_SINGLE + " ", "N/W" )
   DevPos( 12, 20 )
   Devout(  "Verificando exames. Favor aguardar...", "N/W" )
   DevPos( MaxRow(), 0 )

   Set( _SET_DATEFORMAT, "dd/mm/yyyy" )

   BEGIN SEQUENCE

      USE "L:\Sistema\TABELAS" SHARED NEW

      IF ! NetErr()
         DbSetIndex( "L:\Sistema\TABELAS" )
      ELSE
         Break( "TABELAS.DBF ===> Falha na abertura." )
      ENDIF
      //
      USE "L:\Sistema\EXAAUX" SHARED NEW

      IF ! NetErr()
         DbSetIndex( "L:\Sistema\EXAAUX3" ) // "MA" + codexa
      ELSE
         Break( "EXAAUX.DBF ===> Falha na abertura." )
      ENDIF
      //
      USE "L:\LABOR\ECEXAME" SHARED NEW

      IF ! NetErr()
         DbSetIndex( "L:\LABOR\ECEXAME" )
      ELSE
         Break( "ECEXAME.DBF ===> Falha na abertura." )
      ENDIF
      //

      nInd := 1

      cFile := "C:\Sistema\TMP" + StrZero( Random( 100000 ), 5 ) + ".CSV"

      WHILE ((nHandle := FCREATE( cFile, FC_NORMAL)) == -1) .And. nInd == 1
         nInd := Alert( "Falha ao criar arq. " + cFile + ;
                             ";(Erro DOS " + LTrim( Str( FERROR() ) ) + ;
                             "). Tentar novamente", { " Sim ", " Nao " } )
      ENDDO

      IF nHandle > 0

         // Escreve o cabecalho da planilha
         FWrite( nHandle, K_CRLF + ArrayAsCSV( { "Automacao da Triagem - Fluxos Inteligentes" } ) + K_CRLF)

         FWrite( nHandle, K_CRLF + ArrayAsCSV( { "Pre-implantacao - Inconsistencias no cadastro de Exames " +;
                                                 Dtoc( Date() ) + " - " + Time() ;
                                               } ) + K_CRLF )

         FWrite( nHandle, K_CRLF + ArrayAsCSV( { PadR( "Exame", 45 ), "Setor", ;
                                                "Mensagem" } ) + K_CRLF + K_CRLF )
      ELSE
         BREAK( "Falha ao abrir arquivo de saida " + cFile )
      ENDIF

      ECEXAME->( DbGotop() )

      WHILE ECEXAME->( ! Eof() )
         IF AScan( aSetores, { |e| RTrim( ECEXAME->ecodgrup ) == e } ) > 0
            IF EXAAUX->( DbSeek( "MA" + StrZero( ECEXAME->ecodexa, 4 ) ) )

               aMateriais := ObterMateriaisExame( StrZero( ECEXAME->ecodexa, 4 ) )

               nLen := Len( aMateriais )

               IF nLen > 0
                  FOR nInd := 1 TO nLen
                      IF TABELAS->( ! DbSeek( "MTR" + aMateriais[ nInd ] ) )
                         cString := ArrayAsCSV( { PadR( StrZero( ECEXAME->ecodexa, 4 ) + " " + Left( ECEXAME->edesexa, 35 ), 40 ), ;
                                                  TABELAS->( DbSeek( "GEX" + ECEXAME->ecodgrup ), TABELAS->descricao ), ;
                                                  "Material " + PadR( aMateriais[ nInd ], 5 ) + " - codigo de recebimento inexistente" } ) + K_CRLF
                         nOffSet := Len( cString )
                         //grava arquivo
                         IF FWrite( nHandle, cString, nOffSet ) != nOffSet
                            BREAK( "Falha ao gravar arquivo " + cFile + ".;;Processamento cancelado" )
                         ENDIF
                      ENDIF
                  NEXT
               ELSE
                  cString := ArrayAsCSV( { PadR( StrZero( ECEXAME->ecodexa, 4 ) + " " + Left( ECEXAME->edesexa, 35 ), 40 ), ;
                                           TABELAS->( DbSeek( "GEX" + ECEXAME->ecodgrup ), TABELAS->descricao ), ;
                                           "Exame sem cadastro de materiais e recipientes" } ) + K_CRLF
                  nOffSet := Len( cString )
                  //grava arquivo
                  IF FWrite( nHandle, cString, nOffSet ) != nOffSet
                     BREAK( "Falha ao gravar arquivo " + cFile + ". Processamento cancelado" )
                  ENDIF
               ENDIF
            ELSE
               cString := ArrayAsCSV( { PadR( StrZero( ECEXAME->ecodexa, 4 ) + " " + Left( ECEXAME->edesexa, 35 ), 40 ), ;
                                        TABELAS->( DbSeek( "GEX" + ECEXAME->ecodgrup ), TABELAS->descricao ), ;
                                        "Exame sem cadastro de materiais e recipientes" } ) + K_CRLF
               nOffSet := Len( cString )
               //grava arquivo
               IF FWrite( nHandle, cString, nOffSet ) != nOffSet
                  BREAK( "Falha ao gravar arquivo " + cFile + ". Processamento cancelado" )
               ENDIF
            ENDIF
         ENDIF
         ECEXAME->( DbSkip() )
      ENDDO
   RECOVER USING cMessage
      Alert( cMEssage )
   END SEQUENCE

   DbCloseAll()

   IF nHandle > 0
      FClose( nHandle )
      IF ( Alert( "A planilha " + cFile + ";foi gerada com sucesso.;;" + ;
                  "Deseja visualiza-la agora?;", { " Sim ", " Nao " }, "W+/B" ) ) == 1
         cString := "CMD /C START " + cFile + " /D\" + cFile + " /WAIT"

         RUN ( cString )
      ENDIF
   ENDIF

   CLS

   __Quit()
//-------------------------------------------------------------------------------
STATIC FUNCTION ObterMateriaisExame( cCodExame )

   LOCAL aGrupoMat := {}, cMaterial, cString, nPos, nRecno := EXAAUX->( Recno() )

   EXAAUX->( DbSeek( "MA" + cCodExame ) )

   WHILE EXAAUX->sistema == "MA" .And. EXAAUX->codexa == cCodExame .And. EXAAUX->( ! Eof() )
      cString := EXAAUX->codaux

      WHILE ! Empty( cString )
         nPos := At( " ", cString )
         IF nPos > 0
            AAdd( aGrupoMat, Left( cString, nPos - 1 ) )
         ELSE
            AAdd( aGrupoMat, cString )
            cString := ""
         ENDIF
         cString := LTrim( Subst( cString, nPos + 1 ) )
      ENDDO
      EXAAUX->( DbSkip() )
   ENDDO

   EXAAUX->( DbGoTo( nRecno ) )

   RETURN aGrupoMat
//------------------------------------------------------------------------------
#define PERIOD 2147483647
#define FACTOR 16807

STATIC FUNCTION Random( nMaxVal )

   /*     Returns a floating-point pseudo-random number between 0 and maxval
   (left-inclusive), with maxval defaulting to 1. If maxval is in the same
   order of size as the generator's period, the distribution of the
   resulting PRNs will be irregular, but since PERIOD is 2147483647, that
   should not be a problem in practice; people doing astrophysics or monte
   carlo simulation using Clipper deserve everything they get, anyway .
   */

   Local nRandom
   Static nSeed := 0

   DEFAULT nMaxVal TO 1

   While nSeed == 0
      nSeed := Seconds()
      nSeed :=( nSeed * 12345 ) % PERIOD
   Enddo

   nSeed := FACTOR * nSeed - Int(FACTOR * nSeed / PERIOD ) * PERIOD

   If ValType(nMaxVal) == "N"
      nRandom := nSeed / ( PERIOD / nMaxVal + 1 )
   Else
      nRandom := nSeed / PERIOD
   Endif

   RETURN nRandom
//------------------------------------------------------------------------------
STATIC FUNCTION ArrayAsCSV( aArray )

   // Alexandre Santos - 06/08/2008 - 19:03:16
   // Gera uma string, no formato CSV, a partir de um array
   LOCAL cString := "", uVal, cValType, nInd, nLen := Len( aArray )

   If nLen > 0
      For nInd := 1 To nLen

         cValType := ValType( ( uVal := aArray[nInd] ) )

         If cValType != "C"
            Do Case
               Case cValType == "N"
                  uVal := LTrim( Transform( aArray[nInd], "@E" ) )
               Case cValType == "D"
                  uVal := DtoC( aArray[nInd] )
               Case cValType == "L"
                  uVal := If( aArray[nInd], "Sim", "Nao" )
               Case cValType $ "AB"
                  uVal := ""
            End Case
         Else
            uVal := StrTran( uVal, '"', '""' )
         Endif

         cString += If( Empty( cString ), '"' + AllTrim( uVal ) + '"', ';"' + AllTrim( uVal ) + '"' )

      Next
   Endif

   RETURN cString
//------------------------------------------------------------------------------
Outra opção é criar o XLS em seu formato nativo. Veja o exemplo postado pelo Rochinha:

Código: Selecionar todos

//------------------------------------------------------------------------------
//nfXLS - Gera arquivos XLS
//por rochinha em 06 Dez 2005 00:10

//----------------------------------------------------------
// XLS.PRG
//
// Rutinas para escribir un archivo Excel 2.0 de
// forma nativa
//
// Basada en la implementacion de Mark O'Brien
// Microsoft Corporation
//
// Version Clipper :
// Yamil Bracho (brachoy@pdvsa.com)
// Nov,1999
// Caracas, Venezuela
//----------------------------------------------------------

#include "FileIo.Ch"

// Label Header
#define   TXT_OPCO1     1
#define   TXT_OPCO2     2
#define   TXT_LEN1      3
#define   TXT_LEN2      4
#define   TXT_ROW1      5
#define   TXT_ROW2      6
#define   TXT_COL1      7
#define   TXT_COL2      8
#define   TXT_RGBAT1    9
#define   TXT_RGBAT2   10
#define   TXT_RGBAT3   11
#define   TXT_LEN      12

#define   TXT_ELEMS    12

/*
*
* Exemplo de criacao de .XLS
*
*
*/
Function xlsTeste

Local aData := {}

Local nXls := xlsOpen( "c:\teste.xls" ), f, i

   Aadd( aData, { "Brazil", "Brasilia", 180000000 } )
   Aadd( aData, { "Portugal", "Lisboa", 30000000 } )

   altd()

   xlsWrite( nXls, 1, 1, "Pais" )
   xlsWrite( nXls, 1, 2, "Capital" )
   xlsWrite( nXls, 1, 3, "Populacao" )
   f := 2
   for i:=1 to Len( aData )
      xlsWrite( nXls, f, 1, aData[ i , 1 ] )
      xlsWrite( nXls, f, 2, aData[ i , 2 ] )
      xlsWrite( nXls, f, 3, Ltrim( Transform( aData[ i , 3 ], "@E" )))
      f++
   next i
                                   
   f++
   xlsWrite( nXls, f, 3, '=tInt(2)')

   xlsClose( nXls )
  return nil
//------------------------------------------------------------------------------
// Proposito :
// Abre el archivo xls y escribe marcador inicial
// Parametros:
// cFile - Nombre del Archivo
// Retorna :
// nHandle - Handle del archivo Excel
//------------------------------------------------------------------------------
Function xlsOpen( cFile )

   Local nHandle
   Local cBof := Chr( 9 ) + Chr( 0 ) + Chr( 4 ) + Chr( 0 ) + ;
   Chr( 2 ) + Chr( 0 ) + Chr( 10 ) + Chr( 0 )

   IF (nHandle := FCREATE(cFile, FC_NORMAL)) == -1
      Alert( "Falha ao criar arquivo " + cFile + "!;Erro " + LTrim( Str( FError() ) ) )
   Else
      FWrite( nHandle, cBof, Len( cBof ))
   Endif

   FWrite( nHandle, cBof, Len( cBof ))

   Return nHandle
//------------------------------------------------------------------------------
Function docOpen( cFile )

   Local nHandle
   Local cBof := Chr(208 ) + Chr(207 ) + Chr( 17 ) + Chr(224 ) + ;
   Chr(161 ) + Chr(177 ) + Chr( 26 ) + Chr( 0 )

   IF (nHandle := FCREATE(cFile, FC_NORMAL)) == -1
      Alert( "Falha ao criar arquivo " + cFile + "!;Erro " + LTrim( Str( FError() ) ) )
   Else
      FWrite( nHandle, cBof, Len( cBof ))
   Endif

   Return nHandle

//----------------------------------------------------------
// Proposito :
// Cierra el archivo xls y escribe marcador final
// Parametros:
// Nada
// Retorna :
// nil
//----------------------------------------------------------
Function xlsClose( nHandle )

   Local cEof := Chr( 10 ) + Chr( 0 ) + Chr( 0 ) + Chr( 0 )

   FWrite( nHandle, cEof, Len( cEof ))
   FClose( nHandle )
   Return nil
//------------------------------------------------------------------------------
Function docClose( nHandle )
   Local cEof := Chr( 10 ) + Chr( 0 ) + Chr( 0 ) + Chr( 0 )
   FWrite( nHandle, cEof, Len( cEof ))
   FClose( nHandle )
   Return nil

//----------------------------------------------------------
// Proposito :
// Escribe un string en la celda (nRow, nCol)
// nRow, nCol Comienzan en 1
// Parametros:
// nHandle - Handle del archivo xls
// nRow - Fila
// nCol - Columna
// cString - String a escribir
// Retorna :
// nil
//----------------------------------------------------------
Function xlsWrite( nHandle, nRow, nCol, cString )
   Local anHeader
   Local nLen
   Local nI

   //---------------------------------------------------
   // Arreglo para almacenar el marcador de registro
   // etiqueta
   //---------------------------------------------------
   anHeader := Array( TXT_ELEMS )

   anHeader[ TXT_OPCO1 ]  := 4
   anHeader[ TXT_OPCO2 ]  := 0
   anHeader[ TXT_LEN1 ]   := 1
   anHeader[ TXT_LEN2 ]   := 0
   anHeader[ TXT_ROW2 ]   := 0
   anHeader[ TXT_COL2 ]   := 0
   anHeader[ TXT_RGBAT1 ] := 0
   anHeader[ TXT_RGBAT2 ] := 0
   anHeader[ TXT_RGBAT3 ] := 0
   anHeader[ TXT_LEN ]    := 2

   nLen := Len( cString )

   //------------------------------
   // Longitud del texto a escribir
   //------------------------------
   anHeader[ TXT_LEN ] := nLen

   //----------------------
   // Longitud del registro
   //----------------------
   anHeader[ TXT_LEN1 ] := 8 + nLen

   //---------------------------------------------
   // En le formato BIFF se comienza desde cero y
   // no desde 1 como estamos pasando los datos
   //---------------------------------------------
   nI := nRow - 1
   anHeader[ TXT_ROW1 ] := nI - (Int( nI / 256 ) * 256 )
   anHeader[ TXT_ROW2 ] := Int( nI / 256 )
   anHeader[ TXT_COL1 ] := nCol - 1

   //-------------------
   // Escribe encabezado
   //-------------------
   Aeval( anHeader, { | e | fWrite( nHandle, Chr( e ), 1 )})

   //-----------------------------------------------------
   // Escribe la data
   //-----------------------------------------------------
   For nI:=1 To nLen
      FWrite( nHandle, SubStr( cString, nI, 1 ), 1 )
   Next nI

   Return NIL
//----------------------------------------------------------
Espero que voce consiga resolver o teu problema.

[]´s
AlxSts
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Clipper e Excel:??

Mensagem por bencz »

Essa função para gerar o excel É MUITO LEGAL, pena que....

Imagem
Imagem
Euclides
Usuário Nível 3
Usuário Nível 3
Mensagens: 154
Registrado em: 12 Mai 2007 14:07
Localização: São Paulo, Capital

Clipper e Excel:??

Mensagem por Euclides »

Já tinha visto esta rotina do Rochinha, mas não testei.
Só mudei a localização de TESTE.XLS
Como não tenho fontes com caracteres chineses, a minha planilha ficou assim:

Imagem
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Clipper e Excel:??

Mensagem por bencz »

Estranho, no meu, nada de funcionar!!!
):
Imagem
Euclides
Usuário Nível 3
Usuário Nível 3
Mensagens: 154
Registrado em: 12 Mai 2007 14:07
Localização: São Paulo, Capital

Clipper e Excel:??

Mensagem por Euclides »

Olá bencz
O Excel 2.0 é de 1987... O Open Office CERTAMENTE não a reconhece.
T+
Euclides
Responder