データ ストア内の項目を SQL Server データベースに接続する

Word を使用すると、データドリブン ソリューションを作成してドキュメントを生成できます。 カスタム XML 部分を含むテンプレート文書を作成し、XML マッピングを使用してカスタム XML データに連結するコンテンツ コントロールを使用できます。 このコンテキストでは "テンプレート " という用語が使用されますが、このドキュメントは Word テンプレートではありませんが、Word テンプレート ドキュメントのいくつかの特性を共有します。 テンプレート文書を作成したら、それに基づいて新しい文書を作成する Web ベースのマネージ アプリケーションを作成できます。 マネージド Web ベースのアプリケーションは、テンプレート ドキュメントを開き、Microsoft SQL Server データベースからデータを取得して新しいカスタム XML パーツを構築し、テンプレート ドキュメントのカスタム XML パーツを新しいパーツに置き換え、テンプレート ドキュメントを新しい Word ドキュメントとして保存します。

このチュートリアルでは、新しいテンプレート ドキュメントを作成する方法と、Microsoft SQL Server データベースに格納されているデータを表示するドキュメントを生成するサーバー側アプリケーションを作成する方法について説明します。 このアプリケーションをビルドするには、次の 2 つのタスクを完了します。

  1. Word テンプレート ドキュメントを作成します。

  2. Microsoft SQL Server データベースからデータをプルし、Word テンプレート ドキュメントに基づいて新しいドキュメントを生成するサーバー側の Web ベースのアプリケーションを作成します。

このサンプルで使用されているプログラミング オブジェクトは次のとおりです。

コンテンツ コントロールの詳細については、「コンテンツ コントロールを操作する」を参照してください。

ビジネス シナリオ: 顧客文書ジェネレーターを作成する

データ ストア内のアイテムを Microsoft SQL Server データベースに接続する Word ドキュメント ジェネレーターを作成するには、まず、XML ファイルにマップするコンテンツ コントロールを含むテンプレート顧客レター ジェネレーター ドキュメントを作成します。 次に、会社名を選択してカスタム文書を生成できる Web ベースの文書生成アプリケーションを作成します。 アプリケーションは、Microsoft SQL Server データベースから顧客データを取得し、顧客レター ジェネレーターを使用して、ユーザーの選択に基づいて顧客データを表示する新しいドキュメントを作成します。 この文書には次の情報が表示されます。

  • 会社名
  • Contact Name
  • Contact Title
  • 電話番号

Word 文書ジェネレーターを作成するには、次の一般的な手順を使用します。

カスタム文書ジェネレーターを作成して各コンテンツ コントロールの XML マッピングを定義するには

  1. Word を開き、空白の文書を作成します。

  2. データ ストアのノードに連結するテキスト形式のコンテンツ コントロールを文書に追加します。

    コンテンツ コントロールとは、定義済みのコンテンツのことです。 Word には、いくつかの種類のコンテンツ コントロールが用意されています。 これには、テキスト ブロック、チェック ボックス、ドロップダウン メニュー、コンボ ボックス、カレンダー コントロール、画像が含まれます。 これらのコンテンツ コントロールを XML ファイルの要素にマップできます。 XPath 式を使用すると、XML ファイル内のコンテンツをコンテンツ コントロールにプログラムでマップできます。 この言語で小さくて簡単なアプリケーションを記述するだけで、文書内のデータを操作して変更することができます。

    コンテンツ コントロールを追加するには、[開発] タブの [コントロール] グループで [テキスト コンテンツ コントロール] をクリックします。

    4 つのプレーン テキスト コンテンツ コントロールをドキュメントに追加します。 各コントロールを追加したら、それぞれにタイトルを割り当てます。コントロールをクリックします。[コントロール] グループ 、[ プロパティ] をクリックします。[ タイトル ] ボックスに、次の一覧に示すようにコントロールのタイトルを入力します。[OK] をクリック します

    • Company Name
    • Contact Name
    • Contact Title
    • 電話番号

    次のVisual Basic for Applications (VBA) コードを使用して、ドキュメントにコンテンツ コントロールを追加することもできます。 Alt キーを押しながら F11 キーを押して Visual Basic エディターを開き、コード ウィンドウにコードを貼り付け、プロシージャ内の任意の場所をクリックし、F5 キーを押してコードを実行し、テンプレート ドキュメントに 4 つのコンテンツ コントロールを追加します。

         Sub AddContentControls()
    
             Selection.Range.ContentControls.Add (wdContentControlText)
             Selection.ParentContentControl.Title = "Company Name"
             Selection.ParentContentControl.Tag = "Company Name"
             Selection.MoveDown Unit:=wdLine, Count:=1
             Selection.TypeParagraph
    
             Selection.Range.ContentControls.Add (wdContentControlText)
             Selection.ParentContentControl.Title = "Contact Name"
             Selection.ParentContentControl.Tag = "Contact Name"
             Selection.MoveDown Unit:=wdLine, Count:=1
             Selection.TypeParagraph
    
             Selection.Range.ContentControls.Add (wdContentControlText)
             Selection.ParentContentControl.Title = "Contact Title"
             Selection.ParentContentControl.Tag = "Contact Title"
             Selection.MoveDown Unit:=wdLine, Count:=1
             Selection.TypeParagraph
    
             Selection.Range.ContentControls.Add (wdContentControlText)
             Selection.ParentContentControl.Title = "Phone Number"
             Selection.ParentContentControl.Tag = "Phone Number"
             Selection.MoveDown Unit:=wdLine, Count:=1
             Selection.TypeParagraph
    
         End Sub
    
  3. コンテンツ コントロールの XML マッピングを設定します。

    XML マッピングは、文書と XML ファイルの間にリンクを作成するための Word の機能です。 これにより、文書の書式設定とカスタム XML データの間で、データ/表示が完全に分離されます。

    カスタム XML パーツを読み込むには、まず CustomXMLParts コレクションの Add メソッドを使用して、Document オブジェクトに新しいデータ ストアを追加する必要があります。 これにより、新しい空のデータ ストアがドキュメントに追加されます。 空であるため、まだ使用できません。 次に、XML ファイルへの有効なパスをパラメーターとして使用する CustomXMLPart オブジェクトの Load メソッドを呼び出して、XML ファイルからデータ ストアにカスタム XML パーツをみ込む必要があります。

  4. CustomerLetterGenerator.docm という名前で文書を保存します。

    注:

    VBA コードが含まれているため、マクロが有効なドキュメント ファイル (.docm)としてドキュメントを保存する必要があります|

次に、サンプルのカスタム XML ファイルにコンテンツ コントロールをマップする手順を示します。 この手順では、有効なカスタム XML ファイルを作成して保存し、Visual Basic for Applications (VBA) コードを使用して、マップする情報を含むテンプレート文書のデータ ストアに追加します。

コンテンツ コントロールの XML マッピングを設定するには

  1. テキスト ファイルを作成し、CustomerData.xml という名前で保存します。

  2. 次の XML コードをテキスト ファイルにコピーし、ファイルを保存します。

         <?xml version="1.0"?> 
         <Customer> 
         <CompanyName>Alfreds Futterkiste</CompanyName> 
         <ContactName>Maria Anders</ContactName> 
         <ContactTitle>Sales Representative</ContactTitle> 
         <Phone>030-0074321</Phone> 
         </Customer> 
    
  3. Alt キーを押しながら F11 キーを押して Visual Basic エディターを開き、次のコードをコード ウィンドウに貼り付け、プロシージャ内の任意の場所をクリックし、F5 キーを押してコードを実行し、XML ファイルをテンプレート ドキュメントにアタッチして、使用可能なデータ ストア項目になるようにします。

         Public Sub LoadXML()
    
         ' Load CustomerData.xml file
         ActiveDocument.CustomXMLParts.Add
         ActiveDocument.CustomXMLParts(ActiveDocument.CustomXMLParts.Count).Load ("C:\CustomerData.xml")
         End Sub
    

    注:

    ドキュメントで常に作成される既定のカスタム XML パーツは、少なくとも 3 つあります。"カバー ページ"、"Doc プロパティ"、および "アプリ プロパティ" です。 さらに、いくつかの要因に応じて、特定のコンピューターに他のさまざまなカスタム XML パーツを作成できます。 これには、インストールされるアドオン、SharePoint との接続などが含まれます。 前のコードの CustomXMLParts コレクションで Add メソッドを呼び出すと、XML ファイルが読み込まれる追加の XML パーツが追加されます。 その部分では、次のコード行で Load メソッドが呼び出されます。

    XML ファイルを読み込むパーツのインデックス番号を決定するには、カスタム XML パーツの数を Load メソッドに渡す必要があります。 ActiveDocument.CustomXMLParts(ActiveDocument.CustomXMLParts.Count).Load ("C:\CustomerData.xml")

  4. 追加したデータ ストアのノードを参照するコンテンツ コントロールの XML マッピングを設定します。

    XML マッピングを作成するには、XPath 式を使用して、コンテンツ コントロールをマッピングするカスタム XML データ部分のノードを指定します。 文書にデータ ストアを追加し、有効な XML ファイルを参照するようにそのデータ ストアを設定すると、いずれかのノードをコンテンツ コントロールマップできる状態になります。

    この操作を行うには、XMLMapping オブジェクトの SetMapping メソッドを使用して、有効な XPath を含む StringContentControl オブジェクトに渡します (ContentControl オブジェクトの XMLMapping プロパティを使用します)。 Visual Basic エディターを開き、次の VBA コードを実行して、データ ストアの項目にコンテンツ コントロールを連結します。

         Public Sub MapXML()
    
             Dim strXPath1 As String
             strXPath1 = "/Customer/CompanyName"
             ActiveDocument.ContentControls(1).XMLMapping.SetMapping strXPath1
    
             Dim strXPath2 As String
             strXPath2 = "/Customer/ContactName"
             ActiveDocument.ContentControls(2).XMLMapping.SetMapping strXPath2
    
             Dim strXPath3 As String
             strXPath3 = "/Customer/ContactTitle"
             ActiveDocument.ContentControls(3).XMLMapping.SetMapping strXPath3
    
             Dim strXPath4 As String
             strXPath4 = "/Customer/Phone"
             ActiveDocument.ContentControls(4).XMLMapping.SetMapping strXPath4
    
    

SQL Server データベースからデータを取得して新しい文書を生成するサーバー側アプリケーションを作成する

ここでは、ユーザーが会社名を選択してカスタム レターを生成できる Web ベースのアプリケーションを作成します。 Web ベースのアプリケーションは、SQL Server データベースから顧客データを取得し、顧客レター テンプレート ドキュメントを開き、ユーザーの選択に基づいて顧客データを表示する新しいドキュメントを作成します。 この Web ベースのアプリケーションでは、Word または VBA を使用する必要はありません。 お気に入りのマネージド コード (Visual Basic .NET または C#) 言語を使用して、このアプリケーションをビルドします。

注:

ここに示す Web ベース アプリケーションでは、Northwind.mdf データベースからデータを取得します。 このデータベースは、以前のバージョンの SQL Server および Office と共にインストールされました。 コンピューターに Northwind データベースがない場合は、次のサイトからダウンロードできます: Northwind データベース

SQL Server データベースからデータを取得して新しい文書を生成するサーバー側アプリケーションを作成するには

  1. Visual Studio または Visual Web 開発者を開きます。

  2. ASP.NET Web アプリケーションを作成し、SqlServerSample という名前を付けます。

    次の手順では、ASP.NET Web アプリケーションをSQL Server データベースに接続します。

  3. Visual Studio プロジェクトの Web.config ファイルに次の接続文字列を追加します。

         <connectionStrings>
         <add name="NorthwindConnectionString"
             connectionString="data source=(local);database=Northwind; integrated security=SSPI;persist security info=false;"
             providerName="System.Data.SqlClient" />
         </connectionStrings>
    
  4. Visual Studio プロジェクトの App_Data フォルダーに CustomerLetterGenerator.docm 文書を追加します。これを行うには、[App_Data] を右クリックし、[追加] をポイントして [既存の項目] をクリックします。次に、文書が保存されている場所を参照して選択し、[追加] をクリックします。

  5. プロジェクトに WindowsBase.dll への参照を追加します。これを行うには、[参照] を右クリックし、[参照の追加] をクリックします。次に、[.NET] タブをクリックし、[WindowsBase] を選択して [OK] をクリックします。

  6. Microsoft .NET Framework 4.0 をダウンロードしてインストールする

  7. Web.config ファイルで、アセンブリを次のように構成します。

         <compilation debug="false">
         <assemblies>
             <add assembly="WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
         </assemblies>
         </compilation>
    
  8. プロジェクトに Web フォームを追加します。これを行うには、[プロジェクト] メニューの [新しい項目の追加] をクリックします。次に、[インストールされているテンプレート] の [Web] をクリックし、[Web フォーム] を選択して [追加] をクリックします。

  9. ソリューション エクスプローラーで、[プロパティ] を右クリックし、[開く] をクリックします。

  10. [Web] タブで、[開始動作] の [ページを指定する] を選択して参照ボタンをクリックし、WebForm1.aspx を指定します。

  11. 次のコードを WebForm1.aspx ファイルに追加し、開くタグと終了 <html> タグで囲まれたファイルの部分を上書きします。

        <html xmlns="https://www.w3.org/1999/xhtml">
        <head runat="server">
            <title>Data-Driven Document Generation - SQL Server Sample</title>
        </head>
        <body>
            <form id="form1" runat="server">
            <div>
            <h1>Customer Letter Generator</h1>
                    <table border="0" cellpadding="0" cellspacing="0" style="width: 100%; height: 12%">
                        <tr>
                            <td>
                                Choose a customer:</td>
                            <td>
                                <asp:DropDownList 
                                ID="ddlCustomer"
                                runat="server"
                                AutoPostBack="True"
                                DataSourceID="CustomerData"
                                DataTextField="CompanyName"
                                DataValueField="CustomerID" 
                                Width="301px">
                                </asp:DropDownList>
                                <asp:SqlDataSource
                                ID="CustomerData"
                                runat="server"
                                ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
                                SelectCommand="SELECT [CustomerID], [CompanyName] FROM [Customers]" ProviderName="<%$ ConnectionStrings:NorthwindConnectionString.ProviderName %>">
                                </asp:SqlDataSource>
                            </td>
                        </tr>
                </table>
                </div>
                <br />
                <asp:Button
                ID="Button1"
                runat="server"
                OnClick="SubmitBtn_Click" 
                Text="Create Letter"
                Width="123px" />    
            </form>
        </body>
        </html>
    
    
  12. 使用するコード言語に応じて、次の Visual Basic .NET または C# のコードをプロジェクトの該当する WebForm1.aspx 分離コード ページに追加します。

サンプル コード: Visual Basic .NET

次の Visual Basic .NET サンプルでは、SQL Server データベースにバインドして、顧客の選択に基づいてデータを取得し、CustomerLetterGenerator.docm テンプレート ドキュメントに基づいて新しいドキュメントを作成する方法を示します。 このコードを WebForm1.aspx.vb ファイルに追加し、ファイル内の既存のコードを上書きしてください。

Imports System.Collections.Generic
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
Imports System.IO.Packaging
Imports System.Linq
Imports System.Xml
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls

Public Class WebForm1

    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    End Sub

    Private Const strRelRoot As String = "https://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"

    Private Sub CreateDocument()
        ' Get the template document file and create a stream from it
        Const DocumentFile As String = "~/App_Data/CustomerLetterGenerator.docm"

        ' Read the file into memory
        Dim buffer() As Byte = File.ReadAllBytes(Server.MapPath(DocumentFile))
        Dim memoryStream As MemoryStream = New MemoryStream(buffer, True)
        buffer = Nothing

        ' Open the document in the stream and replace the custom XML part
        Dim pkgFile As Package = Package.Open(memoryStream, FileMode.Open, FileAccess.ReadWrite)
        Dim pkgrcOfficeDocument As PackageRelationshipCollection = pkgFile.GetRelationshipsByType(strRelRoot)
        For Each pkgr As PackageRelationship In pkgrcOfficeDocument
            If (pkgr.SourceUri.OriginalString = "/") Then

                ' Get the root part
                Dim pkgpRoot As PackagePart = pkgFile.GetPart(New Uri(("/" + pkgr.TargetUri.ToString), UriKind.Relative))

                ' Add a custom XML part to the package
                Dim uriData As Uri = New Uri("/customXML/item1.xml", UriKind.Relative)
                If pkgFile.PartExists(uriData) Then

                    ' Delete part "/customXML/item1.xml" part
                    pkgFile.DeletePart(uriData)
                End If

                ' Load the custom XML data
                Dim pkgprtData As PackagePart = pkgFile.CreatePart(uriData, "application/xml")
                GetDataFromSQLServer(pkgprtData.GetStream, ddlCustomer.SelectedValue)
            End If
        Next

        ' Close the file
        pkgFile.Close()

        ' Return the result
        Response.ClearContent()
        Response.ClearHeaders()
        Response.AddHeader("content-disposition", "attachment; filename=document.docx")
        Response.ContentEncoding = System.Text.Encoding.UTF8
        memoryStream.WriteTo(Response.OutputStream)
        memoryStream.Close()
        Response.End()
    End Sub

    Private Sub GetDataFromSQLServer(ByVal stream As Stream, ByVal customerID As String)

        'Connect to a SQL Server database and get data
        Dim source As String = ConfigurationManager.ConnectionStrings("NorthwindConnectionString").ConnectionString
        Const SqlStatement As String = "SELECT CompanyName, ContactName, ContactTitle, Phone FROM Customers WHERE CustomerID=@customerID"
        Dim conn As SqlConnection = New SqlConnection(source)
        conn.Open()
        Dim cmd As SqlCommand = New SqlCommand(SqlStatement, conn)
        cmd.Parameters.AddWithValue("@customerID", customerID)
        Dim dr As SqlDataReader = cmd.ExecuteReader
        If dr.Read Then
            Dim writer As XmlWriter = XmlWriter.Create(stream)
            writer.WriteStartElement("Customer")
            writer.WriteElementString("CompanyName", CType(dr("CompanyName"), String))
            writer.WriteElementString("ContactName", CType(dr("ContactName"), String))
            writer.WriteElementString("ContactTitle", CType(dr("ContactTitle"), String))
            writer.WriteElementString("Phone", CType(dr("Phone"), String))
            writer.WriteEndElement()
            writer.Close()
        End If
        dr.Close()
        conn.Close()
    End Sub

    Protected Sub SubmitBtn_Click(ByVal sender As Object, ByVal e As EventArgs)
        CreateDocument()
    End Sub

End Class

サンプル コード: C#

次の C# サンプルは、SQL Server データベースにバインドして、顧客の選択に基づいてデータを取得し、CustomerLetterGenerator.docm テンプレート ドキュメントに基づいて新しいドキュメントを作成する方法を示しています。 このコードを WebForm1.Aspx.cs ファイルに追加し、既存のコードを上書きしてください。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.IO.Packaging;
using System.Linq;
using System.Xml;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace SQLServerSample
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        private const string strRelRoot = "https://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument";

        private void CreateDocument()
        {
            // Get the template document file and create a stream from it
            const string DocumentFile = @"~/App_Data/CustomerLetterGenerator.docm";
            
            // Read the file into memory
            byte[] buffer = File.ReadAllBytes(Server.MapPath(DocumentFile));
            MemoryStream memoryStream = new MemoryStream(buffer, true);
            buffer = null;

            // Open the document in the stream and replace the custom XML part
            Package pkgFile = Package.Open(memoryStream, FileMode.Open, FileAccess.ReadWrite);
            PackageRelationshipCollection pkgrcOfficeDocument = pkgFile.GetRelationshipsByType(strRelRoot);
            foreach (PackageRelationship pkgr in pkgrcOfficeDocument)
            {
                if (pkgr.SourceUri.OriginalString == "/")
                {
                    // Get the root part
                    PackagePart pkgpRoot = pkgFile.GetPart(new Uri("/" + pkgr.TargetUri.ToString(), UriKind.Relative));

                    // Add a custom XML part to the package
                    Uri uriData = new Uri("/customXML/item1.xml", UriKind.Relative);

                    if (pkgFile.PartExists(uriData))
                    {
                        // Delete document "/customXML/item1.xml" part
                        pkgFile.DeletePart(uriData);
                    }
                    // Load the custom XML data
                    PackagePart pkgprtData = pkgFile.CreatePart(uriData, "application/xml");
                    GetDataFromSQLServer(pkgprtData.GetStream(), ddlCustomer.SelectedValue);
                }
            }

            // Close the file
            pkgFile.Close();

            // Return the result
            Response.ClearContent();
            Response.ClearHeaders();
            Response.AddHeader("content-disposition", "attachment; filename=CustomLetter.docx");
            Response.ContentEncoding = System.Text.Encoding.UTF8;

            memoryStream.WriteTo(Response.OutputStream);

            memoryStream.Close();

            Response.End();
        }

        private void GetDataFromSQLServer(Stream stream, string customerID)
        {
            // Connect to a SQL Server database and get data
            String source = System.Configuration.ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString;            
            const string SqlStatement =
                "SELECT CompanyName, ContactName, ContactTitle, Phone FROM Customers WHERE CustomerID=@customerID";

            using (SqlConnection conn = new SqlConnection(source))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand(SqlStatement, conn);
                cmd.Parameters.AddWithValue("@customerID", customerID);
                SqlDataReader dr = cmd.ExecuteReader();

                if (dr.Read())
                {
                    XmlWriter writer = XmlWriter.Create(stream);
                    writer.WriteStartElement("Customer");
                    writer.WriteElementString("CompanyName", (string)dr["CompanyName"]);
                    writer.WriteElementString("ContactName", (string)dr["ContactName"]);
                    writer.WriteElementString("ContactTitle", (string)dr["ContactTitle"]);
                    writer.WriteElementString("Phone", (string)dr["Phone"]);
                    writer.WriteEndElement();
                    writer.Close();
                }
                dr.Close();
                conn.Close();
            }
        }

        protected void SubmitBtn_Click(object sender, EventArgs e)
        {
            CreateDocument();
        }
    }
}

ASP.NET 2.0 の操作の詳細については、「」を参照してください https://www.asp.net/get-started/

ここでは、SQL Server データベースからデータを抽出してテンプレート文書に挿入する方法について説明しました。 Access や Excel など、他のデータ ソースからデータを抽出することもできます。 それらのアプリケーションのデータにプログラムで連結する方法の詳細については、Access および Excel の開発者向けドキュメントを参照してください。

サポートとフィードバック

Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。