我有一个获取两个文件的脚本:
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()