Question création d'une boîte de dialogue pour générer un fichier excel

Plus d'informations
il y a 1 semaine 4 jours - il y a 1 semaine 4 jours #34485 par gertrude
Bonjour la communauté !

Ca fait longtemps que je n'ai pas posté ici :)

Aujourd'hui, j'ai voulu créer pour la toute première fois une petite boîte de dialogue simple à destination de gens qui ne savent pas utiliser PowerShell qui sert à :

 - créer un fichier excel avec deux colonnes : nom du client, liste des serveurs
Dans la fenêtre qui apparaît lorsqu'on démarre le script, il y a deux "boîtes de texte" (des textboxes !) : une dans laquelle on met le nom du client, et l'autre dans laquelle on met la liste des serveurs, 1 serveur par ligne.

Je rencontre plusieurs problèmes :

 - c'est sensé, quand on clique sur "générer excel", créer un fichier, sauf que dans le fichier créé (qui en plus n'est pas créé correctement, il y a des bugs et je dois l'enregistrer manuellement, mais bon passons sur ça pour le moment) ne contient que les en-têtes des colonnes, et pas le texte rentré dans les textboxes.

 - sûrement en lien avec le point précédent, le bouton "Ajouter une infra supplémentaire" ne fonctionne pas : ça devrait rendre les textboxes vides, alors que non : ça agrandit la fenêtre d'une façon bizarre, et cache un des boutons.

Je vous confie le code.

Par avance, merci :)

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$form = New-Object System.Windows.Forms.Form
$form.Text = "Exporter vers Excel"
$form.Size = New-Object System.Drawing.Size(580, 500)

# Police des étiquettes
$fontLabels = New-Object System.Drawing.Font("Arial", 12)
# Police du texte qu'on écrit (textboxes)
$fontTextBoxes = New-Object System.Drawing.Font("Arial", 14)
# Police des boutons
$fontButtons = New-Object System.Drawing.Font("Arial", 12)

$clientTextBoxes = @()
$serverTextBoxes = @()

function Add-InfraControls {
    param ($topPosition)
    
    $clientNameLabel = New-Object System.Windows.Forms.Label
    $clientNameLabel.Text = "Nom du client"
    $clientNameLabel.Location = New-Object System.Drawing.Point(10, $topPosition)
    $clientNameLabel.AutoSize = $true
    $clientNameLabel.Font = $fontLabels
    $form.Controls.Add($clientNameLabel)

    $clientNameTextBox = New-Object System.Windows.Forms.TextBox
    $clientNameTextBox.Location = New-Object System.Drawing.Point(200, $topPosition)
    $clientNameTextBox.Size = New-Object System.Drawing.Size(330, 30) # pour modifier la taille, modifier les valeurs entre parenthèses (largeur, je ne sais pas)
    $clientNameTextBox.Font = $fontTextBoxes
    $form.Controls.Add($clientNameTextBox)
    $clientTextBoxes += $clientNameTextBox

    $serversLabel = New-Object System.Windows.Forms.Label
    $serversLabel.Text = "Liste des serveurs"
    $serversLabel.Location = New-Object System.Drawing.Point(10, ($topPosition + 60))
    $serversLabel.AutoSize = $true
    $serversLabel.Font = $fontLabels
    $form.Controls.Add($serversLabel)

    $serversTextBox = New-Object System.Windows.Forms.TextBox
    $serversTextBox.Location = New-Object System.Drawing.Point(200, ($topPosition + 60))
    $serversTextBox.Size = New-Object System.Drawing.Size(330, 220)
    $serversTextBox.Multiline = $true
    $serversTextBox.ScrollBars = [System.Windows.Forms.ScrollBars]::Vertical
    $serversTextBox.Font = $fontTextBoxes
    $form.Controls.Add($serversTextBox)
    $serverTextBoxes += $serversTextBox
}

Add-InfraControls -topPosition 20

$addInfraButton = New-Object System.Windows.Forms.Button
$addInfraButton.Text = "Ajouter une infra supplémentaire"
$addInfraButton.Location = New-Object System.Drawing.Point(10, 325)
$addInfraButton.Size = New-Object System.Drawing.Size(250, 50)
$addInfraButton.Font = $fontButtons
$addInfraButton.Add_Click({
    $currentTopPosition = 20 + (($clientTextBoxes.Count) * 160)
    Add-InfraControls -topPosition $currentTopPosition
    $generateButton.Location = New-Object System.Drawing.Point(300, ($currentTopPosition + 160))
    $quitButton.Location = New-Object System.Drawing.Point(10, ($currentTopPosition + 160))
    $form.Height += 160
})
$form.Controls.Add($addInfraButton)

$generateButton = New-Object System.Windows.Forms.Button
$generateButton.Text = "Générer le fichier Excel"
$generateButton.Location = New-Object System.Drawing.Point(300, 400)
$generateButton.Size = New-Object System.Drawing.Size(250, 50)
$generateButton.Font = $fontButtons
$generateButton.Add_Click({
    $excel = New-Object -ComObject Excel.Application
    $excel.Visible = $false
    $workbook = $excel.Workbooks.Add()
    $worksheet = $workbook.Worksheets.Item(1)
    
    $worksheet.Cells.Item(1, 1) = "nom du client"
    $worksheet.Cells.Item(1, 2) = "serveur"

    for ($i = 0; $i -lt $clientTextBoxes.Count; $i++) {
        $clientName = $clientTextBoxes[$i].Text
        $servers = $serverTextBoxes[$i].Lines -join ','
        
        [System.Windows.Forms.MessageBox]::Show("Client Name: $clientName, Servers: $servers")

        $worksheet.Cells.Item($i + 2, 1) = $clientName
        $worksheet.Cells.Item($i + 2, 2) = $servers
    }

    $outputPath = "C:\export.xlsx"
    
    $workbook.SaveAs($outputPath)
    $excel.Quit()
    
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($worksheet) | Out-Null
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook) | Out-Null
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null

    [System.Windows.Forms.MessageBox]::Show("Fichier Excel généré avec succès à: $outputPath")
})
$form.Controls.Add($generateButton)

$quitButton = New-Object System.Windows.Forms.Button
$quitButton.Text = "Quitter"
$quitButton.Location = New-Object System.Drawing.Point(10, 400)
$quitButton.Size = New-Object System.Drawing.Size(250, 50)
$quitButton.Font = $fontButtons
$quitButton.Add_Click({
    $form.Close()
})
$form.Controls.Add($quitButton)

$form.Add_Shown({$form.Activate()})
[System.Windows.Forms.Application]::Run($form)

Dernière édition: il y a 1 semaine 4 jours par gertrude.

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

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