locked
Trabalhando com o Word no C# RRS feed

  • Pergunta

  •  

    Olá pessoal, estou tentando fazer o C# imprimir um word .doc só que trocando alguns paramentros do tipo @valor por um que o C# possa enviar.

    Resumindo, tenho um contrato e preciso imprimir ele com os campos especificos, ja tenho um arquivo do word modelo e só preciso preenche-lo com os dados.

     

    Igual a esse link

     

    http://www.linhadecodigo.com.br/Artigo.aspx?id=392

     

    só que este esta em VB.net

     

    Gostaria de um exemplo em C#..

     

    abraço a todos companheiros.

    sexta-feira, 30 de novembro de 2007 18:30

Respostas

  • Olá Poletini,

     

    há formas diferentes de se preencher um documento do Word com dados externos:

    a) Usar palavras-chaves e fazer Find/Replace;

    b) Usar MailMerge;

    c) Colocar bookmarks, localizá-los por código e passar algum conteúdo;

    d) Mapear com tags XML e gerar um arquivo de dados para fazer o preenchimento.

     

    Particularmente gosto mais das opções "b" e "d", mas como neste tópico estamos tratando a opção "a", segue código de exemplo que criei e testei aqui:

     

    Code Snippet

    using System;

    using System.Collections.Generic;

    using System.Text;

    using Word=Microsoft.Office.Interop.Word;

    namespace PreencherWord

    {

    class WordFill

    {

    public void PreencherPorReplace(string CaminhoDocMatriz)

    {

    //Objeto a ser usado nos parâmetros opcionais

    object missing=System.Reflection.Missing.Value ;

    //Abre a aplicação Word e faz uma cópia do documento mapeado

    Word.Application oApp=new Word.Application() ;

    object template = CaminhoDocMatriz; //@"C:\\Users\\Luiz\\Documents\\Visual Studio 2005\\Projects\\PreencherWord";

    Word.Document oDoc = oApp.Documents.Add(ref template , ref missing, ref missing, ref missing);

    //Troca o conteúdo de alguns tags

    Word.Range oRng= oDoc.Range(ref missing ,ref missing );

    object FindText = "[prmCor]";

    object ReplaceWith="azul";

    object MatchWholeWord = true;

    object Forward = false;

    oRng.Find.Execute( ref FindText , ref missing,ref MatchWholeWord , ref missing,ref missing,ref missing,ref Forward,

    ref missing,ref missing,ref ReplaceWith ,ref missing,ref missing,ref missing,ref missing,ref missing);

    oRng = oDoc.Range(ref missing, ref missing);

    FindText = "[prmModelo]";

    ReplaceWith = "Pajero";

    oRng.Find.Execute(ref FindText ,ref missing, ref MatchWholeWord ,ref missing,ref missing,ref missing,ref Forward,

    ref missing,ref missing,ref ReplaceWith ,ref missing,ref missing,ref missing,ref missing,ref missing);

    oApp.Visible = true;

    }

     

    }

    }

     

     

     

    Para chamar a função, o seguinte trecho pode ser usado:

     

    Code Snippet

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Text;

    using System.Windows.Forms;

    namespace PreencherWord

    {

    public partial class Form1 : Form

    {

    public Form1()

    {

    InitializeComponent();

    }

    private void button1_Click(object sender, EventArgs e)

    {

    try

    {

    WordFill clsWord = new WordFill();

    clsWord.PreencherPorReplace(Application.StartupPath + "\\TesteReplace.doc");

    }

    catch (Exception ex)

    {

    MessageBox.Show(ex.Message);

    }

    }

    }

    }

     

     

    Criei um documento matriz (TesteReplace.doc) na pasta debug do projeto (C:\Users\Luiz\Documents\Visual Studio 2005\Projects\PreencherWord\PreencherWord\bin\Debug) com o seguinte conteúdo:

    Cor: [prmCor]

    Modelo: [prmModelo]

     

    sábado, 26 de janeiro de 2008 23:32
    Moderador

Todas as Respostas

  • Ola,

     

    se você começar o trabalho, posso ajudar nos pontos em que tiver dúvida. Fazer inteiro aqui fica um pouco difícil por questao de tempo (e por não ser o objetivo do Fórum).

     

    Aqui tem um exemplo em C#:

    http://www.c-sharpcorner.com/UploadFile/mgold/CreatingandOpeningMicrosoftDocumentfrom.NETUsingCSharp11262005050939AM/CreatingandOpeningMicrosoftDocumentfrom.NETUsingCSharp.aspx

     

    • Sugerido como Resposta Farol segunda-feira, 23 de novembro de 2009 03:32
    sábado, 1 de dezembro de 2007 00:29
    Moderador
  • Leonardo,

    também estou a um tempo tentando fazer o mesmo que você e não consegui fazer,
    só consegui encontrar artigos que fazem isso com o VB.
    Uma pena que não tenha um artigo explicando pra C# (em português).
    sábado, 1 de dezembro de 2007 23:09
  • òtimo..valeu luiz, vou tentar..

    O problema que o link que vc me mandou é para criar um .DOC ou abrir..

    bom..no meu caso é ler um .doc e trocar os valores dentro dele por variaveis...

     

    Mas ok...vou começar a desenvolver algo...dai posto denovo
    segunda-feira, 3 de dezembro de 2007 10:54
  • Bom..tenho o Visual Studio 2008 e o Office 2007;

     

    Mas ja começei errado, fiz a referencia a

    Microsoft Word 10.0 Object Library

     

    e coloquei no load do meu form

    Word.ApplicationClass oWordApp = new Word.ApplicationClass();

    Bom..ja da erro

    Error 1 The type or namespace name 'Word' could not be found (are you missing a using directive or an assembly reference?) D:\Estudos\word2\word2\Form1.cs 22 13 word2

     

    estava seguindo esse exemplo, que é pra asp.net ..mas é C#

    http://www.codeproject.com/KB/aspnet/wordapplication.aspx

    --------------------------------------------------------------------------------------------------------------

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Linq;

    using System.Text;

    using System.Windows.Forms;

     

    namespace word2

    {

    public partial class Form1 : Form

    {

    public Form1()

    {

    InitializeComponent();

    }

    private void Form1_Load(object sender, EventArgs e)

    {

    Word.ApplicationClass oWordApp = new Word.ApplicationClass();

    }

    }

    }

    terça-feira, 4 de dezembro de 2007 12:50
  • bom..ja sei como solucionar.acho que aquela biblioteca não tava valida..sei lá.

     

    Add.

    Microsoft Word 12.0 Object Library

    e depois coloquei no using

    using Microsoft.Office.Core;

    using Microsoft.Office.Interop.Word;

     

    Até ai ja consigo criar um Word.

    mas eu não quero criar..quero editar..troca uma palavra por outra .

    como fazer ? não sei se é por macro..se é através de ler o word, e fazer um replace, se tem uma função mais fácil..

     

    terça-feira, 4 de dezembro de 2007 13:43
  • Olá,

     

    não é preciso usar macro. Use um objeto Find (ThisDocument.Range.Find). Este objeto tem as propriedades Text e Replacement (entre outras), e o método Execute.

     

    quarta-feira, 5 de dezembro de 2007 03:20
    Moderador
  • Prezado Senhor Leonardo
    Consegui este e-mail através do site da microsoft msnd.
    Vi que o senhor estrava com uma dúvida de como fazer para integrar o C# com o Word, onde o senhor possuia um documento pardrão e gostaria de trocar alguns valores passados pelo C#.
    Estou com o mesmo problema.
    Gostaria de saber se o senhor conseguiu resolver isto.
    Poderia me enviar a solução?
    Aguardo uma resposta, mesmo que negativa.
    Meu e-mail é bpoletini@uol.com.br
    Atenciosamente
    Ricardo
    quarta-feira, 23 de janeiro de 2008 21:37
  • Olá Poletini,

     

    há formas diferentes de se preencher um documento do Word com dados externos:

    a) Usar palavras-chaves e fazer Find/Replace;

    b) Usar MailMerge;

    c) Colocar bookmarks, localizá-los por código e passar algum conteúdo;

    d) Mapear com tags XML e gerar um arquivo de dados para fazer o preenchimento.

     

    Particularmente gosto mais das opções "b" e "d", mas como neste tópico estamos tratando a opção "a", segue código de exemplo que criei e testei aqui:

     

    Code Snippet

    using System;

    using System.Collections.Generic;

    using System.Text;

    using Word=Microsoft.Office.Interop.Word;

    namespace PreencherWord

    {

    class WordFill

    {

    public void PreencherPorReplace(string CaminhoDocMatriz)

    {

    //Objeto a ser usado nos parâmetros opcionais

    object missing=System.Reflection.Missing.Value ;

    //Abre a aplicação Word e faz uma cópia do documento mapeado

    Word.Application oApp=new Word.Application() ;

    object template = CaminhoDocMatriz; //@"C:\\Users\\Luiz\\Documents\\Visual Studio 2005\\Projects\\PreencherWord";

    Word.Document oDoc = oApp.Documents.Add(ref template , ref missing, ref missing, ref missing);

    //Troca o conteúdo de alguns tags

    Word.Range oRng= oDoc.Range(ref missing ,ref missing );

    object FindText = "[prmCor]";

    object ReplaceWith="azul";

    object MatchWholeWord = true;

    object Forward = false;

    oRng.Find.Execute( ref FindText , ref missing,ref MatchWholeWord , ref missing,ref missing,ref missing,ref Forward,

    ref missing,ref missing,ref ReplaceWith ,ref missing,ref missing,ref missing,ref missing,ref missing);

    oRng = oDoc.Range(ref missing, ref missing);

    FindText = "[prmModelo]";

    ReplaceWith = "Pajero";

    oRng.Find.Execute(ref FindText ,ref missing, ref MatchWholeWord ,ref missing,ref missing,ref missing,ref Forward,

    ref missing,ref missing,ref ReplaceWith ,ref missing,ref missing,ref missing,ref missing,ref missing);

    oApp.Visible = true;

    }

     

    }

    }

     

     

     

    Para chamar a função, o seguinte trecho pode ser usado:

     

    Code Snippet

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Text;

    using System.Windows.Forms;

    namespace PreencherWord

    {

    public partial class Form1 : Form

    {

    public Form1()

    {

    InitializeComponent();

    }

    private void button1_Click(object sender, EventArgs e)

    {

    try

    {

    WordFill clsWord = new WordFill();

    clsWord.PreencherPorReplace(Application.StartupPath + "\\TesteReplace.doc");

    }

    catch (Exception ex)

    {

    MessageBox.Show(ex.Message);

    }

    }

    }

    }

     

     

    Criei um documento matriz (TesteReplace.doc) na pasta debug do projeto (C:\Users\Luiz\Documents\Visual Studio 2005\Projects\PreencherWord\PreencherWord\bin\Debug) com o seguinte conteúdo:

    Cor: [prmCor]

    Modelo: [prmModelo]

     

    sábado, 26 de janeiro de 2008 23:32
    Moderador
  • Estou montando um aplicativo form onde tem o seguintes campos:

    REFERENCIA

    CIDADE

    BAIRRO

    VALOR

    TITULO

    TEXTO

    IMAGEM 1

    IMAGEM 2

     

    A minha ideia é gerar uma arquivo .doc e substituir em seu texto esse campos, utilizando esse topico resolvi parte de meu problema que é substituir alguns textos, porém a outra parte é a imagem eu até consegui inserir a imagem no documento com o seguinte codigo:

     

    Code Snippet

    oRng.Application.Selection.InlineShapes.AddPicture(@txtFoto1.Text, ref missing, ref missing, ref missing);

     

     

    Porém não consigo formatar seu tamanho por exemplo quero que ele fique na resolução 50x50 e não consigo definir em que parte do documento ele vai ser incluido por exemplor no lugar de onde estiver escrito [IMAGEM1]

     

    Já agradeço por resolverem pate de meu problema, alguem sabe como faz essas manipulações na imagem?

    sexta-feira, 13 de junho de 2008 03:58
  • Luiz e caso eu queira colocar ao invés de

    object ReplaceWith="azul";

    colocar o valor de um textbox de um form?

    como faria?

    obrigado

    segunda-feira, 14 de julho de 2008 16:44
  • Ao inves de você digitar a string você apenas puxa do textbox,
    suponha que o name do seu textbox seja, txtMensagem
    essa parte que você esta querendo saber ficaria assim:

    Code Snippet

    object FindText = "[Mensagem]";

    object ReplaceWith = txtMensagem.text;


    Assim ele vai procurar no documento o texto [Mensagem] e vai substituir pelo texto que estiver no textbox txtMensagem

    _______________________________________________________________________________________________________


    E quanto a minha duvida que postei acima consegui resolver parcialmente quando chegar em casa eu coloco para quem estiver trabalhando com isso.
    segunda-feira, 14 de julho de 2008 18:53

  • b) Usar MailMerge;


    d) Mapear com tags XML e gerar um arquivo de dados para fazer o preenchimento.


    Podes explicar como fazes estas duas opções, especialmente a d), que é algo similar ao que quero fazer...


    Basicamente tenho um template .dot que contem estas etiquetas LastName, FirstName, Address...

    Tenho um ficheiro xml, que são os dados que quero substituir nas etiquetas.... 

    Code Snippet

    <?xml version="1.0" encoding="utf-8"?>
    <rootnode xmlns:od="urn:schemas-microsoft-com:officedata">
    <Employee>
    <LastName>Davolio</LastName>
    <FirstName>Nancy</FirstName>
    <Address>507 - 20th Ave. E. Apt. 2A</Address>
    </Employee>
    </rootnode>


    O que é que quero é saber como através de c#, pegava no xml, e ia substituir no ficheiro template, criando um ficheiro final, que é a junção dos dois!

    Code Snippet

    ...

    using Word = Microsoft.Office.Interop.Word;

    ...

    private object oTemplate = Environment.CurrentDirectory + @"\template.dot";

    private object oNomes = Environment.CurrentDirectory + @"\dados.xml";
    private object oFileName = Environment.CurrentDirectory + @"\saved.doc";
    private object oFileFormat = Word.WdSaveFormat.wdFormatDocument;

    private object missing = System.Reflection.Missing.Value;



    public void MergeFiles(){

    Word.ApplicationClass oWordApp = new Word.ApplicationClass();

    oWordDoc = oWordApp.Documents.Add(ref oTemplate,ref missing, ref missing, ref missing);


    **** Não percebo o que é que faço aqui no meio ****


    oWordDoc.SaveAs(ref oFileName, ref oFileFormat, ref missing, ref missing, ref oTrue, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);

    }





    Não percebo o que é que faço lá no meio, para fazer aquilo que quero
    terça-feira, 2 de dezembro de 2008 17:44
  • Caro,

    Luiz Claúdio eu estou querendo desenvolver na minha aplicação de trabalho de conclusão de curso, um módulo para geração de contratos pré-confeccionados no Word, trocando valores das varíaveis de um documento modelo por valores passados pelos usuários nos textBox do formulário. Visitando esta página do fórum achei interessante a forma como citou ao pessoal como fazer esse tipo de trabalho, e resolvi fazer um teste aqui. Vou te dizer que no meu surgiu um pequeno problema no momento do Build...o erro foi o seguinte

     

    The type or namespace 'Interop' does not exist in the namespace 'Microsoft.Office (are you missing an assembly reference), ou seja, não existe um namespace chamado "Interop" não existe dentro do namespace "Microsoft.Office, eu falhei ao referenciar este assembly.

     

    PS: Não sei se tem alguma coisa a ver, mas eu estou usando o Microsoft Office 2007, e meu arquivo foi gravado com extensão .docx.

     

    Estou aguardando uma resposta, se tudo der certo, jah tenho meio caminho andando pelo menos nesta funcionalidade pro meu TCC, desde já muito obrigado pela atenção

     

    Um forte abraço

     


    Diogo Vicente
    quarta-feira, 3 de junho de 2009 05:45
  • Bom dia Luiz Claudio, desculpe-me estar reabrindo esta questão, mas foi a solução mais rapida e pratica que encontrei
    para meu problema, e tenho pouco tempo, "7" dias até a apresentação do meu TCC hehehe, grato pela "Luz", mas enfim
    encontrei um probleminha que acho que você ja deve ter a solução, este código exemplo seu, só substitui um parametro
    com o mesmo nome "o ultimo", se tenho duas vezes o parametro [prmNomeCli] no meu texto ele vai subistituir o segundo
    e iguinorar o primeiro...queria saber se não tem um modo de dar um "ExecuteReplaceAll" ou alguma coisa do tipo
    pq se não der, pelo prazo que tenho vou usar a força bruta e fazer um for nesses replaces pelo numero de vezes que
    acho que esses parametros possa aparecer no sistema "e claro meu orientador nem vai sonhar com isso!"
    desde ja agradeço novamente...tenha um otimo dia!!!
    segunda-feira, 23 de novembro de 2009 03:46
  • Prezados,
    estou tento um problema ao gerar o documento em word. Estou trazendo vários registros do bando e coloquei um while para ler todo o registro e ir criando um arquivo .doc de cada registro.
    O problema é: Quando eu utilizo "while (myReader.Read())" o arquivo passa pela função abaixo e não gera nada. 

    Response.AddHeader("Content-Disposition", "Attachment;Filename=Word.doc");

    Response.AddHeader(

    "Content-Disposition", "attachment; Word.doc Filename =");

    "Content-Disposition", "attachment; Word.doc Filename =");


    Porém quando eu tiro a função "while (myReader.Read())" e coloco
    "if (myReader.Read())" o Sistema gera o arquivo .doc porém apenas de um registro.

    Queria saber como eu faço para utilizar o comando "while (myReader.Read())" para gerar os N arquivos em formato .doc.

    Caso tenham tb outras sugestões, peço por gentileza, que postem.

    desde já agradeço. Abaixo encaminho o códico problemático...

    abraços 










    protected

     

    void Page_Load(object sender, EventArgs e)

    {

     

    DBGeraOficio db = new DBGeraOficio();

     

    SqlDataReader myReader = db.PesquisaRegistros();

     

    if (myReader.HasRows)

    {

     

    while (myReader.Read())

    {

    NomeArmador.Text =

    Convert.ToString(myReader["Responsavellegal"]);

    Rua.Text =

    Convert.ToString(myReader["EnderecoResponsavel"]);

    CEP.Text =

    Convert.ToString(myReader["cepResponsavel"]);

    telefone.Text =

    Convert.ToString(myReader["telResponsavel"]);

    fax.Text =

    Convert.ToString(myReader["faxResponsavel"]);

    NomeEmbarcacao.Text =

    Convert.ToString(myReader["Embarcacao"]);

    Cidade.Text =

    Convert.ToString(myReader["cidadeResponsavel"]);

    Estado.Text =

    Convert.ToString(myReader["ufResponsavel"]);

    NomeEmbarcacao2.Text =

    Convert.ToString(myReader["Embarcacao"]);

    SinaisAtrasados.Text =

    Convert.ToString(myReader["DataUltimoPonto"]);

     

     

    //gerar ofcio word

    Response.AddHeader(

    "Content-Disposition", "Attachment;Filename=Word.doc");

    Response.AddHeader(

    "Content-Disposition", "attachment; Word.doc Filename =");

     

    }

    myReader.Close();

    }

     

     

     

     

    }

    }

    segunda-feira, 8 de março de 2010 20:57
  • Olá,

    este tópico já está fechado, sugiro postar sua dúvida em um novo.

    Luiz Cláudio Cosenza Vieira da Rocha - http://msmvps.com/blogs/officedev - IT Lab www.itlab.com.br
    quarta-feira, 10 de março de 2010 03:00
    Moderador