Question [Concours Scripting] out-excel (validé)

Plus d'informations
il y a 18 ans 5 mois #1018 par Jacques Barathon
Hé oui, me revoilou...

J'avais depuis quelques jours ce script en chantier, avec quelques bugs que j'ai finalement pu corriger ce midi. Voici la version finale (loin d'être parfaite, mais en tout cas fonctionnellement correcte je crois):

[code:1]
# out-excel.ps1
#
# Auteur: janel
# Date: 28/09/2007
#
# Redirige les objets émis par le pipeline dans un fichier Excel
#
# Usage:
#
# <commande> | out-excel [-filename] <fichier> [-force] [-autofit] [-header]
#
# -filename indique le nom du fichier Excel à utiliser
# -force spécifie qu'un fichier existant du même nom sera écrasé
# -autofit ajuste automatiquement la taille des colonnes à leur contenu
# -header met la première ligne en gras et bloque son affichage
#
# Exemple:
#
# get-process | select name,company,path,{$_.mainmodule.fileversion} | out-excel process.xls -force -h -a
#
# ... crée un fichier process.xls dans le répertoire courant qui pour chaque process actif recense son nom,
# la société éditrice de l'application, le chemin d'accès au fichier exécutable et la version du fichier.
#
param (
[String]$filename,
[switch]$force,
[switch]$autofit,
[switch]$header
)

# ajouter le répertoire en cours au nom de fichier si non précisé:
if (!(split-path $filename)) {$filename = join-path $pwd.path $filename}

# créer un fichier temporaire pour stocker les données au format CSV:
$tempfile = [System.IO.Path]::GetTempFileName()
$data = @($input)
$data | export-csv $tempfile -notypeinformation

# utiliser l'objet COM Excel:
$excel = new-object -com Excel.Application

# ouvrir le fichier CSV dans Excel:
$xlDelimited = [Microsoft.Office.Interop.Excel.xlTextParsingType]::«»xlDelimited
$xlTextQualifierNone = [Microsoft.Office.Interop.Excel.XlTextQualifier]::«»xlTextQualifierNone
$m = [System.Type]::Missing
$csv = $excel.Workbooks.OpenText($tempfile, $m, 1, $xlDelimited, $xlTextQualifierNone, $m, $m, $m, $true, $m, $m, $m, $m, $m, $m, $m, $m, $m)

# appliquer les modifications optionnelles:
$workbook = $excel.ActiveWorkbook
if ($autofit) {[void]$workbook.ActiveSheet.Columns.AutoFit()}
if ($header)
{
$workbook.ActiveSheet.Rows.Item(1).Font.Bold = $true
$workbook.Activate()
$excel.ActiveWindow.SplitRow = 1
$excel.ActiveWindow.FreezePanes = $true
}

# supprimer un fichier du même nom s'il existe:
if ($force) {del $filename -ea SilentlyContinue > $null}

# sauvegarder le fichier au format Excel:
$xlWorkbookNormal = [Microsoft.Office.Interop.Excel.xlFileFormat]::«»xlWorkbookNormal
$workbook.SaveAs($filename, $xlWorkbookNormal)
remove-item $tempfile

# faire le ménage:
$excel.WindowState = \"xlMinimized\"
$excel.visible = $true
stop-process @(get-process | where {$_.MainWindowHandle -eq $excel.Hwnd})[0].Id[/code:1]
Comme d'hab, les commentaires inclus devraient pouvoir suffire, mais n'hésitez pas si besoin est.

/* Bon, et puis les smileys curieux sont à remplacer par un signe ':' suivi d'un 'x'. Faites-moi savoir si ça ne marche pas, j'éditerai en insérant des espaces. */
Je constate que les smileys disparaissent une fois le message soumis au forum, alors qu'ils apparaissaient à la visualisation. Tant mieux! Un problème en moins. :)

Petit clin d'oeil en passant à CamilleB et aux autres avec qui j'ai échangé sur ce sujet au cours des derniers mois. Voir notamment la dernière partie (# faire le ménage) dans laquelle j'ai résolu le problème du process Excel qui restait ouvert malgré un Quit() sur l'objet COM.

Janel

Message édité par: janel, à: 28/09/07 13:42

Message édité par: janel, à: 28/09/07 13:43<br><br>Message édité par: robin, à: 18/12/07 09:22

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

Plus d'informations
il y a 18 ans 5 mois #1019 par Jacques Barathon
Alors, bougre de distrait que je suis...

Le script ci-dessus risque de boguer sur les postes FR. En effet, mon script utilise le format CSV comme intermédiaire pour relecture dans Excel. Or, le format CSV utilisé par PowerShell repose sur le standard US avec la virgule comme séparateur de champs, alors qu'Excel repose sur le standard local de Windows.

Et le standard local en France spécifie le point-virgule comme séparateur de champs...

Pour des raisons trop longues à expliquer mon poste est configuré en US. Je n'ai pas le temps de tester un passage en FR pour voir si le script marche, donc si quelqu'un pouvait le faire pour moi, ça serait super.

Il est possible que ça marche, si Excel s'adapte automatiquement au délimiteur détecté. Ca serait top, sinon il faudra que je fasse moi-même l'export dans un format CSV propre à la configuration locale!

Janel

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

Plus d'informations
il y a 18 ans 5 mois #1115 par Jacques Barathon
Quelqu'un a eu l'occasion de tester ce script sur un poste en français?

Si ça ne marche pas, j'ai une ou deux versions de rechange en chantier, mais je ne m'acharnerai pas à les finir si cette version-là marche. :P

Janel

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

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