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-Key: 83740261362

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

Printed on: April 28, 2024 at 15:04 o'clock

Mitglied: 8030021182
Solution 8030021182 Nov 07, 2023 updated at 08:37:05 (UTC)
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
Member: Springstil
Springstil Nov 07, 2023 at 09:11:08 (UTC)
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
Mitglied: 8030021182
Solution 8030021182 Nov 07, 2023 updated at 09:22:10 (UTC)
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
How can I mark a post as solved?