Est-il un moyen plus rapide pour analyser un document excel avec Powershell?
Je suis l'interfaçage avec un MS Excel
document via Powershell
. Il y a une possibilité de chaque document excel d'avoir autour de 1000 lignes de données.
Actuellement ce script semble lire la Excel
fichier et écrire une valeur à l'écran à un taux de 1 record de tous les .6 secondes. À première vue, cela semble très lent.
C'est ma première fois de la lecture d'un Excel
fichier avec Powershell
, est-ce la norme? Est-il un moyen plus rapide pour moi de lire et d'analyser les Excel
données?
Voici le script de sortie (paré pour des raisons de lisibilité)
PS P:\Powershell\ExcelInterfaceTest> .\WRIRMPTruckInterface.ps1 test.xlsx
3/20/2013 4:46:01 PM
---------------------------
2 078110
3 078108
4 078107
5 078109
<SNIP>
242 078338
243 078344
244 078347
245 078350
3/20/2013 4:48:33 PM
---------------------------
PS P:\Powershell\ExcelInterfaceTest>
Ici est la Powershell
script:
########################################################################################################
# This is a common function I am using which will release excel objects
########################################################################################################
function Release-Ref ($ref) {
([System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$ref) -gt 0)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
}
########################################################################################################
# Variables
########################################################################################################
########################################################################################################
# Creating excel object
########################################################################################################
$objExcel = new-object -comobject excel.application
# Set to false to not open the app on screen.
$objExcel.Visible = $False
########################################################################################################
# Directory location where we have our excel files
########################################################################################################
$ExcelFilesLocation = "C:/ShippingInterface/" + $args[0]
########################################################################################################
# Open our excel file
########################################################################################################
$UserWorkBook = $objExcel.Workbooks.Open($ExcelFilesLocation)
########################################################################################################
# Here Item(1) refers to sheet 1 of of the workbook. If we want to access sheet 10, we have to modify the code to Item(10)
########################################################################################################
$UserWorksheet = $UserWorkBook.Worksheets.Item(2)
########################################################################################################
# This is counter which will help to iterrate trough the loop. This is simply a row counter
# I am starting row count as 2, because the first row in my case is header. So we dont need to read the header data
########################################################################################################
$intRow = 2
$a = Get-Date
write-host $a
write-host "---------------------------"
Do {
# Reading the first column of the current row
$TicketNumber = $UserWorksheet.Cells.Item($intRow, 1).Value()
write-host $intRow " " $TicketNumber
$intRow++
} While ($UserWorksheet.Cells.Item($intRow,1).Value() -ne $null)
$a = Get-Date
write-host $a
write-host "---------------------------"
########################################################################################################
# Exiting the excel object
########################################################################################################
$objExcel.Quit()
########################################################################################################
#Release all the objects used above
########################################################################################################
$a = Release-Ref($UserWorksheet)
$a = Release-Ref($UserWorkBook)
$a = Release-Ref($objExcel)
OriginalL'auteur ProfessionalAmateur | 2013-03-20
Vous devez vous connecter pour publier un commentaire.
Si les données sont statiques (pas de formules, juste des données dans les cellules), vous pouvez accéder à la feuille de calcul comme une source de données ODBC et SQL execute (ou au moins de type SQL) des requêtes. Jetez un oeil à cette référence pour la configuration de votre connectionstring (chaque feuille de calcul dans un classeur sera un "tableau" pour cet exercice), et l'utilisation
System.Data
à la requête de la même comme vous le feriez pour une base de données classique (Don Jones a écrit un fonction wrapper pour ce qui peut aider).Ce devrait être plus rapide que de lancer Excel & ramassé par le biais de la cellule par cellule.
Ce qui est excellent. Incroyablement plus rapide.
OriginalL'auteur alroc
Dans son entrée de blog Vitesse de Lecture des Fichiers Excel en PowerShell, Robert M. Toups, Jr explique que lors du chargement de PowerShell est rapide, lire les cellules Excel est très lent. D'autre part, PowerShell peut lire un fichier texte très rapidement, de sorte que sa solution est de charger la feuille de calcul dans PowerShell, utilisez Excel natif de l'export CSV processus de l'enregistrer comme un fichier CSV, puis utiliser PowerShell standard
Import-Csv
applet de commande à traiter les données plus rapides. Il signale que cela lui a donné jusqu'à 20 fois plus rapide le processus d'importation de!Tirant parti de Toups code, j'ai créé un
Import-Excel
fonction qui vous permet d'importer des données de feuille de calcul très facilement.Mon code ajoute la possibilité de sélectionner une feuille de calcul dans un classeur Excel, plutôt que de simplement en utilisant la feuille de calcul par défaut (c'est à dire la feuille active au moment où vous avez enregistré le fichier). Si vous omettez le
–SheetName
paramètre, il utilise la valeur par défaut de la feuille de calcul.Ces autres fonctions sont utilisées par l'Importation Excel:
Import-CSV
vous donne la possibilité de sélectionner des cellules et les données de la colonne?Les meilleures pratiques pour un utilitaire de ligne de commande (à retourner à la Unix jours), c'est qu'il devrait le faire chose. Donc, Import-Csv juste des importations de l'ensemble de la chose. Mais ensuite, vous avez juste appliquer la puissance de PowerShell, généralement
Where-Object
pour sélectionner les lignes,Select-Object
pour sélectionner des colonnes.Hmm Mauvais check it out. Va être difficile parce que le excel les données ne sont pas formatées de manière uniforme. Colonne des données n'est pas uniforme sur tout le parcours de la journée. Je vais jouer avec elle et voir. J'ai peut-être besoin d'avoir powershell enregistrer le excel doc au format CSV car il n'y a pas aucune interaction de l'utilisateur l'obtention de ces documents.
Cela fonctionne super rapide et super! Seul problème que j'ai c'est que c'est d'avoir des difficultés avec les caractères spéciaux comme 'é' et 'ê'. J'ai essayé différents types de CSV numéros, mais aucune ne semble fonctionner.
Génial! La solution était simple. Au lieu de channging la valeur
$xlCSVType = 6
, j'ai dû changer cetteImport-Csv -path $csvFile -Encoding Default
. Espérons que cela aide quelqu'un 🙂OriginalL'auteur Michael Sorens