vendredi 20 février 2009

Création de fiche serveur avec Word 2007 et PowerShell (Partie 4)

La partie précédente de cet article se trouve ICI !

Nous arrivons à la dernière partie. Nous pourrons donc enfin avec PowerShell générer une fiche serveur !

Il ne nous reste plus qu’à écrire les fonctions permettant de mettre à jour du texte dans un document Word.

function Set-OpenXmlText($objNode, $objNsMgr, $strData)
{
    $blnIsCheckBox = $false
    $objNodeT = $null
    $objNodeR = $null

    $objNodeTmp = $objNode.SelectSingleNode('w:tc', $objNsMgr)
    if ($objNodeTmp -ne $null) { $objNode = $objNodeTmp }
    $objNodeTmp = $objNode.SelectSingleNode('w:p', $objNsMgr)
    if ($objNodeTmp -ne $null) { $objNode = $objNodeTmp }
    $objNodes = $objNode.SelectNodes('w:r', $objNsMgr)
    foreach ($objNodeR in $objNodes) {
        $objNodeSYM = $objNodeR.SelectSingleNode('w:sym', $objNsMgr)
        $blnIsCheckBox = $objNodeSYM -ne $null
        if ($blnIsCheckBox) {
            $objAttr = $objNodeSYM.Attributes |
                       where-Object { $_.Name -eq 'w:char'}
            $objAttr.Value = 'F0A8'
            if ($strData -eq $true) { $objAttr.Value = '00FE' }
            break
        }
        $objNodeT = $objNodeR.SelectSingleNode('w:t', $objNsMgr)
        if ($objNodeT -ne $null) { $objNodeT.InnerText = '' }
        # Sinon, il faut créer une balise W:T sous $objNodeR
    }
    if ((-not $blnIsCheckBox-And ($objNodeT -ne $null)) {
        $objNodeT.InnerText = $strData
    }
}

Le but n’est pas d’étudier de près le format OpenXML… Mais nous avons besoin de quelques notions pour bien comprendre la fonction Set-OpenXmlText. Rien de bien difficile je vous rassure !

Pour cela, nous allons essayer de comprendre ce qui se passe lorsque nous insérons ce contrôle de contenu :


Nous avons vu que lorsque nous modifions notre document Word, nous modifions en faite le fichier /word/document.xml de notre package DOCX. Plus précisément, nous ajoutons dans notre cas les balises suivantes :


Notre contrôle de contenu est représenté par la balise w:sdt. Cette dernière se découpe en deux parties mises en évidence par deux couleurs différentes.

La partie verte (balise w:sdtPr) contient les propriétés de notre contrôle. Ainsi on va pouvoir y trouver son nom. Dans l’exemple, notre contrôle a pour nom FctNetworkInfrastructure. Ce nom est récupéré par la fonction Get-OpenXmlContentCtrlAlias que nous avons vu dans l’article précédent !

La fonction Set-OpenXmlText que nous avons découvert dans cet article va modifier la partie bleue (balise w:sdtContent) qui représente le contenu de notre contrôle de contenu !

Rien de compliqué… non ?!

Je mettrai à votre disposition les sources complètes et commentées de la génération d’une fiche serveur avec PowerShell et Word 2007 très bientôt dans un autre post ; avec des exemples d’utilisation !

2 commentaires:

  1. bonjour gregory,

    j'ai trouvé ton post tres instructif.
    Serait il possible d'avoir quelques exemples d'utilisation prochainement
    Merci d'avance
    seb

    RépondreSupprimer
  2. Bonjour,

    je serais également intéréssé les sources commentées de la génération d’une fiche serveur que tu proposes.

    Merci

    RépondreSupprimer