Microsoft Wordの差し込み印刷を活用する方法(概要)

はじめに

Microsoft Word(以下、Word)の差し込み印刷を使用すると業務の効率化が図れます。

差し込み印刷とは、英語のMail Mergeを訳したもので、Mail(郵便物)Merge(溶け込ませる)から分かるように、手紙や封筒などの郵便物となる定型書簡(以下、テンプレート)に事前に宛先などを定義(以下、フィールド)して、実際のデータを一括で溶け込ませることによって、郵便物をパーソナライズすることが出来る機能です。

本記事では、差し込み印刷の一般的な使い方から開始し、応用的な使い方および弊社のシステム製品Word APIの機能を使用した、さらに発展的な差し込み印刷を解説します。

差し込み印刷について

Wordの[差し込み文書]タブを開くと、標準で用意されている差し込み印刷の機能が表示されます。以下の図1が標準で提供されている差し込み印刷機能で、やはり郵便物関係を想定した機能であることが伺えます。

標準の差し込み印刷機能
図 1.標準の差し込み印刷機能

一般的な使用方法

一般的な使用法では、以下の手順で差し込み印刷を実行する必要があります。今回は、セミナーの案内状を関係者に送る場合を想定して説明します。

1. データソースの作成

はじめに宛先用のデータソース「セミナー登録者一覧.csv」を作成します。データソースには図2のように、関係者の”会社名”,”所属”,”役職”,”氏名”が含まれます。

セミナー登録者一覧.csv
図 2.セミナー登録者一覧.csv

2. テンプレートの作成

次に、セミナーの案内状のテンプレートとなる「第一回差し込み印刷のセミナー_template.docx」を作成します。以下の、図 3の案内文をもとにフィールドを定義してテンプレートを作成します。

セミナー案内状
図 3.セミナー案内状

以下の図 4に示す通り、[差し込み文書]-[宛先の選択]-[既存のリストを使用]から1.データソースの作成で作成したデータソース「セミナー登録者一覧.csv」を選択します。

データソースの指定
図 4. データソースの指定

データソースを指定したことによって、これまでグレーアウトしていた[差し込み文書]-[文章入力とフィールドの挿入]-[差し込みフィールドの挿入]が選択可能になりました。これで、フィールドを挿入することができるようになりました。

今回はタイトル下の1行目に”会社名”,”所属”,”役職”を、2行目に”氏名”+様を挿入します。図 5が挿入後のドキュメントです。これでテンプレートが完成しました。

第一回差し込み印刷のセミナー_template.docx
図 5.第一回差し込み印刷のセミナー_template.docx

3. 差し込み印刷の実行

2. テンプレートの作成で作成したテンプレート「第一回差し込み印刷のセミナー_template.docx(図 5)」に対して、データを差し込んでみたいと思います。

印刷する場合は図 6に示すとおり、[差し込み印刷]-[完了と差し込み]で[文書の印刷]をクリックします。これによって、[プリンターに差し込み]ダイアログが表示され、レコード単位の印刷範囲を指定してデータが差し込まれた状態のドキュメントが印刷されます。

差し込み結果の印刷
図 6.差し込み結果の印刷

データが差し込まれた状態のドキュメントを確認したい場合は、図 7に示すとおり、[差し込み印刷]-[完了と差し込み]で[個々のドキュメントの編集]をクリックします。これによって、[新規文書への差し込み]ダイアログが表示されます。[レコードの差し込み]で指定する項目によって表 1に示すように挙動が異なります。

個々のドキュメントの編集
図 7.個々のドキュメントの編集
表 1.レコードの差し込みの指定と動作結果
レコードの差し込みの指定 挙動
すべて 「セミナー登録者一覧.csv」で定義されているすべてのデータを差し込みした1つのドキュメントを新規文書として表示します。
現在のレコード [結果のプレビュー]に指定されているデータを印刷します。
最初のレコード:最後のレコード 「セミナー登録者一覧.csv」で定義されているデータのうち、最初のレコードと最後のレコードの範囲のデータを差し込みした1つのドキュメントを新規文書として表示します。

このとき表示されるドキュメントは新規文書として表示されるため、編集してもテンプレートに反映されることはありません。表 1にあるとおり、レコードごとにドキュメントを保存したい場合は最初のレコードと最後のレコードで1レコードずつ指定していくことでできます。

応用例

ここまでは、データソースの作成⇒指定の流れでテンプレートに使用するフィールドの読み込みを行いました。しかし、Wordには直接フィールドを指定する方法があります。

図 8に示す通り、[挿入]-[クイックパーツ]-[フィールド]を選択し表示される[フィールド]ダイアログで、[分類]で”差し込み印刷”を選択し、[フィールドの名前]で”MergeField”を選択することによって、テンプレートで使用する差し込み印刷フィールドを定義することができます。

このダイアログは、ドキュメント中の差し込み印刷フィールドを右クリックして[フィールドの編集]をクリックすることで表示することができます。

フィールドの直接定義
図 8.フィールドの直接定義

このダイアログからは、差し込んだデータに対する書式やオプションを選択することができます。それぞれの挙動については以下の表 2表 3に記載します。※表 2で指定した内容は表示されるフィールド名にも適用されます。

表 2. 書式指定と適用結果の例
書式の指定 差し込むデータ 表示されるデータ
大文字 apple APPLE
小文字 APPLE apple
1文字目のみ大文字 green apple Green apple
タイトル文字 green apple Green Apple
半角文字 Apple Apple
全角文字 Apple Apple
表 3.フィールドオプションの指定と動作結果
フィールドオプション 挙動
前に挿入する文字列 データの前に指定した文字列が表示されます。
後に挿入する文字列 データの後ろに指定した文字列が表示されます。
標準のフィールド名を使う 住所内の-を表示します。
数字を漢数字に変換する 数字を漢数字に変換します。

Word APIの活用

これまで、「差し込み印刷のセミナー」の案内のテンプレートについて説明してきましたが、Word固有の差し込み印刷機能では対応できない問題点があります。本節では、各項にてWord APIを活用して問題点を解決する方法を説明します。

1. データ毎にドキュメントを保存

差し込み印刷した結果のWordドキュメントを対象者にメールで添付する場合を考えましょう。この場合、[新規文書への差し込み]ダイアログで人数分、[最初のレコード]と[最後のレコード]を入力して、[OK]をクリックして、名前を付けて保存する必要があります。これでは参加者に比例して作業が増えてしまいます。

しかし、Word APIのAHSimpleDataMergerクラスでは、複数レコードの差し込み印刷データの出力方法の指定でデータごとに出力することができます。

「一般的な使用方法」1.データソースの作成で作成したデータソース「セミナー登録者一覧.csv」と、2.テンプレートの作成で作成したテンプレート「第一回差し込み印刷のセミナー_template.docx」を利用して、参加者に「○○_第一回差し込み印刷のセミナーのご案内.docx」を作りたい場合は以下のように実行します。

C#のサンプルコード 1.データ毎にドキュメント出力するコード

var inputParam = new InputParam()
{
    InputFilePath = "第一回差し込み印刷のセミナー_template.docx"
};

var outputParam = new OutputParam()
{
    OutputFilePath = "第一回差し込み印刷のセミナーのご案内.docx",
    FileAddColumn = "氏名"
};

var ahSimpleDataMerger = new AHSimpleDataMerger()
{
    OutputMode = SimpleTypeOption.OutputMode.PerData
};

ahSimpleDataMerger.CreateSimpleTypeDataFromCSV(
    "セミナー登録者一覧.csv",
    CommonOption.DataFileEncoding.SJIS
);

ahSimpleDataMerger.ExecuteSimpleDataMerge(
    inputParam,
    outputParam
);
                            

2. データが動的に増減するフィールドに対応

セミナーならば、開催日時の情報やセミナー内容の記載があるかもしれません。このときデータが動的に増減するフィールドにはWordの差し込み印刷機能では対応できませんが、Word APIのAHCompoundDataMergerクラスではデータが動的に増減するフィールドに対応することができます。

はじめにセミナー案内に関するテンプレートとして、図 9のようなテンプレート「セミナー_template.docx」を作成したとします。「一般的な使用方法」2. テンプレートの作成の「第一回差し込み印刷のセミナー_template.docx」に比べて、”作成日”等の細かい違い以外はありますが、注目すべき大きな違いは、”x回”、”セミナー内容”、”summary”、”開催項目”と”開催情報”フィールドです。

これはセミナー内容や開催回数ごとに変わるセミナー内容(”summary”)と開催日時などの情報(”開催項目”と”開催情報”)に対応したテンプレートを想定しています。そして、”summary”、”開催項目”と”開催情報”はデータが動的に増減するフィールドです。

セミナー_template.docx
図 9.セミナー_template.docx

次にデータソースを作成します。Word APIのAHCompoundDataMergerクラスでは、データソースがCSVファイルの場合は、サブデータソースが必要です。サブデータソースとはデータが動的に増減するフィールドに対応するデータです。

このため、今回のテンプレートでは2つのサブデータソースが必要です。また、サブデータソースには、メインデータソースのキーとその値が必要です。今回は、氏名をキーとします。

以下が3つのデータソースで、それぞれ「MainData.csv」、「SubData_summary.csv」、「SubData_Info.csv」とします。

MainData.csv

作成日,会社名,所属,役職,氏名,自社名,自氏名,x回,セミナー内容

2021/11/1,株式会社XXX建設,総務部,,関 京平,XYZコンサルティング,斎藤 伸行,第一回,差し込み印刷のセミナー

2021/11/1,ZZZYYYY商事,経理部,,神田 聡志,XYZコンサルティング,斎藤 伸行, 第一回,差し込み印刷のセミナー

2021/11/1,IJKグループ,営業部,課長,小池 裕,XYZコンサルティング,斎藤 伸行, 第一回,差し込み印刷のセミナー

SubData_summary.csv

氏名,summary

関 京平,差し込み印刷とは?

関 京平,Microsoft Wordでの操作

関 京平,オプションとは?

神田 聡志,差し込み印刷とは?

神田 聡志,Microsoft Wordでの操作

神田 聡志,オプションとは?

小池 裕,差し込み印刷とは?

小池 裕,Microsoft Wordでの操作

小池 裕,オプションとは?

SubData_Info.csv

氏名,開催項目,開催情報

関 京平,開催日,2021/11/10

関 京平,時間,16:00~18:00

関 京平,場所,XXビル5F A会議室(東京市港町)

神田 聡志,開催日,2021/11/10

神田 聡志,時間,16:00~18:00

神田 聡志,場所,XXビル5F A会議室(東京市港町)

小池 裕,開催日,2021/11/10

小池 裕,時間,16:00~18:00

小池 裕,場所,XXビル5F A会議室(東京市港町)

「Word APIの活用」1. データ毎にドキュメントを保存同様に参加者に「○○_第一回差し込み印刷のセミナーのご案内.docx」を作りたい場合は以下のように実行します。

C#のサンプルコード 2.データが動的に増減するフィールドの差し込み印刷

var inputParam = new InputParam()
{
    InputFilePath = "セミナー_template.docx"
};

var outputParam = new OutputParam()
{
    OutputFilePath = "第一回差し込み印刷のセミナーのご案内.docx",
    FileAddColumn = "氏名"
};

var ahCompoundDataMerger = new AHCompoundDataMerger()
{
    LinkingKey = "氏名",
    RepeatingRowsPattern = CompoundTypeOption.RepeatingRowsPattern.Variable
};

ahCompoundDataMerger.CreateDetailTypeDataFromCSV(
    "MainData.csv",
    CommonOption.DataFileEncoding.SJIS,
    "SubData_summary.csv","SubData_Info.csv"
);

ahCompoundDataMerger.ExecuteCompoundDataMerge(
    inputParam,
    outputParam
);
                            
実行結果
図 10.実行結果

3. 差し込み印刷フィールドの取得

これまでは主にテンプレートの作成方法について説明してきましたが、ここでは、テンプレートの差し込み印刷フィールドの管理について説明します。

「応用例」のように直接差し込み印刷フィールドを挿入して、書式が指定されている差し込み印刷フィールドも存在する図 11のテンプレート「Invoice_template.docx」について考えてみます。

Invoice_template.docx
図 11.Invoice_template.docx

このとき問題が2点あります。1つはデータソースが存在しない点です。このため、差し込み印刷フィールドと一致したデータソースを作成するためには「Invoice_template.docx」を参照しながら、手入力またはコピーアンドペーストをしなければなりません。差し込み印刷フィールドの数は29個ですので、不可能ではありませんが大変な作業です。

ここでもう1つの問題が発生します。それは書式の指定です。赤枠は、フィールド名は半角で定義していて、書式に”全角”を指定しているフィールドです。対して、青枠は、フィールド名が全角で定義していて、書式にはなにも指定していないフィールドです。

Wordの通常の表示形式ではこの違いが分かりません。そのため、手入力およびコピーアンドペーストでは赤枠の部分のフィールド名には乖離(正:P_Code1、コピーアンドペースト:P_Code1)が出てしまいます。

この問題を回避する方法は、2つあります。1つは、フィールドコードを [Alt+F9]で表示する方法で、もう1つは、各フィールドを選択状態にして、[右クリック]⇒[フィールドの編集]で表示される[フィールド]ダイアログの[フィールド名]をコピーする方法です。しかし、どちらの方法も大変です。

Word APIのAHSimpleDataMergerクラスでは、GetDataMergeFieldsメソッドを用いてドキュメントに定義されているフィールド一覧を取得することができます。サンプルコード 3に示す方法で実行結果の内容を取得することができます。

C#のサンプルコード 3.差し込み印刷フィールドの取得

var fields = AHSimpleDataMerger.GetDataMergeFields("Invoice_template.docx");

System.Console.WriteLine(string.Join(“,”, fields));
                            

実行結果

税対象,額,消費税額,請求日,支払期限,銀行名,支店名,口座名義,口座番号,品名,区分,単価,数量,金額,P_Code1,Add1,宛先会社名,宛先部署,宛先氏名,販売元ロゴ,販売元会社名,P_Code2,Add2,謝辞,請求額,請求元ロゴ,問合会社名,P_Code3,Add3