Question [Fonction]Export d'une feuille Excel au format Csv

Plus d'informations
il y a 15 ans 9 mois #2630 par Laurent Dardenne
Basé sur un fichier Excel contenant 1 seule feuille avec des colonnes de format \"simple\".

[code:1]
# Convert-ExcelToCsv.ps1
# Export d'une feuille Excel au format csv (Excel 2003)
#
# $NomFichierXL : Nom complet du fichier Excel à enregistrer au format csv
#
# $NotConvertSeparator : Indique qu'on ne transforme pas le séparateur point-virgule par une virgule.
#
function Convert-ExcelToCsv([string]$NomFichierXL=$(throw \"Le nom de fichier doit être renseigné.\"«»),[switch]$NotConvertSeparator)
{
if (!(test-path $NomFichierXL))
{ Write-Warning \"Le fichier $NomFichierXL n'existe pas.\"; return}

#On crée un fichier temporaire afin d'obtenir un nom de fichier unique puis
#on le supprime sinon la méthode SaveAs d'Excel demandera une confirmation de suppression
#Ce fichier contient les données au format texte séparées par un point-virgule
$NomFichierTmp = [System.IO.Path]::GetTempFileName()
if (test-path $NomFichierTmp) {remove-item $NomFichierTmp}

#Construit le nom de fichier CSV
#Ce fichier contiendra les données au format texte séparées par une virgule sauf si $NotConvertSeparator est présent
#dans ce cas il contiendra les données au format texte séparées par un point-virgule
$NomFichierCsv=[System.IO.Path]::ChangeExtension($NomFichierXL,\".csv\"«»)

#Supprime l'ancien fichier csv
if (test-path $NomFichierCsv) { remove-item $NomFichierCsv }


#Exécute Excel, en mode invisible par défaut. Ses fenêtres d'erreurs ou de confirmation peuvent toutefois s'afficher.
$Excel = new-object -com Excel.Application

#Ouvre le fichier source
$Classeur=$Excel.Workbooks.Open($NomFichierXL)
#En cas de pb d'accés la variable $Classeur n'est pas initialisée
if ($Classeur -eq $Null) { Write-Warning \"Traitement interrompu.\"; return}

#<-- Paramétres de la méthode SaveAS
#Récupére le format de sauvegarde de l'énumération xlFileFormat à partir de l'assembly interop Excel
$FileFormat=[Microsoft.Office.Interop.Excel.xlFileFormat]::«»xlCsv
#Missing indique pour un objet COM un paramètre absent. [System.Type]::Missing] n'est pas égal à $Null
$Password=[System.Type]::Missing
$WriteResPassword=[System.Type]::Missing
$ReadOnlyRecommended=$False
$CreateBackup=$False
$AddToMru=$False
$TextCodepage=[System.Type]::Missing
$TextVisualLayout=[System.Type]::Missing
$LangueLocal=$False
#-->
#On choisi d'enregistrer la feuille sélectionnée
# Version simplifiée : $Classeur.SaveAs($NomFichierTmp,$FileFormat)
$Classeur.SaveAs($NomFichierTmp,
$FileFormat,
$Password,
$WriteResPassword,
$ReadOnlyRecommended,
$CreateBackup,
$AddToMru,
$TextCodepage,
$TextVisualLayout,
$LangueLocal)

#Le changement de format de fichier provoque une alerte
$Excel.DisplayAlerts=$False
#Quitte et force la libération de l'instance d'Excel
$Excel.Quit()
$Excel=$Null
[GC]::Collect()

if ($NotConvertSeparator.isPresent)
#Le fichier tmp est crée dans le répertoire %TEMP%/%TMP%
{ Copy-Item $NomFichierTmp $NomFichierCsv }
else
#Modifie le séparateur pour un usage avec Import-Csv
{ get-content $NomFichierTmp|% {$_ -replace ';',','}| out-file $NomFichierCsv }

#Supprime le fichier transitoire créé par Excel
if (test-path $NomFichierTmp) { remove-item $NomFichierTmp}
}
[/code:1]
Un exemple d'appel :
[code:1]
$Error.clear()
Convert-ExcelToCsv \"$pwd\Comptes.xls\"
if ($Error.count -ne 0} {return}
# traitement des données issues fichier .csv
[/code:1]
Il reste qq tests à ajouter : fichier ou lecteur cible en R/O, XLS verrouillé par un autre process, ...

Tutoriels PowerShell

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

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