Подключение элемента в хранилище данных к базе данных SQL Server
Word позволяет создавать документы, создавая решения на основе данных. Вы можете создать документ шаблона, который включает настраиваемую XML-часть и использовать элементы управления содержимым для привязки к пользовательским XML-данным с помощью сопоставления XML. Хотя термин шаблон используется в этом контексте, этот документ не является шаблоном Word, но имеет некоторые характеристики документа шаблона Word. Затем можно создать управляемое веб-приложение для создания нового документа на основе шаблона. Управляемое веб-приложение открывает документ шаблона, извлекает данные из базы данных Microsoft SQL Server для создания новой пользовательской XML-части, заменяет настраиваемую XML-часть документа шаблона новой частью и сохраняет документ шаблона как новый документ Word.
В этом пошаговом руководстве объясняется, как создать новый документ шаблона и как создать серверное приложение, которое создает документы, отображающие данные, хранящиеся в базе данных Microsoft SQL Server. Чтобы создать это приложение, выполните следующие две задачи:
Создайте документ шаблона Word.
Создайте серверное веб-приложение, которое извлекает данные из базы данных Microsoft SQL Server и создает новые документы на основе шаблона Word.
В этом примере используются следующие программные объекты:
CustomXMLPart (в системной объектной модели Microsoft Office)
CustomXMLParts (в системной объектной модели Microsoft Office)
Дополнительные сведения об элементах управления содержимым см. в разделе Работа с элементами управления содержимым.
Бизнес-сценарий: создание генератора документов клиента
Чтобы создать генератор документов Word, который подключает элемент в хранилище данных к базе данных Microsoft SQL Server базы данных, сначала создайте шаблон генератора писем клиента, который содержит элементы управления содержимым, сопоставляемые с XML-файлом. Затем создайте веб-приложение для создания документов, которое позволяет выбрать название компании для создания пользовательского документа. Приложение извлекает данные клиентов из базы данных Microsoft SQL Server и использует генератор писем клиентов для создания нового документа, который отображает данные клиента на основе выбора пользователем. В документе отображаются следующие сведения:
- Название организации
- Имя контакта
- Заголовок контакта
- Номер телефона
Чтобы создать генератор документов Word, выполните следующие общие действия.
Создание пользовательского генератора документов и определение сопоставлений XML для каждого элемента управления содержимым
Откройте Word и создайте пустой документ.
Добавьте элементы управления содержимым в виде обычного текста в документ для привязки к узлам в хранилище данных.
Элементы управления содержимым — это предопределенные части содержимого. 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
Задайте сопоставление XML для элементов управления содержимым.
Сопоставление XML — это функция Word, которая позволяет создать связь между документом и XML-файлом. Это создает истинное разделение данных и представлений между форматированием документа и пользовательскими XML-данными.
Чтобы загрузить настраиваемую XML-часть, необходимо сначала добавить новое хранилище данных в объект Document с помощью метода Add коллекции CustomXMLParts . При этом к документу добавляется новое пустое хранилище данных. Так как он пуст, его пока нельзя использовать. Затем необходимо загрузить пользовательскую XML-часть из XML-файла в хранилище данных, вызвав метод Load объекта CustomXMLPart , который использует допустимый путь к XML-файлу в качестве параметра.
Сохраните документ, назвав его CustomerLetterGenerator.docm.
Примечание.
Так как он содержит код VBA, необходимо сохранить документ в виде файла документа с поддержкой макросов (DOCM).|
В следующей процедуре объясняется, как сопоставить элемент управления содержимым с примером пользовательского XML-файла. Создайте допустимый пользовательский XML-файл, сохраните его, а затем используете код Visual Basic для приложений (VBA), чтобы добавить в документ шаблона хранилище данных, содержащее сведения, с которыми вы хотите сопоставить.
Установка сопоставления XML в элементе управления содержимым
Создайте текстовый файл и сохраните его как CustomerData.xml.
Скопируйте следующий XML-код в текстовый файл и сохраните файл.
<?xml version="1.0"?> <Customer> <CompanyName>Alfreds Futterkiste</CompanyName> <ContactName>Maria Anders</ContactName> <ContactTitle>Sales Representative</ContactTitle> <Phone>030-0074321</Phone> </Customer>
Нажмите клавиши 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")
Задайте 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 и создает новый документ
Откройте Visual Studio или Visual Web Developer.
Создайте веб-приложение ASP.NET и назовите его SqlServerSample.
На следующих шагах вы подключите веб-приложение ASP.NET к базе данных SQL Server.
Добавьте следующую строку подключения в файл 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>
В проекте Visual Studio добавьте документ CustomerLetterGenerator.docm в папку App_Data : щелкните правой кнопкой мыши App_Data, наведите указатель мыши на пункт Добавить, выберите пункт Существующий элемент, перейдите к расположению, в котором вы сохранили документ, выберите его и нажмите кнопку Добавить.
Добавьте ссылку на WindowsBase.dll в проект: щелкните правой кнопкой мыши ссылки, выберите команду Добавить ссылку, перейдите на вкладку .NET , выберите WindowsBase и нажмите кнопку ОК.
Скачивание и установка Microsoft платформа .NET Framework 4.0
Настройте сборку в файле Web.config следующим образом.
<compilation debug="false"> <assemblies> <add assembly="WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </assemblies> </compilation>
Добавление веб-формы в проект. В меню Проект щелкните Добавить новый элемент; В разделе Установленные шаблоны щелкните Интернет; выберите Веб-форма и нажмите кнопку Добавить.
В Обозреватель решений щелкните правой кнопкой мыши пункт Свойства и выберите команду Открыть.
На вкладке Веб в разделе Действие запуска выберите Конкретная страница, нажмите кнопку обзора и перейдите на страницу WebForm1.aspx.
Добавьте следующий код в файл 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>
В зависимости от используемого языка программирования добавьте следующий код 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 и обратная связь.