この記事では、MSWordまたはOfficeの相互運用機能を使用せずにC#またはVB.NETを使用してMSWordのメールマージを実行する方法を紹介します。 Aspose.Words for .NETは、機能が豊富で強力なWord APIであり、基本的な機能と拡張されたMSWordメールマージ機能をすべて提供します。これにより、Windowsフォーム、ASP.NET Webアプリケーション、または任意の.NET / .NET Coreアプリケーション内で、レター、エンベロープ、レポート、請求書、およびその他の種類のドキュメントを生成できます。

.NET Mail Merge APIの顕著な機能について説明しているこの記事は、次のセクションで構成されています。

メールマージとは何ですか?

メールマージは、レポート、手紙、封筒、請求書、およびその他の種類のドキュメントを自動生成する方法です。 MS Wordのメールマージを使用すると、マージフィールドを含むテンプレートドキュメントを作成し、データソースのレコードを使用してそれらのフィールドにデータを入力できます。 Mail Mergeを理解するために、10人の異なる人に手紙を送る必要があり、名前と住所のフィールドのみが更新されると仮定します。このような場合は、レターのテンプレートを作成し、データソースを使用して名前と住所のマージフィールドにデータを入力することにより、レターを動的に生成します。

メールマージのデータソース

Mail Mergeのデータは、XML、JSON、データベースなどの任意のデータソースからフェッチできます。 Aspose.Words for .NETに関する限り、ADO.NETでサポートされている任意のデータソースを使用できます。データは、DataSet、DataTable、DataView、または値の配列にロードできます。

メールマージ用のテンプレートの準備

メールマージテンプレートは、マージフィールドを含むドキュメントです。これらのフィールドには、メールマージの実行時にデータソースのデータが入力されます。テンプレートドキュメントはテンプレート形式である必要はなく、DOC/DOCXドキュメントでもかまいません。これは、メールマージのテンプレートを準備する方法です。

  • ドキュメントを開くか、MSWordで新しいドキュメントを作成します。
  • マージフィールドを追加する場所にカーソルを置きます。
  • [挿入]メニューから[フィールド]オプションを選択します。
  • [フィールド名]リストから、[MergeField]を選択します。
  • [フィールド名]にマージフィールドの名前を入力し、[OK]を押します。
  • ドキュメントを保存します。

以下は、サンプルテンプレートドキュメントのスクリーンショットです。

メールマージテンプレート

.NET MailMergeAPI-インストール

Aspose.Words for .NETは、次の方法でダウンロードまたはインストールできます。

C#を使用してWord文書でメールマージを実行する

テンプレートの準備ができたら、メールマージを実行してドキュメントを生成できます。上記のテンプレートでメールマージを実行する手順は次のとおりです。

次のコードサンプルは、C#の値の配列を使用してMS WordMailMergeを実行する方法を示しています。

// 完全な例とデータファイルについては、https://github.com/aspose-words/Aspose.Words-for-.NETにアクセスしてください。
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_MailMergeAndReporting(); 
// 既存のドキュメントを開きます。
Document doc = new Document(dataDir + "MailMerge.ExecuteArray.doc");

// 末尾と先頭の空白のメールマージ値を削除する
doc.MailMerge.TrimWhitespaces = false;

// ドキュメントのフィールドにユーザーデータを入力します。
doc.MailMerge.Execute(
    new string[] { "FullName", "Company", "Address", "Address2", "City" },
    new object[] { "James Bond", "MI5 Headquarters", "Milbank", "", "London" });

dataDir = dataDir + "MailMerge.ExecuteArray_out.doc";
// ドキュメントをWord形式でクライアントブラウザに送信し、ディスクに保存するか、現在のブラウザ内で開くかを選択できます。
doc.Save(dataDir);

メールマージ後のWord文書

C#でメールマージを実行する

C#でXMLデータソースを使用してメールマージを実行する

XMLファイルは、データの保持とインポート/エクスポートに広く使用されています。 Aspose.Words for .NETは、メールマージのデータソースとしてXMLもサポートしています。 XMLをDataSetオブジェクトに読み込み、メールマージを実行するだけです。以下は、使用するサンプルXMLファイルです。

<customers>
<customer Name="John Ben Jan" ID="1" Domain="History" City="Boston"/>
<customer Name="Lisa Lane" ID="2" Domain="Chemistry" City="LA"/>
<customer Name="Dagomir Zits" ID="3" Domain="Heraldry" City="Milwaukee"/>
<customer Name="Sara Careira Santy" ID="4" Domain="IT" City="Miami"/>
</customers>

次のコードサンプルは、XMLデータソースからデータをフェッチし、C#を使用してメールマージを実行します。

// 完全な例とデータファイルについては、https://github.com/aspose-words/Aspose.Words-for-.NETにアクセスしてください。
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_MailMergeAndReporting(); 

// データセットを作成し、XMLを読み取ります。
DataSet customersDs = new DataSet();
customersDs.ReadXml(dataDir + "Customers.xml");

string fileName = "TestFile XML.doc";
// テンプレートドキュメントを開きます。
Document doc = new Document(dataDir + fileName);

// メールマージを実行して、DataTableを使用してテンプレートにXMLからのデータを入力します。
doc.MailMerge.Execute(customersDs.Tables["Customer"]);

dataDir = dataDir + RunExamples.GetOutputFilePath(fileName);
// 出力ドキュメントを保存します。
doc.Save(dataDir);

以下は、XMLデータが入力されるメールマージテンプレートです。

XMLのメールマージテンプレート

以下は、メールマージを実行した後に得られる結果のWord文書の1ページ目です。

C#でXMLを使用してメールマージを実行する

マージフィールドのカスタムフォーマット

Aspose.Words for .NETを使用すると、実行中のメールマージをより細かく制御できます。 MailMerge.FieldMergingCallbackプロパティを使用すると、マージフィールドが検出されたときにメールマージをカスタマイズできます。 MailMerge.FieldMergingCallbackは、IFieldMergingCallback.FieldMergingおよびIFieldMergingCallback.ImageFieldMergingメソッドを実装するクラスを受け入れます。

次のコードサンプルは、メールマージ操作をカスタマイズし、このテンプレート内のセルに書式を適用する方法を示しています。

// 完全な例とデータファイルについては、https://github.com/aspose-words/Aspose.Words-for-.NETにアクセスしてください。
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_MailMergeAndReporting(); 
Document doc = new Document(dataDir + "MailMerge.AlternatingRows.doc");

// MergeFieldイベントのハンドラーを追加します。
doc.MailMerge.FieldMergingCallback = new HandleMergeFieldAlternatingRows();

// リージョンとのメールマージを実行します。
DataTable dataTable = GetSuppliersDataTable();
doc.MailMerge.ExecuteWithRegions(dataTable);
dataDir = dataDir + "MailMerge.AlternatingRows_out.doc";
doc.Save(dataDir);

以下は、HandleMergeFieldAlternatingRowsクラスの実装です。

// 完全な例とデータファイルについては、https://github.com/aspose-words/Aspose.Words-for-.NETにアクセスしてください。
private class HandleMergeFieldAlternatingRows : IFieldMergingCallback
{
    ///<summary>
    ///ドキュメントで検出されたすべてのマージフィールドに対して呼び出されます。
    ///一部のデータをメールマージエンジンに返すか、何かを行うことができます
    ///それ以外の場合はドキュメント。この場合、セルのフォーマットを変更します。
    ///</summary>
    void IFieldMergingCallback.FieldMerging(FieldMergingArgs e)
    {
        if (mBuilder == null)
            mBuilder = new DocumentBuilder(e.Document);

        // このようにして、新しい行の始まりをキャッチします。
        if (e.FieldName.Equals("CompanyName"))
        {
            // 行番号が偶数か奇数かに応じて色を選択します。
            Color rowColor;
            if (IsOdd(mRowIdx))
                rowColor = Color.FromArgb(213, 227, 235);
            else
                rowColor = Color.FromArgb(242, 242, 242);

            // 現時点では、行全体のセルプロパティを設定する方法はありません。
            // したがって、行内のすべてのセルを反復処理する必要があります。
            for (int colIdx = 0; colIdx < 4; colIdx++)
            {
                mBuilder.MoveToCell(0, mRowIdx, colIdx, 0);
                mBuilder.CellFormat.Shading.BackgroundPatternColor = rowColor;
            }

            mRowIdx++;
        }
    }

    void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs args)
    {
        // 何もしない。
    }

    private DocumentBuilder mBuilder;
    private int mRowIdx;
}     
///<summary>
///値が奇数の場合はtrueを返します。値が偶数の場合はfalse。
///</summary>
private static bool IsOdd(int value)
{
    // コードは少し複雑ですが、それ以外の場合、VBへの自動変換は機能しません。
    return ((value / 2) * 2).Equals(value);
}      
///<summary>
/// DataTableを作成し、データを入力します。
///実際には、このDataTableはデータベースから入力する必要があります。
///</summary>
private static DataTable GetSuppliersDataTable()
{
    DataTable dataTable = new DataTable("Suppliers");
    dataTable.Columns.Add("CompanyName");
    dataTable.Columns.Add("ContactName");
    for (int i = 0; i < 10; i++)
    {
        DataRow datarow = dataTable.NewRow();
        dataTable.Rows.Add(datarow);
        datarow[0] = "Company " + i.ToString();
        datarow[1] = "Contact " + i.ToString();
    }
    return dataTable;
}

C#を使用したリージョンとのメールマージ

Word文書の特定の領域にデータを入力して繰り返す必要がある場合があります。このような場合は、リージョンとのメールマージを使用できます。リージョンを作成するには、リージョンの開始と終了を指定する必要があります。そうすると、MailMegreはデータソースのレコードごとにそのリージョンを繰り返します。たとえば、次のテンプレートには、マージフィールドがそれぞれ«TableStart:Orders»、«TableEnd:Orders»および«TableStart:OrderDetails»、«TableEnd:OrderDetails»の2つのリージョンOrdersとOrderDetailsが含まれています。

地域とのメールマージ

以下は、上記のテンプレートのリージョンでMailMegreを実行するコードサンプルです。

// 完全な例とデータファイルについては、https://github.com/aspose-words/Aspose.Words-for-.NETにアクセスしてください。
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_MailMergeAndReporting();
string fileName = "MailMerge.ExecuteWithRegions.doc";
Document doc = new Document(dataDir + fileName);
 
// DataTableをデータソースとして使用します。
int orderId = 10444;
DataTable orderTable = GetTestOrder(orderId);
doc.MailMerge.ExecuteWithRegions(orderTable);
 
// DataTableを使用する代わりに、カスタムの並べ替えまたはフィルター処理用のDataViewを作成してから、メールをマージすることができます。
DataView orderDetailsView = new DataView(GetTestOrderDetails(orderId));
orderDetailsView.Sort = "ExtendedPrice DESC";
 
// メールマージ操作を実行します。
doc.MailMerge.ExecuteWithRegions(orderDetailsView);
 
// マージされたドキュメントを保存します。
dataDir = dataDir + RunExamples.GetOutputFilePath(fileName);
doc.Save(dataDir);

データベースからデータを読み取る方法は次のとおりです。

// 完全な例とデータファイルについては、https://github.com/aspose-words/Aspose.Words-for-.NETにアクセスしてください。
private static DataTable GetTestOrder(int orderId)
{
    DataTable table = ExecuteDataTable(string.Format(
        "SELECT * FROM AsposeWordOrders WHERE OrderId = {0}", orderId));
    table.TableName = "Orders";
    return table;
}
private static DataTable GetTestOrderDetails(int orderId)
{
    DataTable table = ExecuteDataTable(string.Format(
        "SELECT * FROM AsposeWordOrderDetails WHERE OrderId = {0} ORDER BY ProductID", orderId));
    table.TableName = "OrderDetails";
    return table;
}
///<summary>
///接続を作成するユーティリティ関数、コマンド、 
///コマンドを実行し、結果をDataTableに返します。
///</summary>
private static DataTable ExecuteDataTable(string commandText)
{
    // データベース接続を開きます。
    string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
        RunExamples.GetDataDir_Database() + "Northwind.mdb";
    OleDbConnection conn = new OleDbConnection(connString);
    conn.Open();

    // コマンドを作成して実行します。
    OleDbCommand cmd = new OleDbCommand(commandText, conn);
    OleDbDataAdapter da = new OleDbDataAdapter(cmd);
    DataTable table = new DataTable();
    da.Fill(table);

    // データベースを閉じます。
    conn.Close();

    return table;
}

ネストされたメールマージリージョン

ほとんどの場合、データソースにあるデータは関係の形で提供されます。たとえば、テーブル「Order」は「OrderDetails」と1対多の関係にあり、オーダー内のアイテムのレコードを保持します。このような親子関係を処理するために、ネストされたメールマージが使用されます。以下は、このシナリオに適したサンプル請求書テンプレートです。

リージョンを含むメールマージテンプレート

以下は、ネストされたメールマージに使用するサンプルXMLデータソースです。

<?xml version="1.0" encoding="utf-8"?>
<Orders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="OrdersSchema.xsd">
  <Order>
    <Number>23</Number>
    <Address>Nelson Street</Address>
    <Suburb>Howick</Suburb>
    <City>Auckland</City>
    <Phonenumber>543 1234</Phonenumber>
    <Date>03/01/2010</Date>
    <Total>14.00</Total>
    <Item>
      <Name>BBQ Chicken Pizza</Name>
      <Price>6.00</Price>
      <Quantity>1</Quantity>
      <ItemTotal>6.00</ItemTotal>
    </Item>
    <Item>
      <Name>1.5 Litre Coke</Name>
      <Price>4.00</Price>
      <Quantity>2</Quantity>
      <ItemTotal>8.00</ItemTotal>
    </Item>
  </Order>
  <Order>
    <Number>10</Number>
    <Address>Parkville Avenue</Address>
    <Suburb>Pakuranga</Suburb>
    <City>Auckland</City>
    <Phonenumber>548 7342</Phonenumber>
    <Date>05/03/2010</Date>
    <Total>6.00</Total>
    <Item>
      <Name>Hawaiian Pizza</Name>
      <Price>4.00</Price>
      <Quantity>1</Quantity>
      <ItemTotal>4.00</ItemTotal>
    </Item>
    <Item>
      <Name>Fries</Name>
      <Price>1.00</Price>
      <Quantity>2</Quantity>
      <ItemTotal>2.00</ItemTotal>
    </Item>
  </Order>
</Orders>

一方、このXMLのOrderSchema.xsdは次のとおりです。

<?xml version="1.0" encoding ="utf-8"?>
<xs:schema id="OrdersSchema"  xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="Orders">
 <xs:complexType>
 <xs:sequence>
  <xs:element name="Order">
  <xs:complexType>
  <xs:sequence>
  <xs:element name="Number"/>
  <xs:element name="Address"/>
  <xs:element name="Suburb"/>
  <xs:element name="City"/>
  <xs:element name="Phonenumber">
  <xs:element name="Date"/>
  <xs:element name="Total"/>
  <xs:element name="Item">
   <xs:complexType>
   <xs:sequence>
   <xs:element name="Name"/>
   <xs:element name="Price"/>
   <xs:element name="Quantity"/>
   <xs:element name="ItemTotal"/>
   </xs:sequence>
  </xs:complexType>
  </xs:element>
  </xs:sequence>
  </xs:complexType>
 </xs:element>
 </xs:sequence>
 </xs:complexType>
 </xs:element>
</xs:schema>

次のコードサンプルは、C#を使用してネストされたメールマージを実行するために使用されます。

// 完全な例とデータファイルについては、https://github.com/aspose-words/Aspose.Words-for-.NETにアクセスしてください。
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_MailMergeAndReporting(); 
	 
// データセットを作成し、XMLを読み取ります。
DataSet pizzaDs = new DataSet();
	 
// Datatable.TableNamesとDataSet.Relationsは、ReadXmlを介して.NETによって暗黙的に定義されます。
pizzaDs.ReadXml(dataDir + "CustomerData.xml");
string fileName = "Invoice Template.doc";

// テンプレートドキュメントを開きます。
Document doc = new Document(dataDir + fileName);
	 
// 末尾と先頭の空白のメールマージ値を削除します。
doc.MailMerge.TrimWhitespaces = false;
	 
// ネストされたメールマージをリージョンと実行します。
doc.MailMerge.ExecuteWithRegions(pizzaDs);
dataDir = dataDir + RunExamples.GetOutputFilePath(fileName);

// 出力をファイルに保存します。
doc.Save(dataDir);

Debug.Assert(doc.MailMerge.GetFieldNames().Length == 0, "There was a problem with mail merge");
Console.WriteLine("\nMail merge performed with nested data successfully.\nFile saved at " + dataDir);

メールマージ後のWord文書

以下は、メールマージを実行した後の結果のWord文書の最初のページです。

メールマージ後のWord文書

結論

Aspose.Words for .NETは、機能が豊富なMail Merge APIであり、.NETアプリケーションのすべての標準および拡張MailMerge機能を提供します。数行のコードで、さまざまなタイプのデータソースから単純または複雑なレポートをシームレスに作成できます。 .NET Mail Merge APIの詳細については、ドキュメントを参照してください。 Aspose.Words for .NETについて学ぶには、開発者向けガイドGitHubのコードサンプルから始めてください。

Aspose.Words for .NETを無料でお試しください

Aspose.Words for .NETを制限なしで試すための無料の一時ライセンスを取得できます。 今すぐ一時ライセンスを取得してください

関連項目