2017-08-18 2 views
1

Je dois rechercher une chaîne particulière dans une feuille de calcul Excel contenant plusieurs feuilles. Je suis à la recherche d'un moyen de rechercher tout le contenu du fichier Excel similaire à l'option Trouver tout dans Excel avec la portée définie dans le classeur et pas seulement la feuille de calcul.Comment rechercher un classeur Excel complet pour une chaîne particulière à l'aide de PowerShell

Ce serait vraiment bien s'il y avait quelque chose de similaire à la chaîne de recherche d'une chaîne particulière dans le fichier régulier, (c.-à)

gci xcelfile.xls | select-string -pattern $mySearchString 

J'ai cherché sur internet et je ne vois pas beaucoup d'informations existantes pour rechercher le contenu d'un fichier Excel existant en utilisant PowerShell. J'espère que je peux obtenir quelques indications ici pour me faire atteindre mon objectif.

Toute aide est très appréciée. Merci Don

+0

https://stackoverflow.com/questions/30200920/finding-content-of-excel-file-in-powershell Peut-être. Supposer qu'il n'y a pas de global pourrait facilement énumérer toutes les feuilles – Matt

+0

J'ai utilisé la commande select-string ci-dessus et il a trouvé la chaîne dans le fichier, mais le fichier a plusieurs feuilles de calcul et j'ai besoin de tirer les données d'une colonne adjacente. Le résultat obtenu contient une valeur numérique mais je ne peux pas facilement la relier à quoi que ce soit. –

+0

Matt, Désolé, j'ai lu ce que vous avez dit mais je ne sais pas exactement ce que vous voulez dire. Qu'est-ce que cela ferait pour moi et comment le ferais-je? Merci –

Répondre

1

Ouvre Excel

charges du fichier

boucles dans chaque feuille de calcul

Recherches une gamme

boucles par trouver à côté des sorties Index $ Colonne $ Ligne

Quitte Excel

$File = "C:\TEST.xlsx" 
$SearchString = "TEST" 
$Excel = New-Object -ComObject Excel.Application 
$Workbook = $Excel.Workbooks.Open($File) 
for($i = 1; $i -lt $($Workbook.Sheets.Count() + 1); $i++){ 
    $Range = $Workbook.Sheets.Item($i).Range("A:Z") 
    $Target = $Range.Find($SearchString) 
    $First = $Target 
    Do 
    { 
     Write-Host "$i $($Target.AddressLocal())" 
     $Target = $Range.FindNext($Target) 
    } 
    While ($Target -ne $NULL -and $Target.AddressLocal() -ne $First.AddressLocal()) 
} 
$Excel.Quit() 
+2

J'ai appris mieux depuis que j'ai écrit la réponse liée dans les commentaires. Maintenant, je recommanderais 'ForEach ($ Sheet in $ ($ Workbook.Sheets)) {' pour la boucle, alors vous pouvez faire '$ Target = $ Sheet.UsedRange.Find ($ SearchString)'. Mieux vaut utiliser 'UsedRange' que' Range ("A: Z") 'pour ne pas chercher plus que nécessaire, et vous êtes sûr de capturer toutes les données possibles. – TheMadTechnician

+1

@TheMadTechnician Je déteste la plupart du code que j'ai écrit la veille – Matt