IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Passage en paramètre ComObject (Excel) + conversion XLSX


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut Passage en paramètre ComObject (Excel) + conversion XLSX
    Bonjour,

    Voilà, je dois faire quelques modif' automatiques dans un fichier excel (je récupère un listing CSV, je le convertis en XLSX, et je voudrais après faire quelques modifs.
    Alors j'ai réussi à faire fonctionner le premier script de conversion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $Excel = New-Object -comobject Excel.Application
    $Excel.Visible = $False
    #$Excel.Visible = $True
    
    $input_file="C:\Users\metalman\Desktop\fab\test.csv"
    $output_file="C:\Users\metalman\Desktop\fab\test.xlsx"
    $xlFixedFormat = [Microsoft.Office.Interop.Excel.XlFileFormat]::xlWorkbookDefault
    
    
    $wbk = $Excel.Workbooks.Open("$input_file")
    
    $Excel.ActiveWorkbook.SaveAs("$output_file", $xlFixedFormat)
    
    $Excel.Workbooks.Close()
    
    $Excel.Quit()
    1) Je voudrais être sûr du format : [Microsoft.Office.Interop.Excel.XlFileFormat]::xlWorkbookDefault génèrera TOUJOURS du XLSX ? Ou c'est parce que je l'ai configuré ainsi dans mon profil ?

    2) Je voudrais rendre l'ensemble un peu plus... structuré ! En faisant une fonction, amis ça ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    function MyConvert([System.Object]$excel, [string]$filein, [string]$fileout, [Microsoft.Office.Interop.Excel.XlFileFormat]$format)
    {
        $wbk = $excel.Workbooks.Open("$filein")
    
        #$b = $a.Workbooks.Add()
        #$c = $b.Worksheets.Item(1)
        #
        #$c.Cells.Item(1,1) = "A value in cell A1."
    
        $excel.ActiveWorkbook.SaveAs("$fileout", $format)
    
        $excel.Workbooks.Close()
    }
    
    $my_excel = New-Object -comobject Excel.Application
    $my_excel.Visible = $False
    #$excel.Visible = $True
    
    $input_file="C:\Users\metalman\Desktop\fab\test.csv"
    $output_file="C:\Users\metalman\Desktop\fab\test.xlsx"
    $xlFixedFormat = [Microsoft.Office.Interop.Excel.XlFileFormat]::xlWorkbookDefault
    
    MyConvert($my_excel, $input_file, $output_file, $xlFixedFormat)
    
    $my_excel.Quit()
    Me crache :
    PS S:\> C:\Users\metalman\Desktop\fab\ExcelPowerShell.ps1
    Impossible d’appeler une méthode dans une expression Null.
    Au caractère C:\Users\metalman\Desktop\fab\ExcelPowerShell.ps1:3 : 5
    + $wbk = $excel.Workbooks.Open("$filein")
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation : ( [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

    Impossible d’appeler une méthode dans une expression Null.
    Au caractère C:\Users\metalman\Desktop\fab\ExcelPowerShell.ps1:10 : 5
    + $excel.ActiveWorkbook.SaveAs("$fileout", $format)
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation : ( [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

    Impossible d’appeler une méthode dans une expression Null.
    Au caractère C:\Users\metalman\Desktop\fab\ExcelPowerShell.ps1:12 : 5
    + $excel.Workbooks.Close()
    + ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation : ( [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
    Alors je pense que c'est le passage du $excel qui fait tout foirer, mais pourquoi ?
    Comment puis-je n'ouvrir qu'une seul fois Excel, lancer ma procédure de conversion, et revenir dans le code principal ?

    Merci à tous !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Problème majeur réglé :

    On définie bien une fonction ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function MyConvert([System.Object]$excel, [string]$filein, [string]$fileout, [Microsoft.Office.Interop.Excel.XlFileFormat]$format)
    {
     ...
    }
    Mais on ne l'appelle pas : MyConvert($my_excel, $input_file, $output_file, $xlFixedFormat)
    On doit faire comme dans certains langages fonctionnels :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyConvert $my_excel $input_file $output_file $xlFixedFormat
    Sans virgule et avec des espaces !


    Bon... bah ça résout déjà ça !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2013
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 164
    Par défaut
    Bonjour,

    je me permets de déterrer ce vieux topic, je me retrouve exactement dans la situation de l'auteur, j'appele bien ma fonction sans parenthèses, ni virgules, juste des espaces mais j'obtiens malgré tout l'erreur : Impossible d’appeler une méthode dans une expression Null.

    J4ai passé en paramètre de la fonction le type Object[] ou [System.Object] comme l'auteur, j'ai même recopié son code mais toujours cette erreur pour moi

  4. #4
    Membre éprouvé
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    388
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Novembre 2004
    Messages : 388
    Par défaut
    Bonjour,

    Voici comment j'ai fait, ce code date un peu il faudra peut-être faire des améliorations

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Function ConvertArrayToXMLExcel($DataConvert, $NameXML, $WriteExcel=$true){
        $sb = New-Object -TypeName "System.Text.StringBuilder"
        $sb.Append('<?xml version="1.0" encoding="UTF-8"?>') | Out-Null
        $sb.Append('<?mso-application progid="Excel.Sheet"?>') | Out-Null
    
        $sb.Append('<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"'+"`r`n") | Out-Null
        $sb.Append('xmlns:o="urn:schemas-microsoft-com:office:office"'+"`r`n") | Out-Null
        $sb.Append('xmlns:x="urn:schemas-microsoft-com:office:excel"'+"`r`n") | Out-Null
        $sb.Append('xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"'+"`r`n") | Out-Null
        $sb.Append('xmlns:html="http://www.w3.org/TR/REC-html40">'+"`r`n") | Out-Null
    
        $headers = $DataConvert | Get-member -MemberType 'NoteProperty' | Select-Object -ExpandProperty 'Name'
    
        $sb.Append('<Worksheet ss:Name="out_Resultat_Tasks">'+"`r`n") | Out-Null
        $sb.Append('<Table>'+"`r`n") | Out-Null
        $sb.Append('<Row>'+"`r`n") | Out-Null
    
        foreach($item in $headers)
        {
            $sb.Append('<Cell><Data ss:Type="String">' + $item + "</Data></Cell>`r`n") | Out-Null
        }
    
        $sb.Append('</Row>') | Out-Null
    
        foreach($itemDB in $DataConvert)
        {
            $sb.Append('<Row>') | Out-Null
    
            foreach($itemHeader in $headers)
            {
                $sb.Append('<Cell><Data ss:Type="String">' + $itemDB.$itemHeader + "</Data></Cell>`r`n") | Out-Null
            }  
            $sb.Append('</Row>') | Out-Null
        }
        $sb.Append('</Table></Worksheet>') | Out-Null
        $sb.Append('</Workbook>') | Out-Null
        $sb.ToString() | Out-File .\$NameXML
    
        if($WriteExcel -eq $true){
    
    
            $xlsSpreadsheet = 51
            $Excel = New-Object -Com Excel.Application
            $WorkBook = $Excel.Workbooks.Open((Get-ChildItem .\$NameXML).FullName)
            $WorkBook.SaveAs((Get-ChildItem .\$NameXML).Directory.FullName + "\$($NameXML).xlsx", $xlsSpreadsheet)
            $Excel.Quit()
        }
    
    }
    
    $test = Get-ChildItem ..\* 
    
    ConvertArrayToXMLExcel -DataConvert $test-NameXML "test.xml"-WriteExcel $true
    Pour un CSV il faudra faire

    $LoadCSV = import-csv .\VotreFichier.csv ...
    puis
    ConvertArrayToXMLExcel -DataConvert $LoadCSV-NameXML "test.xml" -WriteExcel $true

  5. #5
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2013
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 164
    Par défaut
    Merci, finalement je m'en suis tiré en mettant un paramètre le chemin d'accès du fichier que je voulais ouvrir et non l'objet COM Excel

Discussions similaires

  1. [Toutes versions] [Tutoriel] Passage de paramètres depuis Batch vers Excel
    Par Jean-Philippe André dans le forum Excel
    Réponses: 9
    Dernier message: 08/06/2020, 16h55
  2. Passage de paramètres à l'ouverture Excel
    Par BobDall dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/12/2009, 21h46
  3. Passage de paramètre depuis Access vers Excel
    Par funkyjul dans le forum VBA Access
    Réponses: 4
    Dernier message: 07/10/2008, 09h43
  4. [Excel]Passage de paramètres dans une formule
    Par fbench dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/02/2006, 12h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo