Da tabela pro Word

Delphi

28/08/2006

seguindo o exemplo que o nosso amigo aroldo zanella disponibiliza no topico: http://forum.clubedelphi.net/viewtopic.php?t=26984&highlight=word2k

estou tentando implementar para minha necessidade...

Estrutura montada do meu documento:

---------------------------------------------------------------------------------
NOME | FONE | CIDADE |
---------------------------------------------------------------------------------
@02 | @03 | @04
---------------------------------------------------------------------------------

o que eu preciso é o seguinte:


1. pega o primeiro registro da tabela,
2. joga os dados nas colunas que estão as variáveis,
3. vai para o proximo registro da tabela,
4. simula um tab no documento do word,
5. cria novas variaveis nas respectivas colunas,
6. joga os dados da tabela nas variaveis
7. repete os passos 3,4,5,6 até que a tabela chegue no final


O que eu fiz (porém nao acontece o passo 7 acima descrito, que é o que eu mais preciso):

var Doc: Variant;
Evento: string;
begin
Evento:=inputbox(´Evento´,´Evento:´,Uppercase(´´));

// Diretorio
DM.Tbl_Eventos.Close;
DM.Tbl_Eventos.SelectSQL.Clear;
DM.Tbl_Eventos.SelectSQL.add(´SELECT * FROM Eventos WHERE EVENTO = :Consulta ´);
DM.Tbl_Eventos.Params[0].AsString;
DM.Tbl_Eventos.ParamByName(´Consulta´).AsString:=Uppercase(Evento);
DM.Tbl_Eventos.open;

if Uppercase(Evento) = DM.Tbl_EventosEVENTO.AsString then
begin

Word2k := CrieObjeto(´Word.Application´);
Doc := Word2k.Documents.Open(ExtractFilePath(Application.ExeName)+´\Doctos\Eventos.doc´);

Doc.Content.Find.Execute(FindText := ´@01´, ReplaceWith := Uppercase(Evento));

DM.Tbl_Eventos_E.First;
while not DM.Tbl_Eventos_E.Eof do
begin
Doc.Content.Find.Execute(FindText := ´@02´, ReplaceWith := DM.Tbl_Eventos_ENOME.Value);
Doc.Content.Find.Execute(FindText := ´@03´, ReplaceWith := DM.Tbl_Eventos_EFONE.Value);

DM.Tbl_Cidade.Close;
DM.Tbl_Cidade.SelectSQL.Clear;
DM.Tbl_Cidade.SelectSQL.Add(´select * from cidade where codigo=´+DM.Tbl_Eventos_ECODIGO_CIDADE.AsString);
DM.Tbl_Cidade.Open;

Doc.Content.Find.Execute(FindText := ´@04´, ReplaceWith := DM.Tbl_CidadeNOME.Value);
DM.Tbl_Eventos_E.Next;
end;

Word2k.Visible := true;
            
end
else
ShowMessage(´Evento não existe. Verifique se você digitou´ +#13+ ´o nome do Evento exatamente como ele está´ +13+ ´cadastrado.´);
end;



se alguem puder me ajudar com isso, creio que seja de utilidade para todos....

Obs:
Banco: Firebird 1.5.3
Delphi: 7
Office: 2003

abraços!


Mahdak

Mahdak

Curtidas 0

Respostas

Mahdak

Mahdak

28/08/2006

só pra complementar... se alguem tiver duvidas de como é a estrutura do documento no word disponibilizo uma cópia dele no respectivo link:

http://xokleng.up.md/downloads/Eventos.doc


A simulação do tab que eu descrevi acima é por que no documento do word as variaveis estao dentro de uma tabela, assim sendo depois de jogar os dados na variavel da ultima coluna o Tab significaria a criação de uma nova linha


abraços!


GOSTEI 0
Mahdak

Mahdak

28/08/2006

qualquer sugestão ou aprimoramento será bem vindo, mas assim ja ta funcionando tranquilo aqui...

abração!

consegui resolver da seguinte maneira:


procedure TPrincipal.PessoasdeumEvento2Click(Sender: TObject);
var Doc: Variant;
Evento: string;
begin
    Evento:=inputbox(´Evento´,´Evento:´,Uppercase(´´));

    // Diretorio
    DM.Tbl_Eventos.Close;
    DM.Tbl_Eventos.SelectSQL.Clear;
    DM.Tbl_Eventos.SelectSQL.add(´SELECT * FROM Eventos WHERE EVENTO = :Consulta ´);
    DM.Tbl_Eventos.Params[0].AsString;
    DM.Tbl_Eventos.ParamByName(´Consulta´).AsString:=Uppercase(Evento);
    DM.Tbl_Eventos.open;

    if Uppercase(Evento) = DM.Tbl_EventosEVENTO.AsString then
    begin

        Doc := CreateOleObject(´Word.Application´);

        { Novo documento }
        doc.Documents.Add;

        doc.Selection.TypeText(Text := ´EVENTO: ´+Uppercase(Evento)); {Escreve o nome do evento}


        doc.ActiveDocument.Tables.Add(
        Range := doc.Selection.Range,
        NumRows := 2,
        NumColumns := 3);

        doc.Selection.TypeText(Text := ´NOME:´); { Escreve na primeira célula }
        doc.Selection.MoveRight(12); { Próxima célula }

        doc.Selection.TypeText(Text := ´FONE:´); { Escreve }
        doc.Selection.MoveRight(12);

        doc.Selection.TypeText(Text := ´CIDADE:´); { Escreve }
        doc.Selection.MoveRight(12);


        DM.Tbl_Eventos_E.First;
        while not DM.Tbl_Eventos_E.Eof do
        begin
            Doc.Selection.TypeText(Text := DM.Tbl_Eventos_ENOME.AsString);
            Doc.Selection.MoveRight(12);

            Doc.Selection.TypeText(Text := DM.Tbl_Eventos_EFONE.AsString);
            Doc.Selection.MoveRight(12);

            DM.Tbl_Cidade.Close;
            DM.Tbl_Cidade.SelectSQL.Clear;
            DM.Tbl_Cidade.SelectSQL.Add(´select * from cidade where codigo=´+DM.Tbl_Eventos_ECODIGO_CIDADE.AsString);
            DM.Tbl_Cidade.Open;

            Doc.Selection.TypeText(Text :=DM.Tbl_CidadeNOME.AsString);
            Doc.Selection.MoveRight(12);
            
            DM.Tbl_Eventos_E.Next;
        end;

        //doc.Selection.Tables.Item(1).Select; { Seleciona a 1º tabela }
        doc.Selection.Cells.AutoFit; { auto-formata }

        Doc.visible := true;
        end
        else
            ShowMessage(´Evento não existe. Verifique se você digitou´ +#13+ ´o nome do Evento exatamente como ele está´ +13+ ´cadastrado.´);
end;



GOSTEI 0
Joaoshi

Joaoshi

28/08/2006

Colega, você consegue selecionar uma tabela (ja existente no documento do word) e escrever dados do DataSet nela? Como?

Obrigado.


GOSTEI 0
Mahdak

Mahdak

28/08/2006

Colega, você consegue selecionar uma tabela (ja existente no documento do word) e escrever dados do DataSet nela? Como? Obrigado.


da uma olhadinha nesse tópico: http://forum.clubedelphi.net/viewtopic.php?t=26984&highlight=word2k

o amigo aroldo zanella disponibiliza um exemplo que realiza exatamente o que voce quer... trabalhando com constantes dentro da tabela criada no word e importando os dados da tabela e substituindo pelas constantes...


GOSTEI 0
Joaoshi

Joaoshi

28/08/2006

Obrigado pela resposta.

Já tinha visto o topico do Aroldo Zanela (show de bola), mas o que faltou foi uma forma de preencher uma tabela no word (tabela já existente).
No seu topico anterior tem uma linha [b:1a5ab7d650]//doc.Selection.Tables.Item(1).Select; { Seleciona a 1º tabela }[/b:1a5ab7d650], que imagino selecionaria uma tabela, mas não consegui executar no delphi.
Se tiver alguma dica, agradeço.


GOSTEI 0
Mahdak

Mahdak

28/08/2006

Obrigado pela resposta. Já tinha visto o topico do Aroldo Zanela (show de bola), mas o que faltou foi uma forma de preencher uma tabela no word (tabela já existente). No seu topico anterior tem uma linha [b:4fb5c66abb]//doc.Selection.Tables.Item(1).Select; { Seleciona a 1º tabela }[/b:4fb5c66abb], que imagino selecionaria uma tabela, mas não consegui executar no delphi. Se tiver alguma dica, agradeço.


joaoshi, doc.Selection.Tables.Item(1).Select; seleciona a tabela inteira, no mais de uma olhadinha nessa tabela que montei:

http://xokleng.up.md/downloads/Eventos.doc

Para preencher ela, trocando as constantes ´@x´ contidas nela, por dados da sua tabela, voce poderia fazer algo do tipo:

Declare na lista de uses: ComObj e ActiveX.

Public
function CrieObjeto(const ClasseNome: String): IDispatch;

var 
  Principal: TPrincipal; 
  Word2k: Variant; 

implementation 

uses Funcoes, Geral;






function TPrincipal.CrieObjeto(const ClasseNome: String): IDispatch; 
var Classifique_Id: TGUID; 
    Desconhecido: IUnknown; 
begin 
  Classifique_ID:=ProgIdToClassId(ClasseNome); 
  if Succeeded(GetActiveObject(Classifique_ID, nil, Desconhecido)) then 
    OleCheck(desconhecido.QueryInterface(Idispatch, Result)) 
  else 
    Result:=CreateOleObject(ClasseNome); 
end;


procedure TPrincipal.btnGeraClick(Sender: TObject);
var Doc: Variant;  
begin 

// faz um select qualquer na tabela 
DM.Tbl_Eventos.Close; 
DM.Tbl_Eventos.SelectSQL.Clear; 
DM.Tbl_Eventos.SelectSQL.add(´SELECT * FROM Eventos where codigo = 1´); 
DM.Tbl_Eventos.open; 


Word2k := CrieObjeto(´Word.Application´); 
Doc := Word2k.Documents.Open(ExtractFilePath(Application.ExeName)+´\Doctos\Eventos.doc´); 

{ Substitui as constantes ´@0X´ do .doc, por dados da sua Table }

Doc.Content.Find.Execute(FindText := ´@01´, ReplaceWith := DM.Tbl_EventosEVENTO.AsString); 

Doc.Content.Find.Execute(FindText := ´@02´, ReplaceWith := DM.Tbl_EventosNOME.Value); 

Doc.Content.Find.Execute(FindText := ´@03´, ReplaceWith := DM.Tbl_EventosFONE.Value); 

Doc.Content.Find.Execute(FindText := ´@04´, ReplaceWith := DM.Tbl_EventosCIDADE.Value); 

{****************************************************}

// mostra o documento
Word2k.Visible := true; 
            
end; 



espero ter ajudado...


GOSTEI 0
Mahdak

Mahdak

28/08/2006

só para complementar

Doc := Word2k.Documents.Open(ExtractFilePath(Application.ExeName)+´\Doctos\Eventos.doc´);

a linha acima quer dizer que voce tem que jo o .doc que ta no link abaixo na pasta ´Doctos\´, ou seja, ´C:\seu programa\doctos\Eventos.doc´, isso contando que o seu executável está na pasta ´seu programa´ por exemplo

http://xokleng.up.md/downloads/Eventos.doc


boa sorte!


GOSTEI 0
POSTAR