記入可能なフォームは、レビュー、フィードバック、その他の情報を他の人から収集するのに便利です。ユーザーが特定のフォーマットでデータを記入し、フォームフィールド以外のコンテンツは変更しないように、Word文書で記入可能なフォームを作成することができます。今回は、無料ツール「Free Spire.Doc for .NET」を使って、Word文書に記入可能なフォームを作成する方法について説明します。
フォームフィールドの作成には、テーブルとコンテンツ コントロールが必要です。また、フォームを作成した後は、フォーム フィールド以外の内容を変更できないように、文書をロックする必要があります。
以下、本記事の例で使用した7つのコンテンツ コントロールの情報です。
コンテンツ コントロール | 説明 |
---|---|
テキスト | 書式なしテキストを入力できるようにします。 |
リッチ テキスト | 書式付きテキストのほか、表、画像、コンテンツ コントロールなどのコンテンツを入力できるようにします。 |
画像 | 1枚の画像を入力できるようにします。 |
ドロップダウン リスト | 定義済みのリストから項目を選択できるようにします。 |
コンボ ボックス | 定義済みのリストから項目を選択したり、ユーザー自身が情報を入力したりすることができるようにします。 |
チェック ボックス | ユーザーがチェックできるようにします。 |
日付選択 | カレンダーから日付を選択できるようにします。 |
【依存関係の追加】
まず、Free Spire.Doc for.NET パッケージに含まれるDLLファイルを.NETプロジェクトにリファレンスとして追加する必要があります。DLLファイルは、このリンクからダウンロードするか、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#
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
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
Free Spire.Doc for .NETは、Microsoft Wordのほとんどの機能をサポートしていますが、Microsoft Wordがインストールされている必要はありません。開発者であれば誰でも、文書処理アプリケーションを開発することができます。詳しくはSpire.Doc for .NETのホームページをご覧ください。