Clipper On Line • Ver Tópico - gerar arquivos em word usando harbour

gerar arquivos em word usando harbour

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

gerar arquivos em word usando harbour

Mensagempor Amparo » 16 Mai 2013 18:00

ola amigos

preciso da ajuda dos colegas, em meu sistema tenho que gerar arquivo de contrato de comodato, preciso gerar este arquivo no WORD, baixei um exemplo neste forum, montei o arquivo em TXT e depois executo o WORD para abrilo, o arquivo esta sendo aberto no WORD so que sem nenhuma formataçao, gostaria que algum colega pudesse disponibilizar algum exemplo de como poço gerar o arquivo, mas configurando a fonte, a margem esquerda a margem direita a altura do formulario e se é possivel criar um cabeçalho anexando uma figura. tenho algumas linha que vou utilizar fonte do tamanho 6 outras 10

isso tudo é possivel ou é piraçao minha?

segue o exemplo que peguei no forum

Function Abre_word(CPASTA, CARQ)
Local oWord
Local oFILE
Local ArqDoc

oFILE  := CPASTA + cARQ
cARQ   := CPASTA + cARQ + ".TXT"
ArqDoc := oFILE + ".doc"

Copy File (cARQ) TO (oFILE)

RenameFile( oFILE, ArqDoc )

oWord:=TOleAuto():New( "Word.Application" )
oWord:Documents:Open( ArqDoc )
oWord:WindowState := 1
oWord:Visible := .t.
   
Return nil

tinha pego este outro so que na hora de compilar deu erro nas funcoes abaixo, acho que faltou declarar alguma lib so nao sei qual.

estou usando o Harbour 3.0.0 (Rev. 16951), tentei compilar com o Harbour 3.2.0dev (r1304291617) e tambem deu erro

Error: Unresolved external '_HB_FUN_FT_FUSE' referenced from C:\FONTES\HARBOUR\SIGECOM\.HBMK\WIN\BCC\PRINTSERV.OBJ
Error: Unresolved external '_HB_FUN_FT_FEOF' referenced from C:\FONTES\HARBOUR\SIGECOM\.HBMK\WIN\BCC\PRINTSERV.OBJ
Error: Unresolved external '_HB_FUN_FT_FREADLN' referenced from C:\FONTES\HARBOUR\SIGECOM\.HBMK\WIN\BCC\PRINTSERV.OBJ
Error: Unresolved external '_HB_FUN_FT_FSKIP' referenced from C:\FONTES\HARBOUR\SIGECOM\.HBMK\WIN\BCC\PRINTSERV.OBJ
FUNCTION Gera_WORD(CPASTA, CARQ,CARQDOC)
LOCAL lWord:=.T.

IF ( oWord := Win_oleCreateObject( "Word.Application" ) ) = Nil
   ALERT( "ATENÇÃO! Word não está  instalado nesta máquina. Não será  possível gerar o documento.")
   lWord:=.F.
ENDIF

IF lWord
   oDoc  := oWord:Documents:Add()
   oText := oWord:Selection()
*   TRY
   oDoc:SaveAs( CPASTA + CARQDOC)
*   CATCH

*   ALERT( "ATENÇÃO! o documento "+ CARQDOC +" está  aberto, feche-o  antes da impressão.")

*   hJanela:=HWG_FindWindow(0 ,cNomeArq+" - Microsoft Word")
*   hwg_BringWindowToTop( hJanela )
*   ShowWindow( hJanela, SW_MAXIMIZE )
*   RETURN .F.
*   END
   
   oWord:Visible := .F.
   oText:PageSetup():Orientation:=0 // 0=Portrait, 1=Landscape
   oText:PageSetup():TopMargin:=30
   oText:PageSetup():BottomMargin:=10
   oText:PageSetup():LeftMargin:=30
   oText:PageSetup():RightMargin:=3
   oText:PageSetup():PageWidth:=595.35
   oText:PageSetup():PageHeight:=841.95
   oText:Font:Name := "Courier New"
   oText:Font:Size := 11
   oText:Font:Bold := .F.
   
   FT_FUSE( CPASTA + CARQ )

   DO WHILE !FT_FEOF()
      cLinha   :=FT_FREADLN()
      lEject   :=(Chr(12) $ cLinha) // Procura caracter EJECT
      lEspecial:=(Chr(27)+"P" $ cLinha)

      IF !lEspecial
         lEspecial:=(Chr(27)+"P"+Chr(15) $ cLinha)
      ENDIF

      * Elimina as formatações ou códigos de impressão
      cLinha:=StrTran(cLinha,Chr(12)) // Elimina caracter EJECT
      cLinha:=StrTran(cLinha,Chr(13))
      cLinha:=StrTran(cLinha,Chr(27)+"P"+Chr(15))
      cLinha:=StrTran(cLinha,Chr(12),Chr(13)+Chr(13))
      cLinha:=StrTran(cLinha,Chr(27)+"P")

      IF lEspecial
         FT_FSKIP()
         LOOP
      ENDIF

      oText:TypeText(cLinha+ hb_eol())

      FT_FSKIP()

      IF lEject .AND. !FT_FEOF()
         oText:InsertBreak(1) //Gera quebra de página no word.
      ENDIF
   ENDDO     

   FT_FUSE()
   oWord:Visible     := .T.
   oWord:WindowState := 1
   oDoc:Save()
   nLinhaWord:=1
   nPaginaWord:=1
   oWord:Selection():GoTo(nLinhaWord,,nPaginaWord) //Posiciona na primeira linha da primeira página
ENDIF

RETURN lWord
Avatar de usuário

Amparo
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 279
Data de registro: 20 Ago 2010 10:38
Cidade/Estado: caieiras / sao paulo
Curtiu: 0 vez
Mens.Curtidas: 1 vez

gerar arquivos em word usando harbour

Mensagempor Itamar M. Lins Jr. » 16 Mai 2013 19:05

Tem que linkar a referida LIB.
FT* NANFORUM.

libnf.a se usar mingw, ou libnf.lib se usar BCC.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 4609
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 161 vezes
Mens.Curtidas: 253 vezes

gerar arquivos em word usando harbour

Mensagempor Amparo » 16 Mai 2013 19:56

ola amigos

Itamar, eu uso o BCC procurei pela lib e nao encontrei achei em uma pasta de teste que tenho no micro e copiei para as pastas da lib em LIB\WIn\BCC e o arquivo sigecom.hbp esta cfe abaixo
-lhbct
-inc
-lxhb
-lhbwin
-llibnf

-oSIGECOM.EXE

MAIN.PRG

AUDIT.PRG

BROWTEXT.PRG

CALCULAR.PRG
CALENDAR.PRG
CLIENTES.PRG

DANFE.PRG
DANFEDIV.PRG
DOCHEQUE.PRG
DOCOMPRA.PRG
DOCONTAS.PRG
DONFISC.PRG
DOPEDIDO.PRG
DOPRODUT.PRG
...


compilando com Harbour 3.0.0 (Rev. 16951) da este erro, sera que esta lib esta desatualiza, voce teria como me mandar?
hbmk2: Harbour: Compilando módulos...
Harbour 3.0.0 (Rev. 16951)
Copyright (c) 1999-2011, http://harbour-project.org/
Compiling 'PRINTSERV.PRG'...
Lines 258, Functions/Procedures 6
Generating C source output to '.hbmk\win\bcc\PRINTSERV.c'... Done.
hbmk2: Compilando...
.hbmk\win\bcc\PRINTSERV.c:
hbmk2: Linkando... SIGECOM.EXE
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: Unresolved external '_hb_retcAdopt' referenced from C:\HB30\LIB\WIN\BCC\L
IBNF.LIB|fttext
hbmk2: Erro: Executando linkeditor. 2
ilink32.exe @C:\DOCUME~1\Amparo\CONFIG~1\Temp\ejkmx6.lnk
Avatar de usuário

Amparo
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 279
Data de registro: 20 Ago 2010 10:38
Cidade/Estado: caieiras / sao paulo
Curtiu: 0 vez
Mens.Curtidas: 1 vez

gerar arquivos em word usando harbour

Mensagempor Amparo » 17 Mai 2013 08:42

ola amigos

Itamar, muito obrigado com sua ajuda consegui criar um arquivo em word, descobri que no meu caso nao é libnf.lib e sim hbnf.lib ja estou conseguindo usar os recursos abaixo:
oText:PageSetup():Orientation:=0 // 0=Portrait, 1=Landscape
oText:PageSetup():TopMargin:=0 //TopMargin:=30
oText:PageSetup():BottomMargin:=0 //BottomMargin:=10
oText:PageSetup():LeftMargin:=0 //LeftMargin:=30
oText:PageSetup():RightMargin:=0 //RightMargin:=3
oText:PageSetup():PageWidth:=595.35 //PageWidth:=595.35
oText:PageSetup():PageHeight:=841.95 //PageHeight:=841.95
oText:Font:Name := "Arial" //"Courier New"
oText:Font:Size := 14
oText:Font:Bold := .F.

mas ainda preciso de muita ajuda para terminar esta rotina, por exemplo:
1) como criar um cabeçalho anexando uma imagem gif, jpeg e outras
2) como mudar a fonte e seu tamanho em determinada linha do arquivo
3) como montar um retangulo como se fosse uma tabela
4) como aciono o negrito, italico e sublinhado para uma determinada linha
5) como tirar o espaçamento estre linha
6) como centralizar ou justificar uma linha

a rotina que estou usando é esta
FUNCTION Gera_WORD( CPASTA, CARQUI )
LOCAL lWord  := .T.
LOCAL ARQTXT := ""
LOCAL ARQWOR := ""

IF ( oWord := Win_oleCreateObject( "Word.Application" ) ) = Nil
   ALERT( "ATENÇÃO! Word não está  instalado nesta máquina. Não será  possível gerar o documento.")
   lWord:=.F.
ENDIF

ARQTXT := CPASTA + CARQUI + ".TXT"
ARQWOR := CPASTA + CARQUI + ".DOC"

IF lWord
   oDoc  := oWord:Documents:Add()
   oText := oWord:Selection()
   oDoc:SaveAs( ARQWOR )
   
   oWord:Visible := .F.
   oText:PageSetup():Orientation:=0                   // 0=Portrait, 1=Landscape
   oText:PageSetup():TopMargin:=0                     //TopMargin:=30
   oText:PageSetup():BottomMargin:=0                  //BottomMargin:=10
   oText:PageSetup():LeftMargin:=0                    //LeftMargin:=30
   oText:PageSetup():RightMargin:=0                   //RightMargin:=3
   oText:PageSetup():PageWidth:=595.35                //PageWidth:=595.35
   oText:PageSetup():PageHeight:=841.95               //PageHeight:=841.95
   oText:Font:Name := "Arial"                         //"Courier New"
   oText:Font:Size := 14
   oText:Font:Bold := .F.
   
   FT_FUSE( ARQTXT )

   DO WHILE !FT_FEOF()
      cLinha   :=FT_FREADLN()
      lEject   :=(Chr(12) $ cLinha) // Procura caracter EJECT
      lEspecial:=(Chr(27)+"P" $ cLinha)

      IF !lEspecial
         lEspecial:=(Chr(27)+"P"+Chr(15) $ cLinha)
      ENDIF

      * Elimina as formatações ou códigos de impressão
      cLinha:=StrTran(cLinha,Chr(12)) // Elimina caracter EJECT
      cLinha:=StrTran(cLinha,Chr(13))
      cLinha:=StrTran(cLinha,Chr(27)+"P"+Chr(15))
      cLinha:=StrTran(cLinha,Chr(12),Chr(13)+Chr(13))
      cLinha:=StrTran(cLinha,Chr(27)+"P")

      IF lEspecial
         FT_FSKIP()
         LOOP
      ENDIF

      oText:TypeText(cLinha+ hb_eol())

      FT_FSKIP()

      IF lEject .AND. !FT_FEOF()
         oText:InsertBreak(1) //Gera quebra de página no word.
      ENDIF
   ENDDO     

   FT_FUSE()
   oWord:Visible     := .T.
   oWord:WindowState := 1
   oDoc:Save()
   nLinhaWord:=1
   nPaginaWord:=1
   oWord:Selection():GoTo(nLinhaWord,,nPaginaWord) //Posiciona na primeira linha da primeira página
ENDIF

RETURN lWord


abraços
Avatar de usuário

Amparo
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 279
Data de registro: 20 Ago 2010 10:38
Cidade/Estado: caieiras / sao paulo
Curtiu: 0 vez
Mens.Curtidas: 1 vez

gerar arquivos em word usando harbour

Mensagempor Itamar M. Lins Jr. » 17 Mai 2013 19:11

O macete é usar macros e salvar, depois é só copiar o texto (da macro) para o prg.
Procure pelo excel tem muitos exemplos na internet, tem até para o OpenOffice.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 4609
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 161 vezes
Mens.Curtidas: 253 vezes

gerar arquivos em word usando harbour

Mensagempor Amparo » 20 Mai 2013 20:22

ola amigos

Itamar, desculpe minha ignorancia mas nao entendi um X do que vc escreveu.

mesmo assim obrigado, vou dar uma pesquisada por ai.

abraços
Amparo
Avatar de usuário

Amparo
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 279
Data de registro: 20 Ago 2010 10:38
Cidade/Estado: caieiras / sao paulo
Curtiu: 0 vez
Mens.Curtidas: 1 vez

gerar arquivos em word usando harbour

Mensagempor Amparo » 29 Mai 2013 14:31

ola amigos

bati a cabeça procurando alguma solução para meu caso e nao achei nada ou melhor, o que encontrei nao soube como implementar.

se alguem tiver alguma rotina e puder disponibilizar fico grato ou se quiser comercializar passeme o preço.

obrigado a todos.

Amparo
Avatar de usuário

Amparo
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 279
Data de registro: 20 Ago 2010 10:38
Cidade/Estado: caieiras / sao paulo
Curtiu: 0 vez
Mens.Curtidas: 1 vez

gerar arquivos em word usando harbour

Mensagempor Pablo César » 29 Mai 2013 15:13

Creio que o Itamar deu a entender que você pode fazer um texto (mesmo que RTF) onde você colocaria umas TAGs (strings fixas para referência) e mandar substituir essas tags pela strings que você deseja diferenciar.

Outra sugestão: eu diria que faça uma mala direta, onde você elabora o documento padrão com todas as formatações de tamanho de fontes e alinhamentos e outro arquivo de dados. O Word possibilita a mesclagem dos documentos. Tem muito material na internet falando disso. Esse seria o caminho mais certo.

Na HMG tem um exemplo acessando Word, mas ai vai complicar com a questão de formatação do texto e alinhamentos de campos... mas se quiser dar uma olhada em: C:\hmg.3.1.3\samples\OLE
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.
Avatar de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5539
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 151 vezes

gerar arquivos em word usando harbour

Mensagempor Itamar M. Lins Jr. » 29 Mai 2013 23:59

Ola!
O que eu quiz dizer é isso mesmo. MACRO.
No word, excel, etc, podemos criar uma macro de tudo que é feito. No word 2007 por exemplo clicar em exibição, lá no canto vai aparecer um botão macros.
EXECUTAR, Passo, Editar, Criar, Excluir, Biblioteca
Fiz essa como exemplo:

Sub Macro3()
'
' Macro3 Macro
'
'
    Selection.TypeText Text:="teste de macro"
    Selection.MoveLeft Unit:=wdCharacter, Count:=14, Extend:=wdExtend
    Selection.Font.Size = 22
    Selection.MoveRight Unit:=wdCharacter, Count:=1
    Selection.MoveLeft Unit:=wdCharacter, Count:=15
    Selection.MoveRight Unit:=wdCharacter, Count:=1
    Selection.TypeBackspace
    Selection.TypeText Text:="T"
End Sub


Eu não digitei nada disso ai em cima, o Word foi capturando tudo que eu estava fazendo e jogando nessa macro.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 4609
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 161 vezes
Mens.Curtidas: 253 vezes

gerar arquivos em word usando harbour

Mensagempor Itamar M. Lins Jr. » 30 Mai 2013 00:15

Ola!
Achei esse exemplo bem complexo
https://groups.google.com/forum/?fromgroups#!searchin/comp.lang.xharbour/word/comp.lang.xharbour/vGtFfnH5Iz4/vysacFZhLuMJ

Hi all , after a lot of try and fail I got what is expected.
It´s VB problem related to RANGE and SELECTION.

The code that works :

#include 'winpar.ch' -> Define for Windows variables wd...

******************************************************************************
function table_form()
******************************************************************************
* Parameter vtbl -> order data array
para vtbl
LOCAL oWord,__text

TRY
   oWord := CreateObject( "Word.Application" )
CATCH
   Alert( "ERROR! Word not avalable. [" + Ole2TxtError()+ "]" )
   retu NIL
END

oWord:Visible := .T.

* Creating new Doc

odoc := oWord:Documents:Add()

* DOC Setup
-----------------------------------------------------------------
*odoc:PageSetup:Orientation(wdOrientLandscape)

* Don't know why but Word Function CentimetersToPoints cause LINKER
error ?!

*odoc:PageSetup:TopMargin := oWord:CentimetersToPoints(2.5)

odoc:PageSetup:TopMargin := 80   //  points
odoc:PageSetup:BottomMargin := 60
odoc:PageSetup:LeftMargin := 60
odoc:PageSetup:RightMargin := 40
*odoc:PageSetup:Gutter := 0
odoc:PageSetup:HeaderDistance := 40
odoc:PageSetup:FooterDistance := 40
*odoc:PageSetup:PageWidth := 21
*odoc:PageSetup:PageHeight := 29.7
*odoc:PageSetup:VerticalAlignment := wdAlignVerticalTop
* DOC Setup
-----------------------------------------------------------------

* Header
--------------------------------------------------------------------
odoc:ActiveWindow:ActivePane:View:SeekView(wdSeekCurrentPageHeader)
odoc:Select()
oWord:Selection:ParagraphFormat:Alignment := wdAlignParagraphCenter
oWord:Selection:Font:Name := "Arial"
oWord:Selection:Font:Bold := wdToggle
__text := hb_oemtoansi("Order Confirmation")
oWord:Selection:TypeText(__text)
* Header
--------------------------------------------------------------------

* Footer
--------------------------------------------------------------------
odoc:ActiveWindow:ActivePane:View:SeekView(wdSeekCurrentPageFooter)
odoc:Select()
oWord:Selection:ParagraphFormat:Alignment := wdAlignParagraphLeft
oWord:Selection:Font:Name := "Arial"
oWord:Selection:Font:Bold := wdToggle
oWord:Selection:Font:Size := 6
*                           Order number
*
__text := hb_oemtoansi("PD"+ pdv->codigo + ".DOC")
oWord:Selection:TypeText(__text)

* Blank Lines
oWord:Selection:TypeParagraph()
oWord:Selection:TypeParagraph()

oWord:Selection:ParagraphFormat:Alignment := wdAlignParagraphCenter
oWord:Selection:Font:Name := "Arial"
oWord:Selection:Font:Bold := wdToggle
oWord:Selection:Font:Size := 8
__auto := 'AUTOTEXT  "P gina X de Y" '
__auto := hb_oemtoansi(__auto)
oWord:Selection:Fields:Add(oWord:Selection:Range, -1, __auto, .T.)
* Footer
--------------------------------------------------------------------

* Return Active Doc
---------------------------------------------------------
odoc:ActiveWindow:ActivePane:View:SeekView(wdSeekMainDocument)

* First Paragraph , just to assign a range for table 1

opr1 := odoc:Paragraphs:Add()  //  paragrafo 1 para Tab1
rng1 := opr1:Range
otb1 := odoc:Tables:Add(rng1, 3, 2)

* Tab1 setup

otb1:Borders:OutsideLineStyle := wdLineStyleSingle
otb1:Borders:InsideLineStyle  := wdLineStyleNone
otb1:Select()
oWord:Selection:Cells:VerticalAlignment := wdCellAlignVerticalCenter

* Tab1 rows and cols setup
otb1:Rows:Item(1):Height := 18
otb1:Rows:Item(2):Height := 12
otb1:Rows:Item(3):Height := 12

otb1:Columns:Item(1):PreferredWidth := 350
otb1:Columns:Item(2):PreferredWidth := 100

* Fill the cells
__text := 'ACME INC.' + ' - '

__text += 'Pedido : ' + alltrim(pdv->codigo)
otb1:Cell(1, 1):Range:Font:Name := "Arial"
otb1:Cell(1, 1):Range:Font:Size := 10
otb1:Cell(1, 1):Range:Font:Bold := wdToggle
otb1:Cell(1, 1) := __text
otb1:Cell(1, 1):Range:Select()
oWord:Selection:MoveRight(wdCell,1)

__text := 'Data : ' + dtoc(pdv->dtinic)
otb1:Cell(1, 2):Range:Font:Name := "Arial"
otb1:Cell(1, 2):Range:Font:Size := 10
otb1:Cell(1, 2):Range:Font:Bold := wdToggle
otb1:Cell(1, 2) := __text
otb1:Cell(1, 2):Range:Select()
oWord:Selection:MoveLeft(wdCell,1)

otb1:Cell(1, 2):Range:Select()
oWord:Selection:MoveLeft(wdCell,1)

__text := alltrim(cad->end) + ' - ' + alltrim(cad->bai)
__text += ' , ' + alltrim(cad->cid) + ' , ' + cad->uf
__text += ' - CEP : ' + alltrim(cad->cep)
otb1:Cell(2, 1):Range:Font:Name := "Arial"
otb1:Cell(2, 1):Range:Font:Size := 9
otb1:Cell(2, 1) := __text
otb1:Cell(2, 1):Range:Select()
oWord:Selection:MoveRight(wdCell,1)

__text := 'Resp. LYC : Caio'
otb1:Cell(2, 2):Range:Font:Name := "Arial"
otb1:Cell(2, 2):Range:Font:Size := 9
otb1:Cell(2, 2):Range:Font:Bold := wdToggle
otb1:Cell(2, 2) := __text
otb1:Cell(2, 2):Range:Select()
oWord:Selection:MoveLeft(wdCell,1)

__text := 'Tel. / Fax : ' + alltrim(cad->fone1) + ' / ' + alltrim(cad-
>fone2)
otb1:Cell(3, 1):Range:Font:Name := "Arial"
otb1:Cell(3, 1):Range:Font:Size := 9
otb1:Cell(3, 1) := __text
otb1:Cell(2, 1):Range:Select()
oWord:Selection:MoveRight(wdCell,1)

otb1:Cell(3, 2):Range:Select()
oWord:Selection:Collapse(wdCollapseEnd)
* Closing Tab1 range , selection

* Blank Line

opr2 := odoc:Paragraphs:Add()  //  paragrafo 2
rng2 := opr2:Range
rng2:Select()
oWord:Selection:Collapse(wdCollapseEnd)

* Client Data

wlixo:=cli->(at_seek(pdv->codimp,.f.))
opr3 := odoc:Paragraphs:Add()  //  paragrafo 3 , Tab2
rng3 := opr3:Range

otb2 := odoc:Tables:Add(rng3, 3, 2)
otb2:Borders:OutsideLineStyle := wdLineStyleSingle
otb2:Borders:InsideLineStyle := wdLineStyleNone

otb2:Select()
oWord:Selection:Cells:VerticalAlignment := wdCellAlignVerticalCenter

otb2:Rows:Item(1):Height := 18
otb2:Rows:Item(2):Height := 12
otb2:Rows:Item(3):Height := 12

otb2:Columns:Item(1):PreferredWidth := 50
otb2:Columns:Item(2):PreferredWidth := 400

__text := 'Cliente : '

otb2:Cell(1, 1):Range:Font:Name := "Arial"
otb2:Cell(1, 1):Range:Font:Size := 10
otb2:Cell(1, 1) := __text
otb2:Cell(1, 1):Range:Select()
oWord:Selection:MoveRight(wdCell,1)

__text := alltrim(cli->nome)
otb2:Cell(1, 2):Range:Font:Name := "Arial"
otb2:Cell(1, 2):Range:Font:Size := 10
otb2:Cell(1, 2) := __text
otb2:Cell(1, 2):Range:Select()
oWord:Selection:MoveLeft(wdCell,1)

__text := ''

otb2:Cell(2, 1):Range:Font:Name := "Arial"
otb2:Cell(2, 1):Range:Font:Size := 10

otb2:Cell(2, 1) := __text
otb2:Cell(2, 1):Range:Select()
oWord:Selection:MoveRight(wdCell,1)

__text := alltrim(cli->end) + ' - ' + alltrim(cli->bai)

__text += ' , ' + alltrim(cli->cid) + ' , ' + cli->uf
__text += ' - CEP : ' + alltrim(cli->cep)
otb2:Cell(2, 2):Range:Font:Name := "Arial"
otb2:Cell(2, 2):Range:Font:Size := 8
otb2:Cell(2, 2) := __text
otb2:Cell(2, 2):Range:Select()
oWord:Selection:MoveLeft(wdCell,1)

__text := 'Contato : '

otb2:Cell(3, 1):Range:Font:Name := "Arial"
otb2:Cell(3, 1):Range:Font:Size := 8
otb2:Cell(3, 1) := __text
otb2:Cell(3, 1):Range:Select()
oWord:Selection:MoveRight(wdCell,1)

__text := alltrim(cli->contato)
otb2:Cell(3, 2):Range:Font:Name := "Arial"
otb2:Cell(3, 2):Range:Font:Size := 8
otb2:Cell(3, 2) := __text
otb2:Cell(3, 2):Range:Select()
oWord:Selection:Collapse(wdCollapseEnd)

* Blank Line

opr4 := odoc:Paragraphs:Add()  //  paragrafo 4
rng4 := opr4:Range
rng4:Select()
oWord:Selection:Collapse(wdCollapseEnd)

* Order Table Instruction and Button

opr5 := odoc:Paragraphs:Add()  //  paragrafo 5
rng5 := opr5:Range

otb3 := odoc:Tables:Add(rng5, 1, 2)
otb3:Select()
oWord:Selection:Cells:VerticalAlignment := wdCellAlignVerticalCenter

otb3:Borders:OutsideLineStyle := wdLineStyleNone
otb3:Borders:InsideLineStyle := wdLineStyleNone

otb3:Rows:Item(1):Height := 16

otb3:Columns:Item(1):PreferredWidth := 350
otb3:Columns:Item(2):PreferredWidth := 100

__mens := 'Eventuais altera‡äes de quantidades podem ser feitas na
Col. "Qtde. Alt.".'
__mens += chr(13) + chr(10)
__mens += 'Em caso de altera‡äes, para atualizar Tab. Pedido basta
clicar botÆo "Atualizar Pedido".'
__mens := hb_oemtoansi(__mens)
otb3:Cell(1, 1):Range:Font:Name := "Arial"
otb3:Cell(1, 1):Range:Font:Size := 8
otb3:Cell(1, 1):Range:Font:Bold := wdToggle
otb3:Cell(1, 1) := __mens
otb3:Cell(1, 1):Range:Select()
oWord:Selection:MoveLeft(wdCell,1)

* Command Button Def.
rngb := otb3:Cell(1, 2):Range
rngb:Select()
oWord:Selection:ParagraphFormat:Alignment := wdAlignParagraphRight

obot := rngb:InLineshapes:AddOLEControl("Forms.CommandButton.1")

ocmd := obot:OLEFormat:Object
ocmd:Font:Name := "Verdana"
ocmd:Font:Size := 9
ocmd:Caption := " Atualizar Pedido "
ocmd:ForeColor := "&H808000"
ocmd:BackColor := "&HC0FFFF"
ocmd:AutoSize := .t.

* Command Button "on click" Sub

scode := 'Private Sub CommandButton1_Click()' + chr(13) + chr(10)
scode += 'Word.ActiveDocument.UnProtect("hu")' + chr(13) + chr(10)
scode += 'Word.ActiveDocument.Tables.Item(4).Columns.Item(7).Select' +

chr(13) + chr(10)
scode += 'Selection.Fields.Update' + chr(13) + chr(10)
scode += 'Selection.Collapse(wdCollapseEnd)' + chr(13) + chr(10)
scode += 'Word.ActiveDocument.Protect Type:=
wdAllowOnlyFormFields,NoReset:=True,Password:="hu"' + chr(13) + chr

(10)
scode += 'End Sub'

scode := hb_oemtoansi(scode)
odoc:VBProject:VBComponents:Item(1):CodeModule:AddFromString(scode)
oWord:Selection:Collapse(wdCollapseEnd)

* Linha em branco
opr6 := odoc:Paragraphs:Add()  //  paragrafo 6
rng6 := opr6:Range
rng6:Select()
oWord:Selection:Collapse(wdCollapseEnd)

* Order Table Header array
vcab := {}
aadd(vcab,'Codigo Mercado')  //  esquerda
aadd(vcab,'Marca')           //  centro
aadd(vcab,'FOB US$')         //  direita
aadd(vcab,'Qtde.')           //  direita
aadd(vcab,'Total US$')       //  direita
aadd(vcab,'Qtde. Alt.')      //  direita
aadd(vcab,'Total Alt. US$')  //  direita

* Order Table Def.
oprA := odoc:Paragraphs:Add()  //  paragrafo 10 , Tab3
rngA := oprA:Range

* Definicao linhas e colunas tabela
nrow := len(vtbl)
ncol := len(vcab)
*                            1 linha cab.
*
otb4 := odoc:Tables:Add(rngA,nrow+1,ncol)
otb4:Borders:OutsideLineStyle := wdLineStyleSingle
otb4:Borders:InsideLineStyle := wdLineStyleSingle
otb4:Select()
oWord:Selection:Cells:VerticalAlignment := wdCellAlignVerticalCenter

* Order Table Header

for ic = 1 to ncol
    __text := vcab[ic]
    otb4:Cell(1,ic):Range:Font:Name := "Arial"
    otb4:Cell(1,ic):Range:Font:Size := 9
    otb4:Cell(1,ic):Range:Font:Bold := wdToggle
    otb4:Cell(1,ic) := __text
    otb4:Columns:Item(ic):Select()
    if     ic = 1
           otb4:Columns:Item(ic):PreferredWidth := 100
           oWord:Selection:ParagraphFormat:Alignment :=
wdAlignParagraphLeft
    elseif ic = 2
           otb4:Columns:Item(ic):PreferredWidth := 50
           oWord:Selection:ParagraphFormat:Alignment :=
wdAlignParagraphCenter
    else
           otb4:Columns:Item(ic):PreferredWidth := 70
           oWord:Selection:ParagraphFormat:Alignment :=
wdAlignParagraphRight
    endi
    oWord:Selection:Collapse(wdCollapseEnd)
next

* Order Table

for i = 1 to nrow
    for j = 1 to ncol
        otb4:Cell(i+1,j):Range:Font:Name := "Courier New"
        otb4:Cell(i+1,j):Range:Font:Size := 8

        if j <= ncol-2
           __text := vtbl[i,j]
           otb4:Cell(i+1,j) := __text
        elseif j = ncol-1
           crng := otb4:Cell(i+1,j):Range

           odoc:FormFields:Add(crng,wdFieldFormTextInput)
        else
           formula := "="
           formula += "C" + alltrim(tran(i+1,'999'))
           formula += "*"
           formula += "F" + alltrim(tran(i+1,'999'))
           otb4:Cell(i+1,j):Formula(formula,"0,00")
        endi
    next
next
*
otb4:Cell(nrow+1,ncol):Range:Select()
oWord:Selection:Collapse(wdCollapseEnd)

oWord:ActiveDocument:Protect(wdAllowOnlyFormFields,.t.,"hu")
inkey(0)

odoc:SaveAS("C:\test\test.doc")

odoc:Close()
oWord:Quit()

return NIL


Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 4609
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 161 vezes
Mens.Curtidas: 253 vezes

gerar arquivos em word usando harbour

Mensagempor Itamar M. Lins Jr. » 30 Mai 2013 00:22

Colocar imagem.
I am attempting to insert an image (picture file) into a table cell in a
word document programatically.

The code I have thus far is :
**************************
local oWord, oDoc, oRng, oTbl, oCel
if ( oWord := createobject("Word.Application") ) != nil
   oWord:Visible := .f.
   oDoc := oWord:Documents:Add()
   oRng := oDoc:Range(0,1)
   oTbl := oDoc:Tables:Add(oRng,3,3)
   oCel := oTbl:Cell(2,2)

*    need to Insert image into oCel here

   oDoc:Close()
endif
Thanks for any suggestions

Gene
***************************

Try

oDoc:InlineShapes:AddPicture( "your image with full path", .F., .T.,
oCel:Range )

Thank you Enrico! Worked great!

Regards,
Gene



Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 4609
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 161 vezes
Mens.Curtidas: 253 vezes

gerar arquivos em word usando harbour

Mensagempor Itamar M. Lins Jr. » 30 Mai 2013 00:30

Eu tentaria primeiro usar HTML, porém cada caso é um caso.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 4609
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 161 vezes
Mens.Curtidas: 253 vezes

gerar arquivos em word usando harbour

Mensagempor Hasse » 30 Mai 2013 21:18

Boa noite colegas.

Eu faço assim:
1)-Gero um documento padrão no MS-Word e gravo no formato RTF;
2)-Neste documento crio macro-variáveis, algo como "#c_Nome#", "#c_Endereco#", etc.;
3)-Estas macro-variáveis serão substituídas pelo aplicativo;
3)-A aplicativo lê este arquivo padrão, faz a substituição das macro-variáveis, grava o arquivo como outro nome;
4)-Dispara o Word e carrega o arquivo;
5)-O usuário pede ler, alterar, imprimir o arquivo segundo a sua necessidade.

Se houver interesse posso avançar no assunto.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar de usuário

Hasse
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 789
Data de registro: 19 Out 2004 10:30
Cidade/Estado: Jaraguá do Sul - SC
Curtiu: 0 vez
Mens.Curtidas: 22 vezes

gerar arquivos em word usando harbour

Mensagempor Pablo César » 31 Mai 2013 08:17

Hasse escreveu:Se houver interesse posso avançar no assunto.
Sim claro, é muito bom ver exemplos.

Foi a primeira sugestão que dei quando explicava o que o Itamar tinha dito. Mas deve funcionar muito bem, não é ? E isso até dá pra fazer em puro Clipper.
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.
Avatar de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5539
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 151 vezes

gerar arquivos em word usando harbour

Mensagempor Hasse » 31 Mai 2013 14:19

Boa tarde Pablo.

O teu desejo é uma ordem para mim (rsrsrsrsrs)....
Acima de tudo é um prazer e uma honra poder contribuir.

Abaixo o PRG, muito simples...

*
*
*==================================================================================================
FUNCTION Main()                                 //  PRT_CBSUL()
*
SET DATE FORMAT TO "DD/MM/YYYY"
SET EPOCH TO 1901
*
REQUEST HB_CODEPAGE_PT850
HB_SetCodePage( "PT850" )
*
REQUEST DBFCDX
RddSetDefault("DBFCDX")
*
c_Arq1 := "_Contrato_CBSUL_01.rtf"                                        // c_ServPath + "\_Contrato_CBSUL_01.rtf"
c_Arq2 := "_Contr_CBSUL.rtf"                                              // c_LocalPath + "\_Contr_CBSUL.rtf"
c_Data := DtoC( Date() )
*
IF File( c_Arq1 )
   FileCopy( c_Arq1, c_Arq2 )
   SetFAttr( c_Arq2, 0 )
   c_Contrato := MemoRead( "_Contrato_CBSUL_01.rtf" )
ELSE
   Alert( 'O arquivo "_Contr_CBSUL.rtf" est  faltando no servidor. ;;Verifique !!!;;' +;
          'ImpressÆo cancelada.')
   RETURN( NIL )
ENDIF
*
c_NomDev  := "Edson Machado da Silva Borges Medina"               // ALLTRIM( CADASTRO->NOME )
c_CpfCnpj := "111.222.333/0001-44"                                // ALLTRIM( CADASTRO->CGC_CPF )
c_Ident   := "5.666.777-8"                                        // ALLTRIM( CADASTRO->IDENT )
*
IF EMPTY( c_CpfCnpj )
   ALERT( 'Falta o CPF/CNPJ do cliente ;== ' + c_NomDev + ' ==;Providenciar;;EmissÆo do Contrato Cancelado.' )
   RETURN( .F. )
ENDIF
*
IF EMPTY( c_Ident ) .AND. "CPF-" $ c_CpfCnpj
   ALERT( 'Falta a IDENTIDADE do cliente ;== ' + c_NomDev + ' ==;  Providenciar;;EmissÆo do Contrato Cancelado.' )
   RETURN( .F. )
ENDIF
*
c_NomDev   := HB_OemToAnsi( c_NomDev )
c_CpfCnpj  := STRTRAN( c_CpfCnpj, "CPF-", "" )
*
c_Contrato := STRTRAN( c_Contrato, "#@NomDev@#",    c_NomDev )
c_Contrato := STRTRAN( c_Contrato, "#@NumCPF@#",    c_CpfCnpj )
c_Contrato := STRTRAN( c_Contrato, "#@NumIdent@#",  c_Ident )
c_Contrato := STRTRAN( c_Contrato, "#@DtContr@#",   c_Data )
*
MemoWrit( "_Contr_CBSUL.rtf", c_Contrato )
*
cRoda2 := 'START "C:\Arquivos de programas\Microsoft Office\OFFICE11\winword.exe" _Contr_CBSUL.rtf'
*
RUN( cRoda2 )
*
RETURN( NIL )

Adaptei o PRG acima para ser usado em qualquer pasta que seja gravado.

Para facilitar substituí a leitura do arquivo DBF por variáveis fixas, para ser testado sem qualquer modificação. Ali podem ser implantadas tantas variáveis quantas forem necessárias. Tenho rotinas onde são substituídas mais de 50 variáveis no mesmo RTF. Tenho um onde substituo um trecho do próprio texto, o que afinal é a mesma coisa.

Eu tenho o arquivo RTF em pasta à parte, por isso uso variáveis para definir os caminhos. Aqui cada qual pode manusear da forma como lhe aprouver.

Baixar o arquivo RTF que está no Anexo e gravar na mesma pasta.

Observar que o arquivo "_Contrato_CBSUL_01.rtf" é lido e arquivado na memória na variável c_Contrato, e após devidamente trabalhado, é gravado como "_Contr_CBSUL.rtf" que, por sua vez, é encaminhado para o MS-Word para ser lido.

O arquivo "_Contrato_CBSUL_01.rtf", que é o original e não deve ser alterado. Recomendo que seja travado com propriedade "só leitura" para evitar que seja apagado ou sobre-gravado por descuido.

Compilar, sem qualquer LIB adicional.

Rodar...... e, voilá... O Contrato devidamente preenchido está aberto no MS-Word em questão de poucos segundos.

Vantagens: Temos SEMPRE o texto formatado e justificado, independente do número de variáveis substituídas e do tamanho dessas variáveis. O MS-Word trata deste assunto sem que se precise preocupar com o assunto.
Como o colega Pablo mencionou, pode ser rodado em Clipper puro.
Anexos
_Contrato_CBSUL_01.rtf
(12.73 KiB) Baixado 723 vezes
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar de usuário

Hasse
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 789
Data de registro: 19 Out 2004 10:30
Cidade/Estado: Jaraguá do Sul - SC
Curtiu: 0 vez
Mens.Curtidas: 22 vezes

Próximo



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Google [Bot] e 4 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro