Comment : ajouter des parties XML personnalisées à des documents sans démarrer Microsoft Office

Mise à jour : novembre 2007

S'applique à

Les informations de cette rubrique s'appliquent uniquement aux versions spécifiées de Microsoft Office.

Version de Microsoft Office

  • Excel 2007

  • PowerPoint 2007

  • Word 2007

Pour plus d'informations, consultez Fonctionnalités disponibles par type d'application et de projet.

Vous pouvez ajouter une partie XML personnalisée à un document sans démarrer Microsoft Office Excel, Microsoft Office PowerPoint ou Microsoft Office Word. Cela s'avère utile si vous souhaitez stocker les données XML dans un document sur un ordinateur sur lequel Microsoft Office n'est pas installé, tel qu'un serveur. Pour plus d'informations, consultez Vue d'ensemble des parties XML personnalisées.

Le document doit avoir l'un des formats Open XML suivants : .docx, .xlsx ou .pptx. Vous ne pouvez pas accéder aux parties XML personnalisées dans les formats de fichier binaire sans démarrer l'application Microsoft Office.

Pour ajouter une partie XML personnalisée sans démarrer Microsoft Office, utilisez les classes Package et PackagePart. Pour plus d'informations sur ces classes, consultez Documents dans Windows Presentation Foundation.

Pour ajouter une partie XML personnalisée à un document sans démarrer Microsoft Office

  1. Créez un objet XmlDocument qui représente le XML que vous souhaitez ajouter à une partie XML personnalisée.

    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. Créez un nouveau PackagePart qui représente la partie XML personnalisée que vous ajoutez au document. Enregistrez ensuite le XML de l'objet XmlDocument que vous avez créé précédemment dans la nouvelle partie XML personnalisée.

    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);
            }
        }
    }
    

Exemple

L'exemple de code suivant ajoute une partie XML personnalisée à un document Word appelé Employees.docx qui se trouve dans le dossier %UserProfile%\Mes documents (pour Windows XP et antérieur) ou le dossier %UserProfile%\Documents (pour Windows Vista).

Cet exemple est prévu pour être utilisé dans une application console, mais vous pouvez le modifier pour travailler dans toute application fonctionnant avec le .NET Framework 3.0 ou version ultérieure, telle qu'une application Windows Presentation Foundation (WPF).

Pour modifier cet exemple pour travailler avec un document Excel ou PowerPoint, modifiez la méthode Main afin de transférer le chemin d'accès complet du document à la méthode 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;
}

Compilation du code

  • Cet exemple nécessite une référence à l'assembly WindowsBase.dll. Cet assembly est inclus dans le .NET Framework, à partir de la version 3.0.

  • Cet exemple suppose que vous avez des instructions using (pour C#) ou Imports (pour Visual Basic) pour les espaces de noms suivants :

    • System.IO

    • System.IO.Packaging

    • System.Xml

Voir aussi

Tâches

Comment : ajouter des parties XML personnalisées aux personnalisations au niveau du document

Comment : ajouter des parties XML personnalisées à des documents à l'aide de compléments d'application

Concepts

Vue d'ensemble des parties XML personnalisées