Share via


如何:在不启动 Microsoft Office 的情况下向文档中添加自定义 XML 部件

更新:2007 年 11 月

适用对象

本主题中的信息只适用于指定的 Microsoft Office 版本。

Microsoft Office 版本

  • Excel 2007

  • PowerPoint 2007

  • Word 2007

有关更多信息,请参见按应用程序和项目类型提供的功能

您可以在不启动 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 部件,请使用 PackagePackagePart 类。有关这些类的更多信息,请参见 Windows Presentation Foundation 中的文档

在不启动 Microsoft Office 的情况下向文档中添加自定义 XML 部件

  1. 创建一个 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);
    
  2. 创建一个新的 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 部件

如何:使用应用程序级外接程序将自定义 XML 部件添加到文档中

概念

自定义 XML 部件概述