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!
Clipper e Excel:??
Moderador: Moderadores
-
Vittor_Malkavian
- Usuário Nível 1

- Mensagens: 1
- Registrado em: 12 Mar 2009 11:39
- Localização: Taiobeiras MG
Clipper e Excel:??
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.
Razão: O presente tópico foi movido da seção Bate Papo.
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Clipper e Excel:??
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 !
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.
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

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Re: Clipper e Excel:??
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...
Outra opção é criar o XLS em seu formato nativo. Veja o exemplo postado pelo Rochinha:
Espero que voce consiga resolver o teu problema.
[]´s
AlxSts
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
//------------------------------------------------------------------------------
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
//----------------------------------------------------------
[]´s
AlxSts
[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
-
Euclides
- Usuário Nível 3

- Mensagens: 154
- Registrado em: 12 Mai 2007 14:07
- Localização: São Paulo, Capital
Clipper e Excel:??
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:

Só mudei a localização de TESTE.XLS
Como não tenho fontes com caracteres chineses, a minha planilha ficou assim:

-
Euclides
- Usuário Nível 3

- Mensagens: 154
- Registrado em: 12 Mai 2007 14:07
- Localização: São Paulo, Capital
Clipper e Excel:??
Olá bencz
O Excel 2.0 é de 1987... O Open Office CERTAMENTE não a reconhece.
T+
Euclides
O Excel 2.0 é de 1987... O Open Office CERTAMENTE não a reconhece.
T+
Euclides


