Em aplicações práticas, o autor descobriu que o conteúdo do relatório raramente muda, mas o formato da fonte e o layout mudam frequentemente, e às vezes os usuários não desejam modificar o conteúdo real do banco de dados, mas desejam alterar o conteúdo do relatório para determinadas necessidades. Se você usar o ReportSmith, poderá resolver o primeiro problema, mas não poderá fazer nada a respeito do último, e sua interface está em inglês, o que não é adequado para os usuários. Se você usar o componente de relatório TQReport na versão 3.0, nenhum dos dois poderá ser resolvido em tempo real e o código original deverá ser modificado e recompilado antes de poder ser usado. O uso do Word e do Excel pode superar completamente as deficiências acima. A implementação específica é a seguinte (tomando a implementação do Word como exemplo):
Primeiro, use o Word para editar o formato do relatório, definir o formato, substituir os itens de dados a serem gerados por campos de formulário e nomeá-los. Aqui assumimos temporariamente que existem campos de formulário Item1 e Item2 (ambos do tipo texto), salve este documento como um arquivo de modelo Exemplo.dot e proceda da seguinte forma:
1) Execute o Delphi3, adicione um componente TDdeClientCov no componente System definido como Form1, nomeie-o como DdeExample, defina seu ConnectMode como ddeManual (modo manual); defina DdeService como '(WinWord)';
2) Escreva um processo personalizado para ativar o Word, como segue:
Procedimento Tform1.WordActive(Cmds: TStrings);
var
WordPath: String;
começar
if(não DdeExample.OpenLink) então {determina se está vinculado dinamicamente}
começar
if(FindWindow('OpusApp', nil)=0) então
começar
WordPath := 'C:msofficewinword';
if(PalavraPath=') então
ShowMessage('O Word em chinês não está instalado ou o caminho não está definido, instale e configure a versão em chinês do Word.')
senão começar
DdeExample.ServiceApplication := WordPath+'Winword.exe';
if(DdeExample.OpenLink) então {se o comando da macro tiver sido vinculado dinamicamente}
DdeExample.ExecuteMacroLines(Cmds,Falso)
outro
ShowMessage('Não foi possível iniciar a versão chinesa do Word!');
DdeExample.ServiceApplication := 'WinWord.exe';
fim;
fim
senão comece {se o comando da macro tiver sido vinculado dinamicamente}
DdeExample.ExecuteMacroLines(Cmds,False);
fim;
fim
outro
DdeExample.ExecuteMacroLines(Cmds,falso);
fim;
Adicione o seguinte à área de declaração privada:
procedimento ActiveWord(Cmds: TStrings);
3) Adicione um botão Button1 ao Form1 e escreva o seguinte código em seu evento onclick:
procedimento TForm1.Button1Click(Remetente: TObject);
var
Cmds:TStringList;{Criar Cmds}
TempItem1,TempItem2:String;
começar
cmds:=TStringList.Create;
cmds.Limpar;
TempItem1:='Item de dados um';
TempItem2:='Item de dados dois';
com Cmds faça
começar
Claro;
Add('[FileNew.Template ="Example.Dot″]');{Abrir arquivo de modelo Exemplo.Dot}
Add('[AppMaximize]');{Maximizar documento}
Add('[SetFormResult "Item1",″'+TempItem1+'″]');{Passa os dados TempItem1 para o campo do formulário Item1}
Add('[SetFormResult "Item2","'+TempItem2+'"]);{Passe os dados TempItem2 para o campo do formulário Item2}
fim;
WordActive(DdeExample,Cmds);{Chamar processo personalizado}
Cmds.Free;{Liberar Cmds}
fim;
Execute este programa, clique em Button1, você verá que o Word foi iniciado e dois itens de dados aparecem na tela: item de dados um; Por fim, você pode modificar o formato e os dados deste relatório à vontade, pois este relatório não tem nada a ver com a aplicação específica.
Neste exemplo, o Word6 chinês ou o Word7 chinês é usado. Como os comandos de macro do Word97 foram alterados para instruções do Visual Basic, se você quiser usar o Word97 para implementá-los, altere os comandos de macro para os códigos correspondentes.
Este é um exemplo simples. Você pode usar a função de gravação de macro do Word para gravar mais macros (como gerar tabelas automaticamente, preencher texto, alterar fontes e outros comandos de macro) e conectá-las a várias tabelas no banco de dados e adicioná-las. para Cmds, por sua vez, você pode obter funções mais complexas de que necessita.