チュートリアル

簡単にライブラリーを使用するためのチュートリアルコレクション

チュートリアル»C++»Spire.Doc for C++»フォームフィールド»C++:Word 文書内に記入可能なフォームを作成する方法
2023-03-30

C++:Word 文書内に記入可能なフォームを作成する方法

Word では、他の人が情報を入力するために使用できるフォームを作成することができます。記入可能なフォームは、多くの人からデータやフィードバックを収集する必要があり、書式に一貫性があることを確認したい場合に特に便利です。ここでは、Word ドキュメントで記入可能なフォームを作成するために必要なツールを紹介します。

  • コンテンツ コントロール:ユーザーが情報を入力するためのフォーム領域です。
  • :フォームのテキストやフォームフィールドを整列させ、フォームの枠線やセルなどの要素を形成するために使用します。
  • 保護:ユーザーがフィールドに入力することを許可しますが、ドキュメントの他の部分を変更することはできません。

Word のコンテンツコントロールは、ユーザーが構造化ドキュメントを作成するために使用することができるコンテンツ コンテナです。 構造化されたドキュメントは、ドキュメントのどこにコンテンツが表示されるかを制御します。Word 2013 では、基本的に10種類のコンテンツ コントロールが利用可能です。この記事では、Spire.Doc for C++ を使用して、以下の7つの一般的なコンテンツ コントロールで構成される Word ドキュメントに記入可能なフォームを作成する方法を説明します。

コンテンツ コントロール 説明
テキスト 書式なしテキストを入力できるようにします。
リッチ テキスト 書式付きテキストのほか、表、画像、コンテンツ コントロールなどのコンテンツを入力できるようにします。
画像 1枚の画像を入力できるようにします。
ドロップダウン リスト 定義済みのリストから項目を選択できるようにします。
コンボ ボックス 定義済みのリストから項目を選択したり、ユーザー自身が情報を入力したりすることができるようにします。
チェック ボックス ユーザーがチェックできるようにします。
日付選択 カレンダーから日付を選択できるようにします。

Spire.PDF for C++ をインストールします

Spire.Doc for C++ をアプリケーションに組み込むには、2つの方法があります。一つは NuGet 経由でインストールする方法、もう一つは当社のウェブサイトからパッケージをダウンロードし、ライブラリをプログラムにコピーする方法です。NuGet 経由のインストールの方が便利で、より推奨されます。詳しくは、以下のリンクからご覧いただけます。

Spire.Doc for C++ を C++ アプリケーションに統合する方法

Word ドキュメント内に記入可能なフォームを作成する

Spire.Doc for C++ が提供する StructureDocumentTagInline クラスは、段落内の DrawingML やフィールドなどのインライン構造用の構造化ドキュメントタグを作成するために使用されます。 このクラスの下にある SDTPropertiesSDTContent プロパティでは、対応する構造化ドキュメントタグのプロパティとコンテンツを設定することができます。 以下は、Word ドキュメントで記入可能なフォームを作成するための詳細な手順です。

  • Document のオブジェクトを作成します。
  • Document->AddSection() メソッドを使用して、セクションを追加します。
  • Section->AddTable() メソッドを使用して、テーブルを追加します。
  • TableCell->AddParagraph() メソッドを使用して、セルに段落を追加します。
  • StructureDocumentTagInline のオブジェクトを作成し、Paragraph->GetChildObjects()->Add() メソッドを使用して子オブジェクトとして段落に追加します。
  • StructureDocumentTagInline のオブジェクトの SDTPropertiesSDTContent プロパティを使用して、構造化ドキュメントタグのプロパティとコンテンツを設定します。 構造化ドキュメントタグのタイプは、SDTProperties->SetSDTType() メソッドで設定することができます。
  • Document->Protect() メソッドを使用して、ユーザーがフォームフィールド外のコンテンツを編集することを許可しないように設定します。
  • Document->SaveToFile() メソッドを使用して、ドキュメントを保存します。
  • C++
#include "Spire.Doc.o.h";

using namespace Spire::Doc;
using namespace std;

int main() {

    //Documentのオブジェクトを作成する
    Document* doc = new Document();

    //セクションを追加する
    Section* section = doc->AddSection();

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

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

    //セル(0,1)にテキスト コンテンツ コントロールを追加する
    paragraph = table->GetRows()->GetItem(0)->GetCells()->GetItem(1)->AddParagraph();
    StructureDocumentTagInline* sdt = new StructureDocumentTagInline(doc);
    paragraph->GetChildObjects()->Add(sdt);
    sdt->GetSDTProperties()->SetSDTType(SdtType::Text);
    sdt->GetSDTProperties()->SetAlias(L"テキスト");
    sdt->GetSDTProperties()->SetTag(L"テキスト");
    sdt->GetSDTProperties()->SetIsShowingPlaceHolder(true);
    SdtText* text = new SdtText(true);
    text->SetIsMultiline(false);
    sdt->GetSDTProperties()->SetControlProperties(text);
    TextRange* tr = new TextRange(doc);
    tr->SetText(L"ここをクリックまたはタップしてテキストを入力してください。");
    sdt->GetSDTContent()->GetChildObjects()->Add(tr);

    //セル(1,1)にリッチ テキスト コンテンツ コントロールを追加する
    paragraph = table->GetRows()->GetItem(1)->GetCells()->GetItem(1)->AddParagraph();
    sdt = new StructureDocumentTagInline(doc);
    paragraph->GetChildObjects()->Add(sdt);
    sdt->GetSDTProperties()->SetSDTType(SdtType::RichText);
    sdt->GetSDTProperties()->SetAlias(L"リッチ テキスト");
    sdt->GetSDTProperties()->SetTag(L"リッチ テキスト");
    sdt->GetSDTProperties()->SetIsShowingPlaceHolder(true);
    text = new SdtText(true);
    text->SetIsMultiline(false);
    sdt->GetSDTProperties()->SetControlProperties(text);
    tr = new TextRange(doc);
    tr->SetText(L"ここをクリックまたはタップしてテキストを入力してください。");
    sdt->GetSDTContent()->GetChildObjects()->Add(tr);

    //セル(2,1)に画像コンテンツ コントロールを追加する
    paragraph = table->GetRows()->GetItem(2)->GetCells()->GetItem(1)->AddParagraph();
    sdt = new StructureDocumentTagInline(doc);
    paragraph->GetChildObjects()->Add(sdt);
    sdt->GetSDTProperties()->SetSDTType(SdtType::Picture);
    sdt->GetSDTProperties()->SetAlias(L"画像");
    sdt->GetSDTProperties()->SetTag(L"画像");
    SdtPicture* sdtPicture = new SdtPicture();
    sdt->GetSDTProperties()->SetControlProperties(sdtPicture);
    DocPicture* pic = new DocPicture(doc);
    pic->LoadImageSpire(L"C:/Workspace.png");
    sdt->GetSDTContent()->GetChildObjects()->Add(pic);

    //セル(3,1)にドロップダウン リスト コンテンツ コントロールを追加する
    paragraph = table->GetRows()->GetItem(3)->GetCells()->GetItem(1)->AddParagraph();
    sdt = new StructureDocumentTagInline(doc);
    sdt->GetSDTProperties()->SetSDTType(SdtType::DropDownList);
    sdt->GetSDTProperties()->SetAlias(L"ドロップダウン リスト");
    sdt->GetSDTProperties()->SetTag(L"ドロップダウン リスト");
    paragraph->GetChildObjects()->Add(sdt);
    SdtDropDownList* sddl = new SdtDropDownList();
    sddl->GetListItems()->Add(new SdtListItem(L"アイテムを選択してください。", L"1"));
    sddl->GetListItems()->Add(new SdtListItem(L"アイテム 2", L"2"));
    sddl->GetListItems()->Add(new SdtListItem(L"アイテム 3", L"3"));
    sddl->GetListItems()->Add(new SdtListItem(L"アイテム 4", L"4"));
    sdt->GetSDTProperties()->SetControlProperties(sddl);
    tr = new TextRange(doc);
    tr->SetText(sddl->GetListItems()->GetItem(0)->GetDisplayText());
    sdt->GetSDTContent()->GetChildObjects()->Add(tr);

    //セル(4,1)にチェック ボックス コンテンツ コントロールを2つ追加する
    paragraph = table->GetRows()->GetItem(4)->GetCells()->GetItem(1)->AddParagraph();
    sdt = new StructureDocumentTagInline(doc);
    paragraph->GetChildObjects()->Add(sdt);
    sdt->GetSDTProperties()->SetSDTType(SdtType::CheckBox);
    SdtCheckBox* scb = new SdtCheckBox();
    sdt->GetSDTProperties()->SetControlProperties(scb);
    tr = new TextRange(doc);
    sdt->GetChildObjects()->Add(tr);
    scb->SetChecked(false);
    paragraph->AppendText(L" オプション 1");

    paragraph = table->GetRows()->GetItem(4)->GetCells()->GetItem(1)->AddParagraph();
    sdt = new StructureDocumentTagInline(doc);
    paragraph->GetChildObjects()->Add(sdt);
    sdt->GetSDTProperties()->SetSDTType(SdtType::CheckBox);
    scb = new SdtCheckBox();
    sdt->GetSDTProperties()->SetControlProperties(scb);
    tr = new TextRange(doc);
    sdt->GetChildObjects()->Add(tr);
    scb->SetChecked(false);
    paragraph->AppendText(L" オプション 2");

    //セル(5,1)にコンボ ボックス コンテンツ コントロールを追加する。
    paragraph = table->GetRows()->GetItem(5)->GetCells()->GetItem(1)->AddParagraph();
    sdt = new StructureDocumentTagInline(doc);
    paragraph->GetChildObjects()->Add(sdt);
    sdt->GetSDTProperties()->SetSDTType(SdtType::ComboBox);
    sdt->GetSDTProperties()->SetAlias(L"コンボ ボックス");
    sdt->GetSDTProperties()->SetTag(L"コンボ ボックス");
    SdtComboBox* cb = new SdtComboBox();
    cb->GetListItems()->Add(new SdtListItem(L"アイテムを選択してください。"));
    cb->GetListItems()->Add(new SdtListItem(L"アイテム 2"));
    cb->GetListItems()->Add(new SdtListItem(L"アイテム 3"));
    sdt->GetSDTProperties()->SetControlProperties(cb);
    tr = new TextRange(doc);
    tr->SetText(cb->GetListItems()->GetItem(0)->GetDisplayText());
    sdt->GetSDTContent()->GetChildObjects()->Add(tr);

    //セル(6,1)に日付選択コンテンツ コントロールを追加する
    paragraph = table->GetRows()->GetItem(6)->GetCells()->GetItem(1)->AddParagraph();
    sdt = new StructureDocumentTagInline(doc);
    paragraph->GetChildObjects()->Add(sdt);
    sdt->GetSDTProperties()->SetSDTType(SdtType::DatePicker);
    sdt->GetSDTProperties()->SetAlias(L"日付選択");
    sdt->GetSDTProperties()->SetTag(L"日付選択");
    SdtDate* date = new SdtDate();
    date->SetCalendarType(CalendarType::Default);
    date->SetDateFormatSpire(L"yyyy.MM.dd");
    date->SetFullDate(DateTime::GetNow());
    sdt->GetSDTProperties()->SetControlProperties(date);
    tr = new TextRange(doc);
    tr->SetText(L"クリックまたはタップして日付を入力してください。");
    sdt->GetSDTContent()->GetChildObjects()->Add(tr);

    paragraph->GetStyle()->GetCharacterFormat()->SetFontName(L"Yu Gothic UI");

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

    //ドキュメントを保存する
    doc->SaveToFile(L"Output/フォーム.docx", FileFormat::Docx2013);
    doc->Close();
    delete doc;
}

C++:Word 文書内に記入可能なフォームを作成する方法

一時ライセンスを申請する

結果ドキュメントから評価メッセージを削除したい場合、または機能制限を取り除く場合は、についてこのメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。にお問い合わせ、30 日間有効な一時ライセンスを取得してください。

Read 448 times