Powershell替换单词doc中的值,但不是在一章

时间:2015-11-04 15:05:59

标签: powershell replace doc

我有一个获取两个文件的脚本:

  • 一个.doc,大文本(约175页)
  • 一个带有一些值的.xls。

doc文件有一些我必须替换的“变量”。 一个样本可能是:

Lorem [IPSUM] ec nor ... 

xls文件与下一列的值具有相同的var:

  Var  | val1 | val2 | val3
---------------------------- 
[IPSUM]| toto | tata | titi
[NIL]  | poue | lama | omg
 ...

该脚本即将替换.doc中Var列中的所有值,而不是其他列中的其他值。

以下脚本就是这样做的。

我必须通过排除包含一个表的章节(4)来改变它,该表包含.xls文件的var列的所有值的列表。

Chapter 4 :
  Var  | conf file | comment
---------------------------- 
[IPSUM]| toto.txt  | useless
[NIL]  | titi.conf | very usefull
...

我试图逐字阅读文字,但速度太慢了。 我已经逐段尝试了,但它不起作用。

如果您有任何想法那将会很棒!

我的脚本如下: (是的,我很抱歉)

# Définition du contexte culturel
##########################################################################################################
[System.Threading.Thread]::CurrentThread.CurrentCulture = [System.Globalization.CultureInfo] "en-US"
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void][Reflection.Assembly]::LoadWithPartialName("System.Drawings")
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")
##########################################################################################################

# vérifications des prérequis :
if ($PSVersionTable.PSVersion.Major -lt 4)
{
    echo "Votre version de Powershell est inadaptée, merci d'installer la KB2819745"
    break
}


# Fonctions
##########################################################################################################
# fonction pour Remplacer des valeurs dans un fichier word
# Arguments :
# - $Excel : un onglet Excel contenant avec des titres de colones
# - $Word : un document word avec des fichiers
# - $IVar : numéro de la colonne avec les variables à Remplacer dans le word
# - $IVal : numéro de la colonne avec les valeurs qui remplacent les précédentes
# - $Nom : inutilisé : future nom du document Word
function Remplacer($Excel, $Word , $IVar , $Ival, $Nom)
{
    # initialisation du numéro de ligne (1 = ligne avec les entêtes)
    $ligne = 2
    do {
        # Réccupération des variables et valeur
        $Val = $Excel.Cells.Item($ligne,$IVal).Value() 
        $Var = $Excel.Cells.Item($ligne,$IVar).Value()    

        # Déclaration pour la fonction de remplacement
        $FindReplace=$Word.ActiveWindow.Selection.Find
        # Remplacement des variables dans le fichier word
        $matchCase = $false;
        $matchWholeWord = $true;
        $matchWildCards = $false;
        $matchSoundsLike = $false;
        $matchAllWordForms = $false;
        $forward = $true;
        $format = $false;
        $matchKashida = $false;
        $matchDiacritics = $false;
        $matchAlefHamza = $false;
        $matchControl = $false;
        $read_only = $false;
        $visible = $true;
        $replace = 2;
        $wrap = 1;

        # Remplacement (si pas de varaibles trouvées dans word, alors)
        if ($FindReplace.Execute($Var, $matchCase, $matchWholeWord, $matchWildCards, $matchSoundsLike, $matchAllWordForms, $forward, $wrap, $format, $Val, $replace, $matchKashida ,$matchDiacritics, $matchAlefHamza, $matchControl) -eq $False)
        {
            # Ecriture dans un fichier des variables non trouvées
             $Var + " non trouvée" >> $Global:chemin"\rejets.txt"
        }
        #affichage du nombre de variables traitées
        $texte = $ligne -2

        $label_av.Text = $texte.ToString() + " variables traitées"
        $form.Controls.Add($label_av)

        # Réccupération de la ligne suivante
        $ligne++
        $Val2 = $Excel.Cells.Item($ligne,$IVar).value()


    }
    while ($Val2 -ne $null)

    $label_av.Text = "Traitement terminé"
    $form.Controls.Add($label_av)

    $nbvar = $ligne - 3
    # Sortie du nombre de variables traitées
    #Write-Host $nbvar "variables traitées"

    # Sauvegarde du fichier Word

    $nom = $Global:CheminW.replace(".doc","_"+$nom +".doc")    
    $Word.SaveAs([REF]$nom)
}

# Fonction de recherche des titres des colonnes
# Argument : $Excel un fichier Excel
function ColTitres ($Excel)
{
    # Initialisation du tableau de retour
    $titres = @()
    $col=0
    do {
        #réccupération de la ligne suivante
        $col++

        $valeur = $Excel.Cells.Item(1,$Col).value()
        if ($valeur -ne $null) {$titres+=$valeur}
    }
    while ($valeur -ne $null)
    # Retour du tableau
    return $titres
}

# fonction d'ouverture de fichier
# Argument : $chemin un chemin vers un fichier doc ou Excel
function Ouvrir( $chemin )
{
    # Si le chemin contient doc
    if ($chemin -match "doc")
    {
        $global:Word = New-Object -Com Word.Application
        $global:Word.Visible = $false
        $OpenDoc = $global:Word.documents.Open($Chemin)
    }
    # Si le chemin contient xls
    if ($chemin -match "xls")
    {
        $Excel = New-Object -ComObject "Excel.Application"
        $Excel.Visible = $false
        $OpenDoc = $Excel.WorkBooks.Open($Chemin) 
    }
    # Retour du document
    return $OpenDoc
}

#fontion de fermeture d'objets offce
function Fermer( $variable )
{
    $variable.save()
    $variable.close()
}


#Interface Graphique
#################################################
# AJOUT DE LA FORME PRINCIPALE
#################################################
$form = New-Object Windows.Forms.Form
# Pour bloquer le resize du form et supprimer les icones Minimize and Maximize
$form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedDialog
$form.MaximizeBox = $False
$form.MinimizeBox = $False
$form.Text = "DIOZator V1.0.1"                                                     # Choix du titre
$form.Size = New-Object System.Drawing.Size(400,370)                           # Choix de la taille

#######################################################################
# Bouton OK
$button_ok = New-Object System.Windows.Forms.Button
$button_ok.Text = "OK"
$button_ok.Size = New-Object System.Drawing.Size(355,40)
$button_ok.Location = New-Object System.Drawing.Size(20,245)

# Bouton Quitter
$button_quit = New-Object System.Windows.Forms.Button
$button_quit.Text = "Fermer"
$button_quit.Size = New-Object System.Drawing.Size(355,40)
$button_quit.Location = New-Object System.Drawing.Size(20,290)

####################################################################
#Pour la selection du fichier Excel
# Label word
$label_Word = New-Object System.Windows.Forms.Label
$label_Word.AutoSize = $true
$label_Word.Size = New-Object System.Drawing.Size(50,20)
$label_Word.Location = New-Object System.Drawing.Point(10,10)
$label_Word.Text = "Dio : "
# Champs texte
$TextBoxW = New-Object System.Windows.Forms.TextBox
$TextBoxW.Text = $Global:CheminW
$TextBoxW.Size = New-Object System.Drawing.Size(280,20)
$TextBoxW.Location = New-Object System.Drawing.Size(20,30)
# Bouton Excel
$button_Word = New-Object System.Windows.Forms.Button
$button_Word.Text = "..."
$button_Word.Size = New-Object System.Drawing.Size(30,20)
$button_Word.Location = New-Object System.Drawing.Size(300,30)


# Label Excel
$label_Excel = New-Object System.Windows.Forms.Label
$label_Excel.AutoSize = $True
$label_Excel.Size = New-Object System.Drawing.Size(50,20)
$label_Excel.Location = New-Object System.Drawing.Point(10,60)
$label_Excel.Text = "Dictionaire : "
# Champs texte
$TextBoxE = New-Object System.Windows.Forms.TextBox
$TextBoxE.Text = $Global:CheminE
$TextBoxE.Size = New-Object System.Drawing.Size(280,20)
$TextBoxE.Location = New-Object System.Drawing.Size(20,80)
# Bouton Excel
$button_Excel = New-Object System.Windows.Forms.Button
$button_Excel.Text = "..."
$button_Excel.Size = New-Object System.Drawing.Size(30,20)
$button_Excel.Location = New-Object System.Drawing.Size(300,80)
# Label variables
$label_var = New-Object System.Windows.Forms.Label
$label_var.AutoSize = $True
$label_var.Size = New-Object System.Drawing.Size(50,20)
$label_var.Location = New-Object System.Drawing.Point(20,110)
$label_var.Text = "Variables : "
# combobox source
$comboVar = New-Object System.Windows.Forms.ComboBox
$comboVar.Size = New-Object System.Drawing.Size(350, 310)
$comboVar.Location = New-Object System.Drawing.Point(20, 130)
# Label valeurs
$label_val = New-Object System.Windows.Forms.Label
$label_val.AutoSize = $true
$label_val.Size = New-Object System.Drawing.Size(50,20)
$label_val.Location = New-Object System.Drawing.Point(20,150)
$label_val.Text = "Valeurs : "
# combobox source
$comboVal = New-Object System.Windows.Forms.ComboBox
$comboVal.Size = New-Object System.Drawing.Size(350, 310)
$comboVal.Location = New-Object System.Drawing.Point(20, 170)


# Label avancement
$label_av = New-Object System.Windows.Forms.Label
$label_av.AutoSize = $true
$label_av.Size = New-Object System.Drawing.Size(50,20)
$label_av.Location = New-Object System.Drawing.Point(110,210)
$label_av.Text = "variables traitées : "


# Explorateur de fichiers 
$Fichier = New-Object System.Windows.Forms.OpenFileDialog
$Fichier.InitialDirectory = Get-Location
$Fichier.Title = "Selectionner un fichier :"
$Fichier.FilterIndex = 3
#Add-Type -AssemblyName System.Windows.Forms
#$Fichier = New-Object System.Windows.Forms.OpenFileDialog -Property @{
#    InitialDirectory = [Environment]::GetFolderPath('Desktop')
#}

# Explorateur de dossiers 
$Dossier = New-Object System.Windows.Forms.FolderBrowserDialog
$Dossier.Description = "Destination du fichier variabilisé"
$Dossier.SelectedPath = Get-Location



# Bloc boutons
$form.Controls.Add($button_ok)
$form.Controls.Add($button_quit)
# Bloc Excel
$form.Controls.Add($Label_Excel)               # Texte Excel
$form.Controls.Add($TextBoxE)                  # TextBox Excel
$form.Controls.Add($button_Excel)              # Bouton Excel
$form.Controls.Add($Label_Word)                # Texte Word
$form.Controls.Add($TextBoxW)                  # TextBox Word
$form.Controls.Add($button_Word)               # Bouton Word
#######################################################################

# Gestion event quand on clique sur le bouton Fermer
$button_quit.Add_Click({
    $form.Close();    
})

# Gestion event quand on clique sur le bouton Excel
$button_Excel.Add_Click({ 
    $Show = $Fichier.ShowDialog()
    If ($Show -eq "Cancel") { "Annulé par l'utilisateur"}
    Else 
        { 
            $CheminE = $Fichier.FileName 
            $TextBoxE.Text = $CheminE

            # ouverture du fichier excel
            $global:FExcel = ouvrir($CheminE)
            $global:Onglet = $global:FExcel.Worksheets.Item(1) 
            $global:Onglet.activate()

            #chargement des titres
            $titres = ColTitres($global:Onglet)
            foreach($valeur in $titres) {
                $comboVal.Items.add($valeur)
                $comboVar.Items.add($valeur)
            }
            #affichage des combo box
            $form.Controls.Add($Label_var)
            $form.Controls.Add($comboVar)
            $form.Controls.Add($Label_val)
            $form.Controls.Add($comboVal)
        }
})

# Gestion event quand on clique sur le bouton Word
$button_Word.Add_Click({
    $Show = $Fichier.ShowDialog()
    If ($Show -eq "Cancel") { "Annulé par l'utilisateur"}
    Else 
        { 
            $Global:CheminW = $Fichier.FileName 
            $TextBoxW.Text = $Global:CheminW

            # ouverture du fichier word
            $global:FWord = ouvrir($Global:CheminW)
        }
})

# bouton Ok
$button_ok.Add_Click({
    # réccupération des index des colonnes excel
    $Col_Var = $comboVar.SelectedIndex + 1
    $Col_Val = $comboVal.SelectedIndex + 1
    $Env = $comboVal.SelectedItem

    Remplacer $global:onglet $global:FWord $Col_Var $Col_Val $Env 

})


# Affichage de la Windows
$form.ShowDialog()



#
#echo $E_Titres
#

Fermer($FWord)
Fermer($FExcel)
$global:Word.Quit()
# kill des processus restants.
while([System.Runtime.Interopservices.Marshal]::ReleaseComObject($global:Onglet)){}
while([System.Runtime.Interopservices.Marshal]::ReleaseComObject($global:FExcel)){}
while([System.Runtime.Interopservices.Marshal]::ReleaseComObject($global:FWord)){}
while([System.Runtime.Interopservices.Marshal]::ReleaseComObject($global:Word)){}
[System.GC]::Collect()

0 个答案:

没有答案