Question Liaisons Excel

Plus d'informations
il y a 17 ans 3 mois #3454 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Liaisons Excel
chm69 écrit:

Sur 30 excel, il me sort systématiquement qu'il y a des liaisons même dans les classeurs qu'y n'en n'ont pas.

Je pense que c'est ton test qui n'est pas correct, car l'appel à LinkSources peut renvoyer un objet $null et pas une liste vide, ce qui est différent.
Dans ce cas il faut debugger chaque objet aprés chaque appel, c'est long et fastidieux mais au final tu y gagne en temps et en sérénité.
[code:1]
$ConstxlLink=@{xlExcelLinks=1;
xlOLELinks=2;
xlPublishers=5;
xlSubscribers=6}

$ConstxlLink.GetEnumerator()|% {Set-variable $($_.Key) $($_.Value) -Option Constant}
dir variable:«»xl*

#Liste des Excel à modifier
$excel = new-object -comobject excel.application
$excel.visible = $true
$excelfile =\"$PWD\Classeur3.xls\"
$classeur = $excel.workbooks.open($excelfile)
#L'appel peut renvoyer $Null et non pas une liste vide si
# le fichier n'a pas de liaisons
$links = $classeur.LinkSources($xlOLELinks)
$Links.gettype()
#IsPublic IsSerial Name BaseType
#

----
#True True Object[*] System.Array

#Cerrtaines collections Office débute à 1
$Links[1]

if ( ($links -ne $null) -and ($links.Count -ne 0) )
{
#$links|% {$_.GetType()}
#$links|% {$_}
#On récupère une chaine de ce type là : Excel.Sheet.8|C:\test\Classeur2.xls!'
#On la parse avec une expression réguliéres.
#le symbole pipe est reconnu par PS et par les regex d'où le double 'échappement': \'|
$links|% {[void]($_ -match \"^(.*)\`|(.*)$\"«»); \"Type :{0}`r`nFichier :{1}`r`n\" -F $Matches[1],$Matches[2]}
}
else
{
Write-Host \"Aucune liaisons n'existent dans le fichier $excelfile\"
}
[/code:1]
Sur 3 fichiers de test, avec ou sans liaisons, le résultat est correct. Ce qui ne veut pas dire que ce code répond à tous les cas car je ne les connais pas.

Ensuite il me semble préférable de construire un objet correspondant à chaque fichier XL.
ici encore tu mixtes traitement et affichage.
Créé par exemple un objet personnalisé ayant les propriétés [string]FileName,[boolean]isLiaisons;[object[]] Liaisons..
Le dernier étant aussi un objet personnalisé [string]Type,[string]Source ...

Bon dev !
:P
ps
C'est ton cadeaux d'entreprise pour Noël ? :lol:

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 mois #3455 par michault
Réponse de michault sur le sujet Re:Liaisons Excel
Mon write-host c'est juste pour voir: c'est mon debug à moi même que c'est trop bien pour moi comme dit....

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 mois #3456 par michault
Réponse de michault sur le sujet Re:Liaisons Excel
Mon write-host c'est juste pour voir: c'est mon debug à moi même que c'est trop bien pour moi comme dit.... Par contre demain, il faut que je décortique ton expression régulière parce que moi qui aime pour l'instant écrire simple. Là je suis servi:sick:
En tout cas merci pour ta patience

PS: pourquoi après avoir poster en cliquant sur retour au message je me retrouve avec 2 posts identiques<br><br>Message édité par: chm69, à: 11/12/08 21:16

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 mois #3458 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Liaisons Excel
L'objectif est de récupérer 2 sous-chaînes, tu peux utiliser substring en 2/3 passes ou split('|'), ne sachant pas trop si le format est tjr le même j'ai préféré utiliser une regex même si cela obscurcit un peu le code :
[code:1]
[void]($_ -match \&quot;^(.*)\`|(.*)$\&quot;«»);
[/code:1]
Void est la pour éviter la prise en compte du résultat true/false.

Pour la regex :
^ : début de ligne
$ : fin de ligne
. : un caractère, tous sauf le retour chariot
(): un groupe
* : zéro ou + occurences de l'élement regex précédent
.* : zéro ou + caractères
(.*) : constitue un groupe de zéro ou + caractères, groupe accessible en cas de réussite de la regex via $Matches, variable automatique contennant le résultat de l'opération -Match, c'est un tableau.
\`| : on échappe le caractère pipe 2 fois : une pour les regex, le pipe signifie dans ce cas une alternative, et une autre pour éviter que le parseur de PS traite ce caractère comme un segment de pipeline.

Ce qui nous donne
^(.*) : je prends en début de ligne le premier groupe de caractères, tous ceux à gauche du séparateur pipe ($Matches[1])
(.*)$: je prends en fin de ligne le second groupe de caractères, tous ceux à droite du séparateur pipe ($Matches[2])

$Matches[0] contient la ligne d'origine à analyser.

Une remarque, ici je suppose que le délimiteur de la laison est tjr le caractère pipe, il manque donc un test :
[code:1]
if ( ($_ -match \&quot;^(.*)\`|(.*)$\&quot;«») ) {Ok...} else {erreur fatal : assertion fausse}
[/code:1]
Et le test suivant
[code:1]
if ( ($links -ne $null) -and ($links.Count -ne 0) )
[/code:1]
peut être simplement
[code:1]
if ($links -ne $null)
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 12/12/08 13:58

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 mois #3461 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Liaisons Excel
A propos des regex, je viens de tomber sur ce post .
Là cela devient un peu plus complexe mais pas celles que je propose sur ce forum ;)

Voir aussi .

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 mois #3493 par michault
Réponse de michault sur le sujet Re:Liaisons Excel
Je me suis contenté finalement de lister les classeurs concernés ainsi que les liaisons car j'avais pas malde cas de figures différents pour une mise à jour auto et peu de temps.

Je verrais plus tard pour l mise à jour.
Merci en tout cas pour les explications sur regex.

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.073 secondes
Propulsé par Kunena