Visual C を使用して Microsoft Word を自動化して新しいドキュメントを作成する方法#

この記事の Microsoft Visual Basic .NET バージョンについては、次を参照してください。

概要

この記事では、Microsoft Visual C# 2005 または Microsoft Visual C# .NET の Automation を使用して、Microsoft Word で新しいドキュメントを作成する方法について説明します。

サンプル コード

この記事のサンプル コードでは、次の操作を行う方法を示します。

  • テキストと書式設定を含む段落を挿入します。
  • ドキュメント内のさまざまな範囲を参照および変更します。
  • テーブルを挿入し、テーブルを書式設定し、テーブルにデータを設定します。
  • グラフを追加します。

Visual C# 2005 または Visual C# .NET の Automation を使用して新しい Word ドキュメントを作成するには、次の手順に従います。

  1. Microsoft Visual Studio 2005 または Microsoft Visual Studio .NET を起動します。

  2. [ファイル] メニューの [新規] をクリックし、[プロジェクト] をクリックします。 [プロジェクトの種類] で [Visual C# プロジェクト] をクリックし、[テンプレート] で [Windows アプリケーション] をクリックします。 Form1 は既定で作成されます。

    メモ Visual Studio 2005 で、 Visual C# プロジェクトの代わりに [Visual C#] をクリックします。

  3. Microsoft Word オブジェクト ライブラリへの参照を追加します。 これを行うには、次の手順を実行します。

    1. [ プロジェクト] メニューの [ 参照の追加] をクリックします。
    2. [COM] タブで、Microsoft Word オブジェクト ライブラリを探し、[選択] をクリックします。

    メモ Visual Studio 2005 では、[ 選択] をクリックする必要はありません。

    メモ Microsoft Office 2003 には、プライマリ相互運用機能アセンブリ (PIA) が含まれています。 Microsoft Office XP には PIA は含まれていませんが、ダウンロードできます。

    1. [参照の追加] ダイアログ ボックスで [OK] をクリックして、選択内容を受け入れます。 選択したライブラリのラッパーを生成するように求められた場合は、[はい] をクリックします。
  4. [表示] メニューの [ツールボックス] を選択してツールボックスを表示し、Form1 にボタンを追加します。

  5. Button1 をダブルクリックします。 フォームのコード ウィンドウが表示されます。

  6. コード ウィンドウで、次のコードを置き換えます。

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

    置換後:

    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. コード ウィンドウの上部までスクロールします。 using ディレクティブの一覧の末尾に次の行を追加します。

    using Word = Microsoft.Office.Interop.Word;
    using System.Reflection;
    
  8. F5 キーを押してビルドし、プログラムを実行します。

  9. [Button1] をクリックして Word Automation を起動し、ドキュメントを作成します。

コードが完了したら、自動的に作成されたドキュメントを確認します。 ドキュメントには、書式設定された段落、テーブル、およびグラフの 2 つのページが含まれています。

テンプレートを使用する

Automation を使用して、すべて一般的な形式のドキュメントを作成する場合は、事前フォーマットされたテンプレートに基づく新しいドキュメントでプロセスを開始することでメリットを得ることができます。 Word Automation クライアントでテンプレートを使用すると、ドキュメントを何も作成しない場合と比べて、次の 2 つの大きな利点があります。

  • ドキュメント全体でオブジェクトの書式設定と配置をより細かく制御できます。
  • より少ないコードでドキュメントを作成できます。

テンプレートを使用すると、ドキュメント内のテーブル、段落、およびその他のオブジェクトの配置を微調整したり、それらのオブジェクトに書式設定を含めることができます。 Automation を使用すると、次のようなコードを使用して、テンプレートに基づいて新しいドキュメントを作成できます。

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

テンプレートでは、Automation クライアントがドキュメント内の特定の場所に次のように可変テキストを入力できるようにブックマークを定義できます。

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

テンプレートを使用するもう 1 つの利点は、実行時に適用する書式スタイルを作成して格納できることです。次のようにします。

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

or

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

関連情報

詳細については、Microsoft サポート技術情報の記事を参照してください。