springstil
Goto Top

Mit Powershell Excel auslesen und in CSV schreiben

Hallo zusammen,

ich komme leider absolut nicht weiter daher brauche ich bitte hilfe.

Wir bekommen eine Excel liste geschickt, in der steht ab Zeile 14 der Name usw.
Ab Zeile 31 steht die Bestellung drin, hieraus brauche ich allerdings nur die Infos aus C und I, natürlich kann es vorkommen das es mehre Artikel sind, also müsste geprüft werden wie oft ab Zeile 31 gefüllt ist und dem entsprechend oft ausgelesen werden.

Die CSV soll dann so ausziehen:

Name;Straße;PLZ;Ort;Land;Artikel;Menge
Ohne Worte;Musterstraße 14;51147;Köln;Deutschland;141648;1
Ohne Worte;Musterstraße 14;51147;Köln;Deutschland;11984;6

Ich kriege es aber einfach nicht hin die Spalten richtig auszulesen. Daher hoffe ich hier auf hilfe face-smile An bei einmal der Screenshot wie die Datei aussieht

1000002487

Content-ID: 83740261362

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

Ausgedruckt am: 21.11.2024 um 19:11 Uhr

8030021182
Lösung 8030021182 07.11.2023 aktualisiert um 09:37:05 Uhr
Goto Top
Hi.
Add-Type -A Microsoft.Office.Interop.Excel
# Quelldatei
$excelfile = 'C:\temp\orders.xlsx'  
# Zieldatei
$csvfile = 'C:\temp\orders.csv'  
# -----
# Excel öffnen
$objExcel = New-Object -Com Excel.Application -Property @{
    # unsichtbar starten
    Visible = $false
    # Dialoge unterdrücken
    DisplayAlerts = $false
}
# Workbook öffnen
$wb = $objExcel.Workbooks.Open($excelfile)
# Erstes Worksheet auswählen
$ws = $wb.Sheets.Item(1)
# Gemeinsame Werte auslesen
$name = $ws.Range("B14:B15").Value() -join ' '  
$street = $ws.Range("B19").Value()  
$postalcode = $ws.Range("B20").Value()  
$city = $ws.Range("B21").Value()  
$country = $ws.Range("B22").Value()  
# Bestellungen auslesen
$orders = $ws.Range("A31:A" + $ws.Cells($ws.Rows.Count,"A").End([Microsoft.Office.Interop.Excel.XlDirection]::xlUp).Row) | %{  
    [pscustomobject][ordered]@{
        Name = $name
        Straße = $street
        PLZ = $postalcode
        Ort = $city
        Land = $country
        Artikel = $_.Offset(0,2).Value()
        Menge = $_.Offset(0,8).Value()
    }
}
# Bestellungen in CSV speichern
$orders | export-csv -LiteralPath $csvfile -Delimiter ";" -NoTypeInformation -Encoding UTF8  
# Mappe und Excel schließen
$wb.Close($false)
$objExcel.DisplayAlerts = $true
$objExcel.Quit()
# COM-Müll zur Tonne bringen
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($objExcel)

Gruß Katrin
Springstil
Springstil 07.11.2023 um 10:11:08 Uhr
Goto Top
Vielen lieben dank face-smile Er hat nur leider weitergemacht nach dem in 32 z.b nichts mehr stand und hat die CSV demensprechend dann ausgefüllt. Aber das habe ich hinbekommen zu ändern. VIELEN DANK ! Das erspart und sehr viel Arbeit :D
8030021182
Lösung 8030021182 07.11.2023 aktualisiert um 10:22:10 Uhr
Goto Top
Zitat von @Springstil:
Er hat nur leider weitergemacht nach dem in 32 z.b nichts mehr stand
Dann war die Zelle in Spalte A nicht leer, z.B. Leerzeichen. Code sucht letzte belegte Zelle in Spalte A für die untere Begrenzung bzw. letzten Datensatz.
VIELEN DANK ! Das erspart und sehr viel Arbeit :D
👌 Na dann
Wie kann ich einen Beitrag als gelöst markieren?