如何:在不启动 Microsoft Office 的情况下向文档中添加自定义 XML 部件
更新:2007 年 11 月
适用对象 |
---|
本主题中的信息只适用于指定的 Microsoft Office 版本。 Microsoft Office 版本
有关更多信息,请参见按应用程序和项目类型提供的功能。 |
您可以在不启动 Microsoft Office Excel、Microsoft Office PowerPoint 或 Microsoft Office Word 的情况下向文档中添加自定义 XML 部件。如果要将 XML 数据存储在未安装 Microsoft Office 的计算机(如服务器)上的文档中,此方法非常有用。有关更多信息,请参见自定义 XML 部件概述。
文档必须采用 Office Open XML 格式之一,比如 .docx、.xlsx 或 .pptx。您无法在未启动 Microsoft Office 应用程序的情况下访问二进制文件格式中的自定义 XML 部件。
若要在不启动 Microsoft Office 的情况下添加自定义 XML 部件,请使用 Package 和 PackagePart 类。有关这些类的更多信息,请参见 Windows Presentation Foundation 中的文档。
在不启动 Microsoft Office 的情况下向文档中添加自定义 XML 部件
创建一个 XmlDocument 对象,该对象表示要添加到自定义 XML 部件的 XML。
Dim xmlString As String = _ "<?xml version=""1.0"" encoding=""utf-8"" ?>" & _ "<employees https://schemas.microsoft.com/vsto/samples"">" & _ "<employee>" & _ "<name>Karina Leal</name>" & _ "<hireDate>1999-04-01</hireDate>" & _ "<title>Manager</title>" & _ "</employee>" & _ "</employees>" Dim reader As StringReader = New StringReader(xmlString) Dim xmlDoc As XmlDocument = New XmlDocument() xmlDoc.Load(reader)
string xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" + "<employees xmlns=\"https://schemas.microsoft.com/vsto/samples\">" + "<employee>" + "<name>Karina Leal</name>" + "<hireDate>1999-04-01</hireDate>" + "<title>Manager</title>" + "</employee>" + "</employees>"; StringReader reader = new StringReader(xmlString); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(reader);
创建一个新的 PackagePart,表示要添加到文档的自定义 XML 部件。然后,将之前创建的 XmlDocument 对象中的 XML 保存到新的自定义 XML 部件中。
Using package As Package = package.Open(fullDocumentPath, FileMode.Open, _ FileAccess.ReadWrite) Dim uriPartTarget As Uri = New Uri("/customXml/employee1.xml", UriKind.Relative) If Not package.PartExists(uriPartTarget) Then Dim customXml As PackagePart = package.CreatePart(uriPartTarget, _ "application/vnd.openxmlformats-officedocument.customXmlProperties+xml") Using partStream As Stream = customXml.GetStream(FileMode.Create, _ FileAccess.ReadWrite) xmlDoc.Save(partStream) End Using End If End Using
using (Package package = Package.Open(fullDocumentPath, FileMode.Open, FileAccess.ReadWrite)) { Uri uriPartTarget = new Uri("/customXml/employee1.xml", UriKind.Relative); if (!package.PartExists(uriPartTarget)) { PackagePart customXml = package.CreatePart(uriPartTarget, "application/vnd.openxmlformats-officedocument.customXmlProperties+xml"); using (Stream partStream = customXml.GetStream(FileMode.Create, FileAccess.ReadWrite)) { xmlDoc.Save(partStream); } } }
示例
下面的代码示例将一个自定义 XML 部件添加到名为 Employees.docx 的 Word 文档中,该文档位于 %UserProfile%\My Documents 文件夹(对于 Windows XP 及早期版本)或 %UserProfile%\Documents 文件夹(对于 Windows Vista)中。
此示例适合在控制台应用程序中使用,但您可以对其进行修改,以在任何使用 .NET Framework 3.0 或更高版本的应用程序(比如 Windows Presentation Foundation (WPF) 应用程序)中工作。
若要修改此示例以与 Excel 或 PowerPoint 文档协同工作,请修改 Main 方法以将文档的完整路径传入到 AddCustomXmlPart 方法。
Sub Main()
AddCustomXmlPart(Environment.GetFolderPath( _
Environment.SpecialFolder.MyDocuments) & "\Employees.docx")
End Sub
Private Sub AddCustomXmlPart(ByVal fullDocumentPath As String)
Dim xmlDoc As XmlDocument = GetXmlDocumentFromString()
If xmlDoc IsNot Nothing Then
Using package As Package = package.Open(fullDocumentPath, FileMode.Open, _
FileAccess.ReadWrite)
Dim uriPartTarget As Uri = New Uri("/customXml/employee1.xml", UriKind.Relative)
If Not package.PartExists(uriPartTarget) Then
Dim customXml As PackagePart = package.CreatePart(uriPartTarget, _
"application/vnd.openxmlformats-officedocument.customXmlProperties+xml")
Using partStream As Stream = customXml.GetStream(FileMode.Create, _
FileAccess.ReadWrite)
xmlDoc.Save(partStream)
End Using
End If
End Using
End If
End Sub
Private Function GetXmlDocumentFromString() As XmlDocument
Dim xmlString As String = _
"<?xml version=""1.0"" encoding=""utf-8"" ?>" & _
"<employees https://schemas.microsoft.com/vsto/samples"">" & _
"<employee>" & _
"<name>Karina Leal</name>" & _
"<hireDate>1999-04-01</hireDate>" & _
"<title>Manager</title>" & _
"</employee>" & _
"</employees>"
Dim reader As StringReader = New StringReader(xmlString)
Dim xmlDoc As XmlDocument = New XmlDocument()
xmlDoc.Load(reader)
Return xmlDoc
End Function
static void Main(string[] args)
{
AddCustomXmlPart(Environment.GetFolderPath(
Environment.SpecialFolder.MyDocuments) + @"\Employees.docx");
}
private static void AddCustomXmlPart(string fullDocumentPath)
{
XmlDocument xmlDoc = GetXmlDocumentFromString();
if (xmlDoc != null)
{
using (Package package = Package.Open(fullDocumentPath, FileMode.Open,
FileAccess.ReadWrite))
{
Uri uriPartTarget = new Uri("/customXml/employee1.xml", UriKind.Relative);
if (!package.PartExists(uriPartTarget))
{
PackagePart customXml = package.CreatePart(uriPartTarget,
"application/vnd.openxmlformats-officedocument.customXmlProperties+xml");
using (Stream partStream = customXml.GetStream(FileMode.Create,
FileAccess.ReadWrite))
{
xmlDoc.Save(partStream);
}
}
}
}
}
private static XmlDocument GetXmlDocumentFromString()
{
string xmlString =
"<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
"<employees xmlns=\"https://schemas.microsoft.com/vsto/samples\">" +
"<employee>" +
"<name>Karina Leal</name>" +
"<hireDate>1999-04-01</hireDate>" +
"<title>Manager</title>" +
"</employee>" +
"</employees>";
StringReader reader = new StringReader(xmlString);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(reader);
return xmlDoc;
}
编译代码
此示例需要引用 WindowsBase.dll 程序集。.NET Framework 从版本 3.0 开始包括了该程序集。
此示例假定对于以下命名空间具有 using(用于 C#)或 Imports(用于 Visual Basic)语句:
System.IO
System.IO.Packaging
System.Xml
请参见
任务
如何:使用应用程序级外接程序将自定义 XML 部件添加到文档中