Поделиться через


Подключение элемента в хранилище данных к базе данных SQL Server

Word позволяет создавать документы, создавая решения на основе данных. Вы можете создать документ шаблона, который включает настраиваемую XML-часть и использовать элементы управления содержимым для привязки к пользовательским XML-данным с помощью сопоставления XML. Хотя термин шаблон используется в этом контексте, этот документ не является шаблоном Word, но имеет некоторые характеристики документа шаблона Word. Затем можно создать управляемое веб-приложение для создания нового документа на основе шаблона. Управляемое веб-приложение открывает документ шаблона, извлекает данные из базы данных Microsoft SQL Server для создания новой пользовательской XML-части, заменяет настраиваемую XML-часть документа шаблона новой частью и сохраняет документ шаблона как новый документ Word.

В этом пошаговом руководстве объясняется, как создать новый документ шаблона и как создать серверное приложение, которое создает документы, отображающие данные, хранящиеся в базе данных Microsoft SQL Server. Чтобы создать это приложение, выполните следующие две задачи:

  1. Создайте документ шаблона Word.

  2. Создайте серверное веб-приложение, которое извлекает данные из базы данных Microsoft SQL Server и создает новые документы на основе шаблона Word.

В этом примере используются следующие программные объекты:

Дополнительные сведения об элементах управления содержимым см. в разделе Работа с элементами управления содержимым.

Бизнес-сценарий: создание генератора документов клиента

Чтобы создать генератор документов Word, который подключает элемент в хранилище данных к базе данных Microsoft SQL Server базы данных, сначала создайте шаблон генератора писем клиента, который содержит элементы управления содержимым, сопоставляемые с XML-файлом. Затем создайте веб-приложение для создания документов, которое позволяет выбрать название компании для создания пользовательского документа. Приложение извлекает данные клиентов из базы данных Microsoft SQL Server и использует генератор писем клиентов для создания нового документа, который отображает данные клиента на основе выбора пользователем. В документе отображаются следующие сведения:

  • Название организации
  • Имя контакта
  • Заголовок контакта
  • Номер телефона

Чтобы создать генератор документов Word, выполните следующие общие действия.

Создание пользовательского генератора документов и определение сопоставлений XML для каждого элемента управления содержимым

  1. Откройте Word и создайте пустой документ.

  2. Добавьте элементы управления содержимым в виде обычного текста в документ для привязки к узлам в хранилище данных.

    Элементы управления содержимым — это предопределенные части содержимого. Word предлагает несколько типов элементов управления содержимым. Сюда входят текстовые блоки, флажки, раскрывающееся меню, поля со списком, элементы управления календарем и рисунки. Эти элементы управления содержимым можно сопоставить с элементом в XML-файле. С помощью выражений XPath можно программно сопоставить содержимое в XML-файле с элементом управления содержимым. Это позволяет написать простое и короткое приложение для управления данными в документе и их изменения.

    Чтобы добавить элемент управления содержимым, на вкладке Разработчик в группе Элементы управления щелкните Элемент управления содержимым в виде обычного текста.

    Добавьте в документ четыре элемента управления с содержимым в виде обычного текста. После добавления каждого элемента управления назначьте каждому из них заголовок: Щелкните элемент управления; в группе Элементы управления щелкните Свойства; в поле Заголовок введите заголовок элемента управления, как показано в следующем списке. и нажмите кнопку ОК.

    • Название организации
    • Имя контакта
    • Заголовок контакта
    • Номер телефона

    Вы также можете использовать следующий код Visual Basic для приложений (VBA) для добавления элементов управления содержимым в документ. Нажмите клавиши ALT+F11, чтобы открыть редактор Visual Basic, вставьте код в окно кода, щелкните в любом месте процедуры, а затем нажмите клавишу F5, чтобы запустить код и добавить четыре элемента управления содержимым в документ шаблона.

         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 — это функция Word, которая позволяет создать связь между документом и XML-файлом. Это создает истинное разделение данных и представлений между форматированием документа и пользовательскими XML-данными.

    Чтобы загрузить настраиваемую XML-часть, необходимо сначала добавить новое хранилище данных в объект Document с помощью метода Add коллекции CustomXMLParts . При этом к документу добавляется новое пустое хранилище данных. Так как он пуст, его пока нельзя использовать. Затем необходимо загрузить пользовательскую XML-часть из XML-файла в хранилище данных, вызвав метод Load объекта CustomXMLPart , который использует допустимый путь к XML-файлу в качестве параметра.

  4. Сохраните документ, назвав его CustomerLetterGenerator.docm.

    Примечание.

    Так как он содержит код VBA, необходимо сохранить документ в виде файла документа с поддержкой макросов (DOCM).|

В следующей процедуре объясняется, как сопоставить элемент управления содержимым с примером пользовательского XML-файла. Создайте допустимый пользовательский XML-файл, сохраните его, а затем используете код Visual Basic для приложений (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-части по умолчанию, которые всегда создаются с помощью документа: "Титульные страницы", "Свойства документа" и "Свойства приложения". Кроме того, на данном компьютере могут быть созданы различные другие настраиваемые XML-части в зависимости от нескольких факторов. К ним относятся установленные надстройки, подключения к SharePoint и т. д. Вызов метода Add для коллекции CustomXMLParts в предыдущем коде добавляет дополнительную XML-часть, в которую загружается XML-файл. Именно в этой части вызывается метод Load в следующей строке кода.

    Чтобы определить номер индекса части, в которую загружается XML-файл, необходимо передать количество настраиваемых XML-частей в метод Load . ActiveDocument.CustomXMLParts(ActiveDocument.CustomXMLParts.Count).Load ("C:\CustomerData.xml")

  4. Задайте xml-сопоставление для элемента управления содержимым, который ссылается на узел в добавленном хранилище данных.

    Чтобы создать xml-сопоставление, используйте выражение XPath, указывающее на узел в пользовательской части xml-данных, с которой требуется сопоставить элемент управления содержимым. После добавления хранилища данных в документ (а хранилище данных указывает на допустимый XML-файл), вы можете сопоставить один из его узлов с элементом управления содержимым.

    Для этого передайте string , содержащий допустимый XPath , в объект ContentControl с помощью метода SetMapping объекта XMLMapping (с помощью свойства XMLMapping объекта ContentControl ). Откройте редактор 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
    
    

Создание приложения Server-Side, которое извлекает данные из базы данных SQL Server и создает новый документ

Вы можете создать веб-приложение, которое позволит пользователям выбрать название компании и создать пользовательскую букву. Веб-приложение извлекает данные о клиентах из базы данных SQL Server, открывает документ шаблона письма клиента и создает новый документ, в котором отображаются данные клиента на основе выбора пользователем. Для этого веб-приложения не требуется использовать Word или VBA. Используйте свой любимый язык управляемого кода (Visual Basic .NET или C#) для создания этого приложения.

Примечание.

Показанное здесь веб-приложение получает данные из базы данных Northwind.mdf. Эта база данных была установлена вместе с предыдущими версиями SQL Server и Office. Если у вас нет базы данных Northwind на компьютере, ее можно скачать со следующего сайта: База данных Northwind

Создание серверного приложения, которое извлекает данные из базы данных SQL Server и создает новый документ

  1. Откройте Visual Studio или Visual Web Developer.

  2. Создайте веб-приложение ASP.NET и назовите его SqlServerSample.

    На следующих шагах вы подключите веб-приложение ASP.NET к базе данных SQL Server.

  3. Добавьте следующую строку подключения в файл Web.config в проекте Visual Studio.

         <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 добавьте документ CustomerLetterGenerator.docm в папку App_Data : щелкните правой кнопкой мыши App_Data, наведите указатель мыши на пункт Добавить, выберите пункт Существующий элемент, перейдите к расположению, в котором вы сохранили документ, выберите его и нажмите кнопку Добавить.

  5. Добавьте ссылку на WindowsBase.dll в проект: щелкните правой кнопкой мыши ссылки, выберите команду Добавить ссылку, перейдите на вкладку .NET , выберите WindowsBase и нажмите кнопку ОК.

  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. Добавление веб-формы в проект. В меню Проект щелкните Добавить новый элемент; В разделе Установленные шаблоны щелкните Интернет; выберите Веб-форма и нажмите кнопку Добавить.

  9. В Обозреватель решений щелкните правой кнопкой мыши пункт Свойства и выберите команду Открыть.

  10. На вкладке Веб в разделе Действие запуска выберите Конкретная страница, нажмите кнопку обзора и перейдите на страницу 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

В следующем примере .NET на Visual Basic показано, как выполнить привязку к базе данных 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 и обратная связь.