Como automatizar o Microsoft Word para criar um novo documento usando o Visual C #

Para obter uma versão do .NET do Microsoft Visual Basic deste artigo, consulte

Resumo

Este artigo passo a passo descreve como criar um novo documento no Microsoft Word usando a Automação do Microsoft Visual C# 2005 ou do Microsoft Visual C# .NET.

Código de exemplo

O código de exemplo neste artigo demonstra como fazer o seguinte:

  • Inserir parágrafos com texto e formatação.
  • Navegue e modifique vários intervalos dentro de um documento.
  • Insira tabelas, formate tabelas e preencha as tabelas com dados.
  • Adicione um gráfico.

Para criar um novo documento do Word usando a Automação do Visual C# 2005 ou do Visual C# .NET, siga estas etapas:

  1. Inicie o Microsoft Visual Studio 2005 ou o Microsoft Visual Studio .NET.

  2. No menu Arquivo, clique em Novo e, em seguida, clique em Projeto. Em Tipos de Projeto, clique em Projetos do Visual C# e clique em Aplicativo do Windows em Modelos. O Form1 é criado por padrão.

    Nota No Visual Studio 2005, clique em Visual C# em vez de Projetos do Visual C#.

  3. Adicione uma referência à Biblioteca de Objetos do Microsoft Word. Para fazer isso, siga estas etapas:

    1. On the Project menu, click Add Reference.
    2. Na guia COM, localize a Biblioteca de Objetos do Microsoft Word e clique em Selecionar.

    Nota No Visual Studio 2005, você não precisa clicar em Selecionar.

    Nota O Microsoft Office 2003 inclui PIAs (assemblies de interoperabilidade primários). O Microsoft Office XP não inclui PIAs, mas eles podem ser baixados.

    1. Clique em OK na caixa de diálogo Adicionar Referências para aceitar suas seleções. Se for solicitado que você gere wrappers para as bibliotecas selecionadas, clique em Sim.
  4. No menu Exibir, selecione Caixa de Ferramentas para exibir a Caixa de Ferramentas e, em seguida, adicione um botão ao Form1.

  5. Clique duas vezes em Button1. A janela de código do formulário é exibida.

  6. Na janela de código, substitua o seguinte código:

    private void button1_Click(object sender, System.EventArgs e)
    {
    }
    
    

    por:

    private void button1_Click(object sender, System.EventArgs e)
    {
    object oMissing = System.Reflection.Missing.Value;
    object oEndOfDoc = "\\endofdoc"; /* \endofdoc is a predefined bookmark */ 
    
    //Start Word and create a new document.
    Word._Application oWord;
    Word._Document oDoc;
    oWord = new Word.Application();
    oWord.Visible = true;
    oDoc = oWord.Documents.Add(ref oMissing, ref oMissing,
    ref oMissing, ref oMissing);
    
    //Insert a paragraph at the beginning of the document.
    Word.Paragraph oPara1;
    oPara1 = oDoc.Content.Paragraphs.Add(ref oMissing);
    oPara1.Range.Text = "Heading 1";
    oPara1.Range.Font.Bold = 1;
    oPara1.Format.SpaceAfter = 24;    //24 pt spacing after paragraph.
    oPara1.Range.InsertParagraphAfter();
    
    //Insert a paragraph at the end of the document.
    Word.Paragraph oPara2;
    object oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    oPara2 = oDoc.Content.Paragraphs.Add(ref oRng);
    oPara2.Range.Text = "Heading 2";
    oPara2.Format.SpaceAfter = 6;
    oPara2.Range.InsertParagraphAfter();
    
    //Insert another paragraph.
    Word.Paragraph oPara3;
    oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    oPara3 = oDoc.Content.Paragraphs.Add(ref oRng);
    oPara3.Range.Text = "This is a sentence of normal text. Now here is a table:";
    oPara3.Range.Font.Bold = 0;
    oPara3.Format.SpaceAfter = 24;
    oPara3.Range.InsertParagraphAfter();
    
    //Insert a 3 x 5 table, fill it with data, and make the first row
    //bold and italic.
    Word.Table oTable;
    Word.Range wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    oTable = oDoc.Tables.Add(wrdRng, 3, 5, ref oMissing, ref oMissing);
    oTable.Range.ParagraphFormat.SpaceAfter = 6;
    int r, c;
    string strText;
    for(r = 1; r <= 3; r++)
    for(c = 1; c <= 5; c++)
    {
    strText = "r" + r + "c" + c;
    oTable.Cell(r, c).Range.Text = strText;
    }
    oTable.Rows[1].Range.Font.Bold = 1;
    oTable.Rows[1].Range.Font.Italic = 1;
    
    //Add some text after the table.
    Word.Paragraph oPara4;
    oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    oPara4 = oDoc.Content.Paragraphs.Add(ref oRng);
    oPara4.Range.InsertParagraphBefore();
    oPara4.Range.Text = "And here's another table:";
    oPara4.Format.SpaceAfter = 24;
    oPara4.Range.InsertParagraphAfter();
    
    //Insert a 5 x 2 table, fill it with data, and change the column widths.
    wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    oTable = oDoc.Tables.Add(wrdRng, 5, 2, ref oMissing, ref oMissing);
    oTable.Range.ParagraphFormat.SpaceAfter = 6;
    for(r = 1; r <= 5; r++)
    for(c = 1; c <= 2; c++)
    {
    strText = "r" + r + "c" + c;
    oTable.Cell(r, c).Range.Text = strText;
    }
    oTable.Columns[1].Width = oWord.InchesToPoints(2); //Change width of columns 1 & 2
    oTable.Columns[2].Width = oWord.InchesToPoints(3);
    
    //Keep inserting text. When you get to 7 inches from top of the
    //document, insert a hard page break.
    object oPos;
    double dPos = oWord.InchesToPoints(7);
    oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range.InsertParagraphAfter();
    do
    {
    wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    wrdRng.ParagraphFormat.SpaceAfter = 6;
    wrdRng.InsertAfter("A line of text");
    wrdRng.InsertParagraphAfter();
    oPos = wrdRng.get_Information
                           (Word.WdInformation.wdVerticalPositionRelativeToPage);
    }
    while(dPos >= Convert.ToDouble(oPos));
    object oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;
    object oPageBreak = Word.WdBreakType.wdPageBreak;
    wrdRng.Collapse(ref oCollapseEnd);
    wrdRng.InsertBreak(ref oPageBreak);
    wrdRng.Collapse(ref oCollapseEnd);
    wrdRng.InsertAfter("We're now on page 2. Here's my chart:");
    wrdRng.InsertParagraphAfter();
    
    //Insert a chart.
    Word.InlineShape oShape;
    object oClassType = "MSGraph.Chart.8";
    wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    oShape = wrdRng.InlineShapes.AddOLEObject(ref oClassType, ref oMissing, 
    ref oMissing, ref oMissing, ref oMissing,
    ref oMissing, ref oMissing, ref oMissing);
    
    //Demonstrate use of late bound oChart and oChartApp objects to
    //manipulate the chart object with MSGraph.
    object oChart;
    object oChartApp;
    oChart = oShape.OLEFormat.Object;
    oChartApp = oChart.GetType().InvokeMember("Application",
    BindingFlags.GetProperty, null, oChart, null);
    
    //Change the chart type to Line.
    object[] Parameters = new Object[1];
    Parameters[0] = 4; //xlLine = 4
    oChart.GetType().InvokeMember("ChartType", BindingFlags.SetProperty,
    null, oChart, Parameters);
    
    //Update the chart image and quit MSGraph.
    oChartApp.GetType().InvokeMember("Update",
    BindingFlags.InvokeMethod, null, oChartApp, null);
    oChartApp.GetType().InvokeMember("Quit",
    BindingFlags.InvokeMethod, null, oChartApp, null);
    //... If desired, you can proceed from here using the Microsoft Graph 
    //Object model on the oChart and oChartApp objects to make additional
    //changes to the chart.
    
    //Set the width of the chart.
    oShape.Width = oWord.InchesToPoints(6.25f);
    oShape.Height = oWord.InchesToPoints(3.57f);
    
    //Add text after the chart.
    wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    wrdRng.InsertParagraphAfter();
    wrdRng.InsertAfter("THE END.");
    
    //Close this form.
    this.Close();
    }
    
  7. Role até a parte superior da janela de código. Adicione a seguinte linha ao final da lista de diretivas using:

    using Word = Microsoft.Office.Interop.Word;
    using System.Reflection;
    
  8. Pressione F5 para compilar e executar o programa.

  9. Clique em Button1 para iniciar a Automação do Word e criar o documento.

Depois que o código for concluído, examine o documento que foi criado para você. O documento contém duas páginas de parágrafos formatados, tabelas e um gráfico.

Usar um modelo

Se você estiver usando a Automação para criar documentos que estão todos em um formato comum, poderá se beneficiar de iniciar o processo com um novo documento baseado em um modelo pré-formatado. Usar um modelo com seu cliente de Automação do Word tem duas vantagens significativas em relação à criação de um documento do nada:

  • Você pode ter maior controle sobre a formatação e o posicionamento de objetos em todos os seus documentos.
  • Você pode criar seus documentos com menos código.

Usando um modelo, você pode ajustar o posicionamento de tabelas, parágrafos e outros objetos dentro do documento, bem como incluir formatação nesses objetos. Usando a Automação, você pode criar um novo documento com base em seu modelo com código como o seguinte:

object oTemplate = "c:\\MyTemplate.dot";
oDoc = oWord.Documents.Add(ref oTemplate, ref oMissing,
ref oMissing, ref oMissing);

Em seu modelo, você pode definir indicadores para que o cliente de Automação possa preencher o texto variável em um local específico no documento, da seguinte maneira:

object oBookMark = "MyBookmark";
oDoc.Bookmarks.Item(ref oBookMark).Range.Text = "Some Text Here";

Outra vantagem de usar um modelo é que você pode criar e armazenar estilos de formatação que deseja aplicar em runtime, da seguinte maneira:

object oStyleName = "MyStyle";
oDoc.Bookmarks.Item(ref oBookMark).Range.set_Style(ref oStyleName);

ou

object oStyleName = "MyStyle";
oWord.Selection.set_Style(ref oStyleName);

Referências

Para obter mais informações, veja os artigos na Base de Dados de Conhecimento Microsoft: