Manipular dados no Microsoft Word com Delphi


 

Em algumas aplicações necessitamos adicionar imagens dentro de documentos como, contratos, recibos, certificados entre outros. Para este tipo de necessidade utilizamos algumas ferramentas nativas do Windows, neste caso o Microsoft Word, porém para os desenvolvedores o mais funcional é tornar esta manipulação automatizada, ou seja, nossa aplicação fica responsável por realizar as devidas mudanças em nossos documentos.

 

Nesta dica vamos mostrar como criar arquivos do Word pelo Delphi além de inserir e substituir imagens e textos.

 

Inicialmente nossa tela principal ficará parecida com a imagem abaixo:
               

Imagem 1 – Tela Principal.

 

Dentro deste exemplo teremos 4 dicas básicas ,como podemos observar na imagem.

 

Os exemplos são:

 

Exemplo 1:

Criar o arquivo do Word com textos e Imagens.
Exemplo 2:

Buscar a palavra e substituir por outra.
Exemplo 3:

Inserir uma imagem no parágrafo indicado.
Exemplo 4:

Buscar a palavra e substitui pela imagem.

 

Dito isto vamos iniciar com a criação do arquivo Word, mas antes declare as variáveis e as Uses que vamos utilizar no decorrer do exemplo, conforme listagem abaixo:

 

Uses
ComObj, ClipBRD;

Var
Path: string;
Word, Arquivo, Doc: OleVariant;
Clip: Integer;

 

Listagem 1 – Uses e Variáveis.

 

Com as variáveis e “Uses” indicadas vamos para o código de criação do arquivo conforme listagem abaixo:              

 

Procedure TForm1.btnCriarClick(Sender: TObject);
var
  Word: Olevariant;
begin
  Path := ExtractFilePath(Application.ExeName);
  Word := CreateOleObject('Word.Basic');
  Word.Filenew;
  Word.AppShow;
  Word.Appmaximize;
  Word.CenterPara;
  Word.FontSize(36);
  Word.Bold;
  Word.Underline;
  Word.Insert('Documento');
  Word.FontSize(16);
  Word.Insert(#13 + 'The - Club');
  Word.FontSize(12);
  Word.Underline(false);
  Word.Bold(false);
  Word.Insert(#13 + 'Exemplo para Anexar Imagem');
  Word.Insert(#13'Imagem 1'#13);
  Word.Insertpicture(Path + '\Imagem1.jpg');
  Word.Insert(#13'Imagem 2'#13);
  Word.Insertpicture(Path + '\Imagem2.jpg');
end;

Listagem 2 – Criar Documento com Texto e Imagens.

 

Como podemos observar realizamos a criação da variável OleVariant (Word) que será nosso documento propriamente dito, portanto, passamos todos as configurações como, fonte, tamanho e também nossas imagens para que tudo seja inserido no arquivo. Se tudo correr bem o arquivo deve ficar conforme imagem 2.

Imagem 2 – Documento Criado.

 

Após a criação do arquivo podemos realizar algumas manipulações, como, substituir uma determinada palavra ou imagem.

Na listagem abaixo vamos demonstrar como realizar a substituição de uma palavra.

 

Procedure TForm1.btnSubstituirClick(Sender: TObject);
var
  Ponteiro: integer;
begin
  try
    Cursor := crHourGlass;
    Word := CreateOleObject('Word.Application');
    Word.Visible := True;
    Arquivo := Word.Documents;
    Doc := Arquivo.Open(extractfilepath(application.exename) + '\Word.doc');
    Ponteiro := -1;
    while Ponteiro <> 0 do
    begin
      Ponteiro := doc.Content.Find.Execute(edtLocalizar.Text, ReplaceWith := edtSubstituir.Text);
    end;
  finally
    Cursor := crDefault;
  end;
end;

Listagem 3 – Substituir Palavra.
 

Imagem 3 – Exemplo 2

 

Veja que ao clicar no botão “Substituir Palavra” o documento é exibido, e após isso o comando “Find.Execute” faz a busca pelo trecho indicado em nosso campo Localizar. Quando encontramos o valor, ele fica indicado pelo nosso cursor, com isso utilizamos o comando “ReplaceWith” que irá receber o valor passado em nosso campo Substituir e inserir no lugar do trecho encontrado.

Em nosso terceiro exemplo podemos incluir imagens seguindo o parágrafo do arquivo, abaixo segue a listagem do botão “Incluir Imagem”:

 

procedure TForm1.btnIncluirClick(Sender: TObject);
var
  Paragrafo: OleVariant;
  Linha: Integer;
begin
  Try
    Linha := StrToInt(edtLinha.Text);
    Cursor := crHourGlass;
    Word := CreateOleObject('Word.Application');
    Word.Visible := True;
    Arquivo := Word.Documents;
    Doc := Arquivo.Open(extractfilepath(application.exename) + '\Word.doc');
    // Passo o Paragrafo Paragrafo
    Paragrafo := Doc.Paragraphs.Item(Linha).Range;
    Try
      // Mude o endereço da Imagem para Testar
Doc.Content.InlineShapes.AddPicture('C:\Users\Imagem1.jpg', LinkToFile := False, SaveWithDocument := True, Range := Paragrafo);
    Except on E: Exception do
      begin
        ShowMessage('Falha ao localizar Imagem');
      end;
    end;
  Finally
    Cursor := crDefault;
  end;
end;

Listagem 4 – Incluir Imagem no Parágrafo.

 

Imagem 4 – Exemplo 3

 

O foco do exemplo está no parâmetro “Range” que irá indicar a posição dentro do nosso documento. Para este caso criamos a variável “Paragrafo” que irá receber a posição da linha que passamos em nosso campo “Linha” e inserir a imagem no parágrafo indicado.

Para finalizar vamos criar uma rotina para inserir a imagem seguindo o texto digitado.
No desenvolvimento deste exemplo vamos utilizar a área de transferência do Windows, ou seja, o objeto TClipBoard. Incialmente vamos utilizar um ‘SpeedButton’ para selecionarmos a imagem. Listagem abaixo mostra a codificação do botão “Add...”.

 

Procedure TForm1.sbtnAddClick(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    Image1.Picture.LoadFromFile(OpenDialog1.FileName);
    Panel1.Caption := ' ';
  end;
end;

Listagem 5 – Adicionar Imagem no TImage.

 

                                                                  

Imagem 5 – Exemplo 4.

               

A imagem selecionada é inserida em nosso componente TImage, assim fica mais fácil para o usuário visualizar o que estamos manipulando, com isso já podemos carrega-la em nossa área de transferência. Abaixo listagem para adicionar a imagem em nosso ClipBoard.

 

procedure TForm1.btnClipClick(Sender: TObject);
var
  Bitmap: TBitMap;
begin
  try
    Bitmap := Image1.Picture.Bitmap;
    Clipboard.Assign(Bitmap);
    Image1.Picture.Assign(Clipboard);
    Clip:= 1;
  finally
  end;
end;

Listagem 6 – Adicionar Imagem no ClipBoard.

 

Veja que já adicionamos a imagem ao nosso ClipBoard e já podemos utiliza-la. Outro ponto importante está na variável “Clip” que recebe o valor ‘1’, ela será utilizada para criação de uma rotina de ativação dos botões, mas isso será tratado mais a frente.

Na listagem abaixo utilizamos o comando “Word.Selection.Find.Execute(edtPalavra.Text)” para atribuir o cursor na palavra que indicamos, assim o comando “Word.Selection.Paste” irá colar nossa imagem no local da palavra, abaixo listagem de exemplo:
 

Procedure TForm1.btnSubstituirimagemClick(Sender: TObject);
begin
  try
    Cursor := crHourGlass;
    Word := CreateOleObject('Word.Application');
    Word.Visible := True;
    Arquivo := Word.Documents;
    Doc := Arquivo.Open(extractfilepath(application.exename) + '\Word.doc');
    Word.Selection.Find.Execute(edtPalavra.Text);
    Word.Selection.Paste;
    ShowMessage('Alteração Concluída');
  Except on E: Exception do
    begin
      ShowMessage('Falha ao colar Imagem');
    end;
  end;
end;

Listagem 7 – Substituir palavra por Imagem.

 

Imagem 6 – Imagem Confirmar.

               

Veja que quando é feita a inserção o documento do Word é exibido com a Imagem já adicionada, neste caso se houver a necessidade de adicionarmos uma nova imagem nesse arquivo vamos utilizar o botão “Outro” que realiza apenas a busca pela palavra indicada. Abaixo listagem do botão.

 

procedure TForm1.btnOutroClick(Sender: TObject);
begin
  Try
    Word.Selection.Find.Execute(edtPalavra.Text);
    Word.Selection.Paste;
    ShowMessage('Alteração Concluída');
  Except on E: Exception do
    begin
      ShowMessage('Arquivo Word não encontrado');
    end;
  end;
end;

Listagem 8 – Botão Outro

 

     Neste caso o arquivo deve estar sendo exibido para que a inclusão ocorra com sucesso. Na imagem 7 podemos visualizar como a ação é executada. Adicionamos um novo arquivo (.bmp) ao nosso TImage e indicamos a nova palavra a ser substituída no “edtPalavra”.

Imagem 7 – Adicionando outra Imagem.

 

Imagem 8 – Imagem Cancelar.

               

Como havia comentado anteriormente a variável “Clip” será utilizada para a criação de uma rotina de ativação dos botões, no qual tem a finalidade de evitar erros no decorrer da aplicação.
               

Quando nossa aplicação é finalizada passamos o valor zero para a variável “Clip” e limpamos a área de transferência, assim nosso controle de botões poderá identificar quando temos algum dado em nosso “ClipBoard”. Abaixo listagem do evento “Onclose” e botão “Del...”.
 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Clipboard.Clear;
  Clip:= 0;
end;

Listagem 9 - OnClose
 

 

procedure TForm1.sbtnDelClick(Sender: TObject);
begin
  Clipboard.Clear;
  Clip:= 0;
end;

Listagem 10 – Botão “Del...”

 

                Para a criação da rotina dos botões utilizamos um Timer que irá verificar determinadas ações que vamos definir para poder ativar ou não nossos botões.
               

Procedure TForm1.Timer1Timer(Sender: TObject);
begin
  btnSubstituirimagem.Enabled:= (edtPalavra.Text <> '') and (Clip = 1);
  btnOutro.Enabled:= (btnSubstituirimagem.Enabled) and (Clip = 1);
  btnClip.Enabled:= Image1.Picture.Bitmap.Empty = False;
  sbtnDel.Enabled:=  Clip = 1;
  btnSubstituir.Enabled:= (edtSubstituir.Text <> '') and (edtLocalizar.Text <> '');
  btnIncluir.Enabled:= edtLinha.Text <> '';
end;

Listagem 11 - Timer

 

Conclusão

               

Neste artigo vimos algumas das muitas formas de integrar o Delphi com componentes externos. O uso da classe Variant auxilia na manipulação de objetos de automação que em nosso caso se tratam de arquivos do Word. Portanto, podemos utilizar este e outros exemplos como base para implementar nossos projetos.
               
                Bom é isso pessoal, espero que tenham gostado e até a próxima!

 

Jeferson Silva de Lima

 

 

Sobre o Autor

Jeferson Silva de Lima Consultor The Club..

E-mail: suporte@theclub.com.br

The Club - O Maior Clube de programadores do Brasil