【C#VB.NET】Word文書に記入可能なフォームを作成

記入可能なフォームは、レビュー、フィードバック、その他の情報を他の人から収集するのに便利です。ユーザーが特定のフォーマットでデータを記入し、フォームフィールド以外のコンテンツは変更しないように、Word文書で記入可能なフォームを作成することができます。今回は、無料ツール「[Free Spire.Doc for .NET](https://jp.e-iceblue.com/introduce/free-spire-doc-for-net.html)」を使って、**Word文書に記入可能なフォームを作成**する方法について説明します。
フォームフィールドの作成には、テーブルとコンテンツ コントロールが必要です。また、フォームを作成した後は、フォーム フィールド以外の内容を変更できないように、文書をロックする必要があります。
以下、本記事の例で使用した7つのコンテンツ コントロールの情報です。
| コンテンツ コントロール | 説明 |
| --- | ---| 
| テキスト | 書式なしテキストを入力できるようにします。 |
| リッチ テキスト | 書式付きテキストのほか、表、画像、コンテンツ コントロールなどのコンテンツを入力できるようにします。 |
| 画像 | 1枚の画像を入力できるようにします。 |
| ドロップダウン リスト | 定義済みのリストから項目を選択できるようにします。 |
| コンボ ボックス | 定義済みのリストから項目を選択したり、ユーザー自身が情報を入力したりすることができるようにします。 |
| チェック ボックス | ユーザーがチェックできるようにします。 |
| 日付選択 | カレンダーから日付を選択できるようにします。 |
## 【依存関係の追加】
まず、Free Spire.Doc for.NET パッケージに含まれるDLLファイルを.NETプロジェクトにリファレンスとして追加する必要があります。DLLファイルは、[このリンク](https://jp.e-iceblue.com/download/free-spire-doc-for-net.html)からダウンロードするか、NuGet経由でインストールすることができます。
```PM> Install-Package FreeSpire.Doc```
## Word文書でコンテンツコントロール付きフォームを作成する
Free Spire.Doc for .NETが提供する**StructureDocumentTagInline**クラスは、段落内のDrawingMLやフィールドなどのインライン構造用の構造化文書タグを作成するために使用されます。 このクラスの下にある**SDTProperties**と**SDTContent**プロパティでは、対応する構造化文書タグのプロパティとコンテンツを設定することができます。 以下は、Word文書で記入可能なフォームを作成するための詳細な手順です。
- **Document** のオブジェクトを作成します。
- **Document.AddSection()** メソッドを使用して、セクションを追加します。
- **Section.AddTable()** メソッドを使用して、テーブルを追加します。
- **TableCell.AddParagraph()** メソッドを使用して、セルに段落を追加します。
- **StructureDocumentTagInline** のオブジェクトを作成し、**Paragraph.ChildObjects.Add()** メソッドを使用して子オブジェクトとして段落に追加します。
- **StructureDocumentTagInline** のオブジェクトの **SDTProperties** と **SDTContent** プロパティを使用して、構造化ドキュメントタグのプロパティとコンテンツを設定します。 構造化ドキュメントタグのタイプは、**SDTProperties.SDTType** メソッドで設定することができます。
- **Document.Protect()** メソッドを使用して、ユーザーがフォームフィールド外のコンテンツを編集することを許可しないように設定します。
- **Document.SaveToFile()** メソッドを使用して、ドキュメントを保存します。

**C#**
```C#
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
using System;

namespace ApplyFormattingToCharacters
{
    class Program
    {
        static void Main(string[] args)
        {
            //Documentのオブジェクトを作成する
            Document document = new Document();

            //セクションを追加する
            Section section = document.AddSection();

            //表を追加する
            Table table = section.AddTable(true);
            table.ResetCells(7, 2);

            //1列目のセルにテキストを追加する
            Paragraph paragraph = table.Rows[0].Cells[0].AddParagraph();
            paragraph.AppendText("テキスト コンテンツ コントロール");
            paragraph = table.Rows[1].Cells[0].AddParagraph();
            paragraph.AppendText("リッチ テキスト コンテンツ コントロール");
            paragraph = table.Rows[2].Cells[0].AddParagraph();
            paragraph.AppendText("画像コンテンツ コントロール");
            paragraph = table.Rows[3].Cells[0].AddParagraph();
            paragraph.AppendText("ドロップダウン リスト コンテンツコントロール");
            paragraph = table.Rows[4].Cells[0].AddParagraph();
            paragraph.AppendText("チェック ボックス コンテンツ コントロール");
            paragraph = table.Rows[5].Cells[0].AddParagraph();
            paragraph.AppendText("コンボ ボックス コンテンツ コントロール");
            paragraph = table.Rows[6].Cells[0].AddParagraph();
            paragraph.AppendText("日付選択コンテンツ コントロール");

            //セル(0,1)にテキスト コンテンツ コントロールを追加する
            paragraph = table.Rows[0].Cells[1].AddParagraph();
            StructureDocumentTagInline sdt = new StructureDocumentTagInline(document);
            paragraph.ChildObjects.Add(sdt);
            sdt.SDTProperties.SDTType = SdtType.Text;
            sdt.SDTProperties.Alias= "テキスト";
            sdt.SDTProperties.Tag = "テキスト";
            sdt.SDTProperties.IsShowingPlaceHolder = true;
            SdtText text = new SdtText(true);
            text.IsMultiline = false;
            sdt.SDTProperties.ControlProperties = text;
            TextRange tr = new TextRange(document);
            tr.Text = "ここをクリックまたはタップしてテキストを入力してください。";
            sdt.SDTContent.ChildObjects.Add(tr);

            //セル(1,1)にリッチ テキスト コンテンツ コントロールを追加する
            paragraph = table.Rows[1].Cells[1].AddParagraph();
            sdt = new StructureDocumentTagInline(document);
            paragraph.ChildObjects.Add(sdt);
            sdt.SDTProperties.SDTType = SdtType.RichText;
            sdt.SDTProperties.Alias = "リッチ テキスト";
            sdt.SDTProperties.Tag = "リッチ テキスト";
            sdt.SDTProperties.IsShowingPlaceHolder = true;
            text = new SdtText(true);
            text.IsMultiline = false;
            sdt.SDTProperties.ControlProperties = text;
            tr = new TextRange(document);
            tr.Text = "ここをクリックまたはタップしてテキストを入力してください。";
            sdt.SDTContent.ChildObjects.Add(tr);

            //セル(2,1)に画像コンテンツ コントロールを追加する
            paragraph = table.Rows[2].Cells[1].AddParagraph();
            sdt = new StructureDocumentTagInline(document);
            paragraph.ChildObjects.Add(sdt);
            sdt.SDTProperties.SDTType = SdtType.Picture;
            sdt.SDTProperties.Alias= "画像";
            sdt.SDTProperties.Tag = "画像";
            SdtPicture sdtPicture = new SdtPicture();
            sdt.SDTProperties.ControlProperties = sdtPicture;
            DocPicture pic = new DocPicture(document);
            pic.LoadImage("C:/Users/Sirion/Desktop/Workspace.png");
            sdt.SDTContent.ChildObjects.Add(pic);

            //セル(3,1)にドロップダウン リスト コンテンツ コントロールを追加する
            paragraph = table.Rows[3].Cells[1].AddParagraph();
            sdt = new StructureDocumentTagInline(document);
            sdt.SDTProperties.SDTType = SdtType.DropDownList;
            sdt.SDTProperties.Alias = "ドロップダウン リスト";
            sdt.SDTProperties.Tag = "ドロップダウン リスト";
            paragraph.ChildObjects.Add(sdt);
            SdtDropDownList sddl = new SdtDropDownList();
            sddl.ListItems.Add(new SdtListItem("アイテムを選択してください。", "1"));
            sddl.ListItems.Add(new SdtListItem("アイテム 2", "2"));
            sddl.ListItems.Add(new SdtListItem("アイテム 3", "3"));
            sddl.ListItems.Add(new SdtListItem("アイテム 4", "4"));
            sdt.SDTProperties.ControlProperties = sddl;
            tr = new TextRange(document);
            tr.Text = sddl.ListItems[0].DisplayText;
            sdt.SDTContent.ChildObjects.Add(tr);

            //セル(4,1)にチェック ボックス コンテンツ コントロールを2つ追加する
            paragraph = table.Rows[4].Cells[1].AddParagraph();
            sdt = new StructureDocumentTagInline(document);
            paragraph.ChildObjects.Add(sdt);
            sdt.SDTProperties.SDTType = SdtType.CheckBox;
            SdtCheckBox scb = new SdtCheckBox();
            sdt.SDTProperties.ControlProperties = scb;
            tr = new TextRange(document);
            sdt.ChildObjects.Add(tr);
            scb.Checked = false;
            paragraph.AppendText(" オプション 1");

            paragraph = table.Rows[4].Cells[1].AddParagraph();
            sdt = new StructureDocumentTagInline(document);
            paragraph.ChildObjects.Add(sdt);
            sdt.SDTProperties.SDTType = SdtType.CheckBox;
            scb = new SdtCheckBox();
            sdt.SDTProperties.ControlProperties = scb;
            tr = new TextRange(document);
            sdt.ChildObjects.Add(tr);
            scb.Checked = false;
            paragraph.AppendText(" オプション 2");

            //セル(5,1)にコンボ ボックス コンテンツ コントロールを追加する。
            paragraph = table.Rows[5].Cells[1].AddParagraph();
            sdt = new StructureDocumentTagInline(document);
            paragraph.ChildObjects.Add(sdt);
            sdt.SDTProperties.SDTType = SdtType.ComboBox;
            sdt.SDTProperties.Alias = "コンボ ボックス";
            sdt.SDTProperties.Tag = "コンボ ボックス";
            SdtComboBox cb = new SdtComboBox();
            cb.ListItems.Add(new SdtListItem("アイテムを選択してください。"));
            cb.ListItems.Add(new SdtListItem("アイテム 2"));
            cb.ListItems.Add(new SdtListItem("アイテム 3"));
            sdt.SDTProperties.ControlProperties = cb;
            tr = new TextRange(document);
            tr.Text = cb.ListItems[0].DisplayText;
            sdt.SDTContent.ChildObjects.Add(tr);

            //セル(6,1)に日付選択コンテンツ コントロールを追加する
            paragraph = table.Rows[6].Cells[1].AddParagraph();
            sdt = new StructureDocumentTagInline(document);
            paragraph.ChildObjects.Add(sdt);
            sdt.SDTProperties.SDTType = SdtType.DatePicker;
            sdt.SDTProperties.Alias = "日付選択";
            sdt.SDTProperties.Tag = "日付選択";
            SdtDate date = new SdtDate();
            date.CalendarType = CalendarType.Japan;
            date.DateFormat = "yyyy.MM.dd";
            date.FullDate = DateTime.Now;
            sdt.SDTProperties.ControlProperties = date;
            tr = new TextRange(document);
            tr.Text = "クリックまたはタップして日付を入力してください。";
            sdt.SDTContent.ChildObjects.Add(tr);

            paragraph.GetStyle().CharacterFormat.FontName = "Yu Gothic UI";

            //ユーザーがフォームフィールドを編集することのみを許可するように設定する
            document.Protect(ProtectionType.AllowOnlyFormFields, "password");

            //ドキュメントを保存する
            document.SaveToFile("Output/フォーム.docx", FileFormat.Docx2013);
        }
    }
}
```
**VB.NET**
```VB
Imports Spire.Doc
Imports Spire.Doc.Documents
Imports Spire.Doc.Fields
Imports System

Namespace ApplyFormattingToCharacters
    Class Program
        Shared Sub Main(ByVal args() As String)
            'Documentのオブジェクトを作成する
            Dim document As Document = New Document()

            'セクションを追加する
            Dim section As Section = document.AddSection()

            '表を追加する
            Dim table As Table = section.AddTable(True)
            table.ResetCells(7, 2)

            '1列目のセルにテキストを追加する
            Dim paragraph As Paragraph = table.Rows(0).Cells(0).AddParagraph()
            paragraph.AppendText("テキスト コンテンツ コントロール")
            paragraph = table.Rows(1).Cells(0).AddParagraph()
            paragraph.AppendText("リッチ テキスト コンテンツ コントロール")
            paragraph = table.Rows(2).Cells(0).AddParagraph()
            paragraph.AppendText("画像コンテンツ コントロール")
            paragraph = table.Rows(3).Cells(0).AddParagraph()
            paragraph.AppendText("ドロップダウン リスト コンテンツコントロール")
            paragraph = table.Rows(4).Cells(0).AddParagraph()
            paragraph.AppendText("チェック ボックス コンテンツ コントロール")
            paragraph = table.Rows(5).Cells(0).AddParagraph()
            paragraph.AppendText("コンボ ボックス コンテンツ コントロール")
            paragraph = table.Rows(6).Cells(0).AddParagraph()
            paragraph.AppendText("日付選択コンテンツ コントロール")

            'セル(0,1)にテキスト コンテンツ コントロールを追加する
            paragraph = table.Rows(0).Cells(1).AddParagraph()
            Dim sdt As StructureDocumentTagInline = New StructureDocumentTagInline(document)
            paragraph.ChildObjects.Add(sdt)
            sdt.SDTProperties.SDTType = SdtType.Text
            sdt.SDTProperties.Alias = "テキスト"
            sdt.SDTProperties.Tag = "テキスト"
            sdt.SDTProperties.IsShowingPlaceHolder = True
            Dim text As SdtText = New SdtText(True)
            text.IsMultiline = False
            sdt.SDTProperties.ControlProperties = text
            Dim tr As TextRange = New TextRange(document)
            tr.Text = "ここをクリックまたはタップしてテキストを入力してください。"
            sdt.SDTContent.ChildObjects.Add(tr)

            'セル(1,1)にリッチ テキスト コンテンツ コントロールを追加する
            paragraph = table.Rows(1).Cells(1).AddParagraph()
            sdt = New StructureDocumentTagInline(document)
            paragraph.ChildObjects.Add(sdt)
            sdt.SDTProperties.SDTType = SdtType.RichText
            sdt.SDTProperties.Alias = "リッチ テキスト"
            sdt.SDTProperties.Tag = "リッチ テキスト"
            sdt.SDTProperties.IsShowingPlaceHolder = True
            text = New SdtText(True)
            text.IsMultiline = False
            sdt.SDTProperties.ControlProperties = text
            tr = New TextRange(document)
            tr.Text = "ここをクリックまたはタップしてテキストを入力してください。"
            sdt.SDTContent.ChildObjects.Add(tr)

            'セル(2,1)に画像コンテンツ コントロールを追加する
            paragraph = table.Rows(2).Cells(1).AddParagraph()
            sdt = New StructureDocumentTagInline(document)
            paragraph.ChildObjects.Add(sdt)
            sdt.SDTProperties.SDTType = SdtType.Picture
            sdt.SDTProperties.Alias = "画像"
            sdt.SDTProperties.Tag = "画像"
            Dim sdtPicture As SdtPicture = New SdtPicture()
            sdt.SDTProperties.ControlProperties = sdtPicture
            Dim pic As DocPicture = New DocPicture(document)
            pic.LoadImage("C:/Users/Sirion/Desktop/Workspace.png")
            sdt.SDTContent.ChildObjects.Add(pic)

            'セル(3,1)にドロップダウン リスト コンテンツ コントロールを追加する
            paragraph = table.Rows(3).Cells(1).AddParagraph()
            sdt = New StructureDocumentTagInline(document)
            sdt.SDTProperties.SDTType = SdtType.DropDownList
            sdt.SDTProperties.Alias = "ドロップダウン リスト"
            sdt.SDTProperties.Tag = "ドロップダウン リスト"
            paragraph.ChildObjects.Add(sdt)
            Dim sddl As SdtDropDownList = New SdtDropDownList()
            sddl.ListItems.Add(New SdtListItem("アイテムを選択してください。", "1"))
            sddl.ListItems.Add(New SdtListItem("アイテム 2", "2"))
            sddl.ListItems.Add(New SdtListItem("アイテム 3", "3"))
            sddl.ListItems.Add(New SdtListItem("アイテム 4", "4"))
            sdt.SDTProperties.ControlProperties = sddl
            tr = New TextRange(document)
            tr.Text = sddl.ListItems(0).DisplayText
            sdt.SDTContent.ChildObjects.Add(tr)

            'セル(4,1)にチェック ボックス コンテンツ コントロールを2つ追加する
            paragraph = table.Rows(4).Cells(1).AddParagraph()
            sdt = New StructureDocumentTagInline(document)
            paragraph.ChildObjects.Add(sdt)
            sdt.SDTProperties.SDTType = SdtType.CheckBox
            Dim scb As SdtCheckBox = New SdtCheckBox()
            sdt.SDTProperties.ControlProperties = scb
            tr = New TextRange(document)
            sdt.ChildObjects.Add(tr)
            scb.Checked = False
            paragraph.AppendText(" オプション 1")

            paragraph = table.Rows(4).Cells(1).AddParagraph()
            sdt = New StructureDocumentTagInline(document)
            paragraph.ChildObjects.Add(sdt)
            sdt.SDTProperties.SDTType = SdtType.CheckBox
            scb = New SdtCheckBox()
            sdt.SDTProperties.ControlProperties = scb
            tr = New TextRange(document)
            sdt.ChildObjects.Add(tr)
            scb.Checked = False
            paragraph.AppendText(" オプション 2")

            'セル(5,1)にコンボ ボックス コンテンツ コントロールを追加する。
            paragraph = table.Rows(5).Cells(1).AddParagraph()
            sdt = New StructureDocumentTagInline(document)
            paragraph.ChildObjects.Add(sdt)
            sdt.SDTProperties.SDTType = SdtType.ComboBox
            sdt.SDTProperties.Alias = "コンボ ボックス"
            sdt.SDTProperties.Tag = "コンボ ボックス"
            Dim cb As SdtComboBox = New SdtComboBox()
            cb.ListItems.Add(New SdtListItem("アイテムを選択してください。"))
            cb.ListItems.Add(New SdtListItem("アイテム 2"))
            cb.ListItems.Add(New SdtListItem("アイテム 3"))
            sdt.SDTProperties.ControlProperties = cb
            tr = New TextRange(document)
            tr.Text = cb.ListItems(0).DisplayText
            sdt.SDTContent.ChildObjects.Add(tr)

            'セル(6,1)に日付選択コンテンツ コントロールを追加する
            paragraph = table.Rows(6).Cells(1).AddParagraph()
            sdt = New StructureDocumentTagInline(document)
            paragraph.ChildObjects.Add(sdt)
            sdt.SDTProperties.SDTType = SdtType.DatePicker
            sdt.SDTProperties.Alias = "日付選択"
            sdt.SDTProperties.Tag = "日付選択"
            Dim date As SdtDate = New SdtDate()
            Date.CalendarType = CalendarType.Japan
            Date.DateFormat = "yyyy.MM.dd"
            Date.FullDate = DateTime.Now
            sdt.SDTProperties.ControlProperties = Date
            tr = New TextRange(document)
            tr.Text = "クリックまたはタップして日付を入力してください。"
            sdt.SDTContent.ChildObjects.Add(tr)

            paragraph.GetStyle().CharacterFormat.FontName = "Yu Gothic UI"

            'ユーザーがフォームフィールドを編集することのみを許可するように設定する
            document.Protect(ProtectionType.AllowOnlyFormFields, "password")

            'ドキュメントを保存する
            document.SaveToFile("Output/フォーム.docx", FileFormat.Docx2013)
        End Sub
    End Class
End Namespace
```
![Word文書でコンテンツコントロール付きフォームを作成する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/2c43f00a-2f4d-d174-ebf1-1830fd5223ac.png)

> **Free Spire.Doc for .NETは、Microsoft Wordのほとんどの機能をサポートしていますが、Microsoft Wordがインストールされている必要はありません。開発者であれば誰でも、文書処理アプリケーションを開発することができます。詳しくは[Spire.Doc for .NETのホームページ](https://jp.e-iceblue.com/introduce/spire-doc-for-net.html)をご覧ください。**