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

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

Resumo

Este artigo passo a passo descreve como criar um novo documento no Microsoft Word através da Automatização a partir 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.
  • Procure e modifique vários intervalos num documento.
  • Insira tabelas, formate tabelas e preenza as tabelas com dados.
  • Adicione um gráfico.

Para criar um novo documento do Word com a Automatização a partir do Visual C# 2005 ou do Visual C# .NET, siga estes passos:

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

  2. No menu Ficheiro, clique em Novo e, em seguida, clique em Projeto. Em Tipos de Projeto, clique em Projetos Visuais C# e, em seguida, clique em Aplicação do Windows em Modelos. O formulário1 é criado por predefinição.

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

  3. Adicione uma referência à Biblioteca de Objetos do Microsoft Word. Para tal, siga estes passos:

    1. No menu Projeto, clique em Adicionar Referência.
    2. No separador COM, localize Biblioteca de Objetos do Microsoft Word e, em seguida, clique em Selecionar.

    Nota No Visual Studio 2005, não tem de clicar em Selecionar.

    Nota O Microsoft Office 2003 inclui Conjuntos de Interojuntas Principais (PIAs). O Microsoft Office XP não inclui PIAs, mas estes podem ser transferidos.

    1. Clique em OK na caixa de diálogo Adicionar Referências para aceitar as suas seleções. Se lhe for pedido para gerar embrulhos para as bibliotecas que selecionou, clique em Sim.
  4. No menu Ver, selecione Caixa de Ferramentas para apresentar a Caixa de Ferramentas e, em seguida, adicione um botão ao Formulário1.

  5. Faça duplo clique em Botão1. A janela de código do formulário é exibida.

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

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

    com:

    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. Desloco-se para a parte superior da janela do código. Adicione a linha seguinte ao fim da lista de utilização de diretivos:

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

  9. Clique no Botão1 para iniciar a Automatização do Word e para criar o documento.

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

Utilizar um Modelo

Se estiver a utilizar a Automatização para criar documentos que estão todos num formato comum, pode beneficiar se começar o processo com um novo documento baseado num modelo pré-formatado. Utilizar um modelo com o seu cliente de Automatização do Word tem duas vantagens significativas em criar um documento a partir de nada:

  • Pode ter um maior controlo sobre a formatação e colocação de objetos em todos os seus documentos.
  • Pode criar os seus documentos com menos código.

Ao utilizar um modelo, pode otimizar a colocação de tabelas, parágrafos e outros objetos no documento, bem como incluir formatação nesses objetos. Ao utilizar a Automatização, pode criar um novo documento baseado no 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);

No seu modelo, pode definir marcadores para que o seu cliente de Automatização possa preencher texto variável numa localização específica do documento, da seguinte forma:

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

Outra vantagem de utilizar um modelo é que pode criar e armazenar estilos de formatação que pretende aplicar no runtime, da seguinte forma:

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: