13stift37
Goto Top

Per Powershell Excel Tabellen erstellen

Hallo liebe Admins und Entwickler.

Ich habe folgendes Problem:
Ich bin gerade dabei, ein PS Script für unsere neue Domäne zu schreiben. Dort bekommt jeder User ein Benutzernamen und ein Passwort zum Einloggen. Diese Daten sollen nun in eine Excel Datei geschrieben werden. Damit man sie anschließend ausdrucken, und an die jeweiligen Personen geben kann. Lange Rede kurzer Sinn: Wir haben mehrere Kurse, mit mehreren Leuten. Aufgabe: Eine Excel Datei, mehrere Tabellen. Pro Kurs eine Tabelle. Wo nun die Login Daten reingeschrieben werden sollen. Soweit so gut. Klappt auch. BIS ich einen 2. Kurs habe und er eine neue Tabelle erstellen soll. Da stehe ich nun vor einer Wand.

Der Code:
} else{

     Write-Host "Nope! Create new sheet..."  
    $sheetcount = $Workbooklogin.Worksheets.Count + 1   # Um die bisherigen Tabellenblätter zu zählen
    $TabelleLogin = $workbooklogin.worksheets.item($Sheetcount)    # Um das Tabellenblatt zu erstellen
    $TabelleLogin.Name = "$Kurs"  # Um die Tabelle umzubenennen  
Die Fehlermeldung:
Ausnahme bei Abrufen von "Item": "Ungültiger Index."  
In C:\Users\Administrator\....ps1: 88 Zeichen:9
+                   $TabelleLogin = $workbooklogin.worksheets.item($Sheetcount) 
+                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            + CategoryInfo                : NotSpecified: (:) , GetValueInvocationException
            + FullyQualifiedErrorID  : CatchFromBaseAdapterParameterizedPropertyGetValueTI

So. Wie kann ich nun ein neues Tabellenblatt HINTER den bestehenden erstellen, wenn er bei worksheets.item() immer eine feste Zahl in den Klammern haben will?

Hoffe es ist gut beschrieben und ihr könnt mir eventuell helfen.

Danke

Content-ID: 281896

Url: https://administrator.de/contentid/281896

Ausgedruckt am: 25.11.2024 um 02:11 Uhr

colinardo
Lösung colinardo 03.09.2015 aktualisiert um 14:04:20 Uhr
Goto Top
Hallo 13Stift37,
hier ein Beispiel:
(Kommentare siehe Code)
#Excel Objekt erzeugen
$objExcel = New-Object -Com Excel.Application

# Excel anzeigen
$objExcel.Visible = $true

# Workbook öffnen
$wb = $objExcel.Workbooks.Open('C:\Mappe1.xlsx')  

# letztes Sheet holen
$last_ws = $wb.Worksheets.Item($wb.Worksheets.Count)

# Nullwert für nicht genutzte Excel-Funktionparameter
$n = [System.Reflection.Missing]::Value

# Neues Sheet hinter dem letzten erstellen
$new_ws = $wb.Worksheets.Add($n,$last_ws,$n,$n)

# Sheet umbenennen
$new_ws.Name = "Test"  
Ein Export in eine CSV (export-csv) wäre aber IMHO sinnvoller als den Weg über die langsame Excel-Automatisierung zu gehen. Aber das bleibt deine Entscheidung.

Grüße Uwe
TlBERlUS
TlBERlUS 03.09.2015 aktualisiert um 13:09:07 Uhr
Goto Top
Hi,

warum nimmst du nicht eine csv-Datei?
Sollte doch fpr deine Ansprüche genügen und das Skript ist weniger fehleranfällig.
-> export-csv

Grüße,

Tiberius

Edit: @colinardo war mal wieder auf der Prisch anch Powershell-Themen.
13Stift37
13Stift37 03.09.2015 aktualisiert um 14:07:48 Uhr
Goto Top
Super Danke, das hat funktioniert!

Jetzt muss ich nur noch irgendwie hinbekommen, dass er erst checkt ob es schon eine Tabelle mit dem Kursnamen gibt. Eine Idee?

Mit
$kursexist = $WorkbookLogin.worksheets | where {$_.name -eq "$Kurs"}  

if ($Kursexist){
      ....
}
hat es leider nicht funktioniert. Da geht er immer ins else rein :/
colinardo
Lösung colinardo 03.09.2015 aktualisiert um 14:47:59 Uhr
Goto Top
Bei COM-Objekten Vorsicht beim Vergleich ohne explizite Angabe eines Vergleichstyps
$kursexist = $WorkbookLogin.worksheets | ?{$_.Name -eq $kurs}
if($kursexist -ne $null){
    write-host "Found"  
}else{
    write-host "Not found"  
}
Geht einwandfrei.
13Stift37
13Stift37 03.09.2015 aktualisiert um 15:25:40 Uhr
Goto Top
/Edit:

Hat leider nicht funktioniert!

Wenn der Kurs nicht existiert, erstellt er eine neue Tabelle mit dem Kurs namen. Soweit richtig!
AAAAber wenn ich das Script erneut ausführe und der Kurs ist bereits da, sagt er "Nope! Create new Sheet..."
und meckert dann, das es den Namen schon gibt und erstellt ein neues Tabellenblatt mit dem Namen "Tabelle 1".

Wo ist der Fehler? :/

Ich denke er hat Probleme mit dem Abfragen von dem Tabellen Namen..
colinardo
colinardo 03.09.2015 aktualisiert um 15:36:48 Uhr
Goto Top
Zitat von @13Stift37:
Hat leider nicht funktioniert!
Liegt leider an dir ...
Wo ist der Fehler? :/
Ohne deinen Code wie soll ich ihn finden, du hast ganz sicher nur eine Variable vertauscht oder an der falschen Stelle deklariert.

Ich denke er hat Probleme mit dem Abfragen von dem Tabellen Namen..
Du musst bei der Angabe bei Item() darauf achten das du entweder [Strings] verwendest oder [Integer], denn bei Integer Werten nimmt Excel an das du den Index des Sheets angeben willst, bei String den Name des Sheets!!!

Wenn du also einen Kurs hast der 23 heißt musst du Ihn in der Variablen so deklarieren:
$kurs = "23"  
Wohingegen
$kurs = 23
ein Integer ist. Und bei Integer-Werten nimmt Excel eben an das du den Index anstatt des Namen des Sheets angeben willst.

Noch nichts von Variablen-Debugging gehört ?