Question
Conversion Xls to XLSB
- Wilfrid Burel
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 4
- Remerciements reçus 0
Je me suis lancé depuis un mois ds powershell. J'ai sur le reseau des tonnes de fichiers office ancienne génération et j'ai décidé de tous les migrer ds une version plus récentes pour simplement gagner de l'expace disque.
J'ai donc fait 3 scripts : ppt2pptx, doc2docx et xls2xlsb.
les deux premier fonctionnent tres bien, je n'ai aucune erreur aussi je ne les detaillerais pas (si besoin je peux les poster).
Concernant xls2xlsb, c'est autre chose.
Voici le code :
[code:1]
#Format XLSB - excel binaire
$xlFixedFormat = [Microsoft.Office.Interop.Excel.XlFileFormat]::«»xlExcel12
#$saveAsX = 56 #Format XLSB - excel binaire
$fChars2 = '?', '/', '|', '', '.', '*', '<', '>', '\"'
$pat2 = [string]::join('|', ($fChars2 | % {[regex]::escape($_)}))
$app = New-Object -ComObject Excel.Application
$app.Visible = 1
$FileList=@()
$App.DisplayAlerts = $False
# Execution Sur laptop
$Laptop = $env:computername.Substring(0,4)
$folder=$null
If ($Laptop -match \"LTFR\"«»)
{
$folder =[System.Environment]::GetFolderPath(5) +\"\\"
}
Else
{
while ($folder -eq $null)
{
$folder = read-host \"Enter directory name\"
if (-not(test-path $folder))
{
Write-host \"Invalid directory path, re-enter.\"
$folder = $null
}
elseif (-not (get-item $folder).psiscontainer)
{
Write-host \"Target must be a directory, re-enter.\"
$folder = $null
}
}
$i = $folder.EndsWith(\"\\"«»)
if(-not $i) {$folder = $folder+\"\\"}
}
get-ChildItem $folder -recurse -include *.xls | % {
$name=$null
#remplacement des caracteres indésirables '?', '/', '|', '', '.', '*', '<', '>', '\"'
$name = $_.name -replace $pat2,\" \"
#$count = [regex]::matches($name.tolower(),\"xls\"«»).count
#if ($count -gt 1) {
$name = $name -replace \" xls\",\"\"
$name = $name + \".xls\"
move-Item -literalpath $_.fullname -destination ($_.directoryname+\"\\"+$name)
$path = ($_.directoryname+\"\\"+$name).Substring(0, ($_.directoryname+\"\\"+$name).LastIndexOf('.'))
$ppt = $app.workbooks.Open(($_.directoryname+\"\\"+$name))
$ppt.SaveAs($path, $xlFixedFormat)
$ppt.Close()
$oldfile = $name
$newname = ($name).substring(0,($name).lastindexOf(\".\"«»))+\".xlsb\"
#Si la conversion est bonne je remet les date de creation et modification sur le nouveau fichier telle qu'elles etaient sur l'ancien
if (Test-Path ($_.directoryname+\"\\"+$newname)) {
$old = Get-Item -Path ($_.directoryname+\"\\"+$oldfile)
$new = Get-Item ($_.directoryname+\"\\"+$newname)
$new.LastWriteTime = $old.LastWriteTime
$new.CreationTime = $old.CreationTime
$Filelist = $Filelist + ($_.directoryname+\"\\"+$oldfile)
}
}
$app.Quit()
$app.Quit()
$app = $null
$FileList
#j'efface les anciens fichiers xls
foreach ($myfile in $FileList ) { Remove-Item $myFile}[/code:1]
Le soucis :
Je double clique dessus, il s'execute avec erreurs
Je clique droit - modifier. Le fichier s'ouvre dans powershell editor. Je l'execute j'ai la meme erreur :
[code:1]Unable to find type [Microsoft.Office.Interop.Excel.XlFileFormat]: make sure that the assembly containing this type is loaded.
At C:\Temp\xls2xlsx.ps1:1 char:63
+ $xlFixedFormat = [Microsoft.Office.Interop.Excel.XlFileFormat] <<<< ::«»xlExcel12
+ CategoryInfo : InvalidOperation: (Microsoft.Offic...el.XlFileFormat:«»String) [], RuntimeException
+ FullyQualifiedErrorId : TypeNotFound[/code:1]
Sans rien toucher je le relance dans l'editeur .... et la plus d'erreur. Le script fait bien ma conversion.
Du a cette erreur je ne peux passer mon script en live sur mes laptops. Je suis obligé de l'éxécuter deux fois en passant par \"Modifier\".
OS : XP SP3 EN + MUI FR
Si quelqu'un pouvais me guider sur ce point j'apprecierai grandement
Merci d'avance a quiconque prendra le temps de me lire.
Message édité par: orlith, à: 22/08/11 17:45<br><br>Message édité par: orlith, à: 22/08/11 17:50
Connexion ou Créer un compte pour participer à la conversation.
- Alan Pinard
- Hors Ligne
- Membre senior
-
- Messages : 77
- Remerciements reçus 0
Je crois que ton problème vient du fait qu'il n'y a pas de membre xlExcel12 dans la classe que tu utilises selon ce que j'ai observé.
Voici un lien vers Microsoft qui te permettra de voir ce que tu pourrais utiliser:
msdn.microsoft.com/en-us/library/microso...at(v=office.11).aspx
Alan
Alan Pinard
Version A
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6290
- Remerciements reçus 67
Cela dépend de la version d'Office ou des assemblies installés, version que l'on ne connait pas d'ailleurs.Je crois que ton problème vient du fait qu'il n'y a pas de membre xlExcel12 dans la classe que tu utilises selon ce que j'ai observé.
orlith écrit:
Il faut analyser la première exception.Sans rien toucher je le relance dans l'editeur .... et la plus d'erreur. Le script fait bien ma conversion.
Dans ton script tu utilises un type dont l'assemblies n'est pas encore chargé, d'où l'erreur. En revanche la fin d'exécution de ton script charge XL.
Ceci fait qu'il charge ses dépendances, c'est grâce à cela que la seconde exécution fonctionne, l'assemblie Microsoft.Office.Interop.Excel est présent en mémoire, le type est donc accessible.
Je viens de faire le test et j'ai la même erreur et le même comportement.<br><br>Message édité par: Laurent Dardenne, à: 22/08/11 21:16
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Wilfrid Burel
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 4
- Remerciements reçus 0
Merci pour vos réponses.
Donc si je lance excel des le debut du script il trouvera les assemblies necessaire a la conversion en xlsb si je te suis bien Laurent ? ou bien je declare la variable plus bas apres l'ouverture de mes documents (mais la j'ai pas l'habitude de declarer a la volée ^^) ?
Quant a connaitre la version des assemblies, je ne sais pas comment l'obtenir. concernant office c'est 2007 en + mui fr.
Merci<br><br>Message édité par: orlith, à: 22/08/11 22:45
Connexion ou Créer un compte pour participer à la conversation.
- Wilfrid Burel
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 4
- Remerciements reçus 0
J'ai bougé la déclaration juste apres la creation du nouvel objet excel.
Ca marche nickel.
Merci encore.
Question subsidiaire :
Est ce normal qu'un script en powershell 1 (je crois) qui tourne sur XP remonte des erreurs quand executé sur un seven 64bits ?
ex: avec le script ci dessus sous seven il me dis que la methode saveas n'as pas le bon nompbre d'argument ou qu'un des arg est incorrect ?
On ne dis pas géénralement qui peut le plus peut le moins ?
Thx
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6290
- Remerciements reçus 67
Il faut vérifier si la signature de méthode que tu utilises existe tjr sur la plateforme ciblée.ex: avec le script ci dessus sous seven il me dis que la methode saveas n'as pas le bon nompbre d'argument ou qu'un des arg est incorrect ?
Et si Office et l'assembly interop sont identiques.
orlith écrit:
COM c'est un peu particulier, mais je suis tenté de te répondre oui.<br><br>Message édité par: Laurent Dardenne, à: 24/08/11 20:40On ne dis pas géénralement qui peut le plus peut le moins ?
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Conversion Xls to XLSB