Fórum Da tabela pro Word #328142
28/08/2006
0
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
Curtir tópico
+ 0Posts
28/08/2006
Mahdak
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
28/08/2006
Mahdak
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
12/09/2006
Joaoshi
Obrigado.
Gostei + 0
12/09/2006
Mahdak
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
12/09/2006
Joaoshi
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
12/09/2006
Mahdak
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
12/09/2006
Mahdak
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
Clique aqui para fazer login e interagir na Comunidade :)