snakebite2004
Goto Top

Excelwerte über Powershell auslesen und formatieren

Hallo zusammen,
ich sitze vor folgendem Problem:
Ich möchte in einer beliebigen Exceldatei(Auswahl muss durch Benutzer erfolgen können) nach Benutzerdefinierten Textfolgen(gesamt 3) suchen,
Problem an dieser Sache ist dass die Werte in folgendem Format vorliegen (Bezeichnung'Leerzeichen'Wert)
Wert1 12345
Wert2 xyz
Wert3 Musterstraße 123

beliebiger Text
beliebiger Text
beliebiger Text

Wert1 56789
Wert2 abc
Wert3 Musterweg 9


Die Werte (12345,xyz, Musterstraße 123) sollen in eine neue Exceldatei gespeichert werden, und zwar in einzelne Spalten

Wert1 Wert2 Wert 3
12345 Xyz Musterstraße 123
56789 abc Musterweg 9


Kann mir jemand hier weiterhelfen? Vielen Dank!

Content-ID: 298525

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

Ausgedruckt am: 23.11.2024 um 15:11 Uhr

114757
114757 08.03.2016 aktualisiert um 17:45:19 Uhr
Goto Top
Hallo Snakebite2004,
ein paar Fragen dazu:

  • Meinst du mit Excel-Dateien :CSV-Dateien oder xlsx/xlsm etc. ?
nach Benutzerdefinierten Textfolgen(gesamt 3) suchen,
  • Das ist mir zu lasch formuliert, mit drei Begriffen gleichzeitig suchen ? In beliebiger Reihenfolge oder nach welchem Schema ?
  • Sind es immer 3 Zeilen die übernommen werden müssen (Gruppe) auch wenn nur ein Suchwort gefunden wird oder wie stellst du dir das vor ?

Wäre schön wenn du das ganze noch etwas präzisieren könntest. Du weist ja hoffentlich Programmierer benötigen es exakt damit Programme das machen was der User will ! face-smile

Gruß jodel32
Snakebite2004
Snakebite2004 08.03.2016 um 19:53:27 Uhr
Goto Top
Hallo, danke erstmal.
Es handelt sich um xlsx Dateien
Es sind immer exakt drei unterschiedliche Werte die alle gefunden werden müssen,
jedoch variiert deren Bezeichnung wesshalb alle drei Werte(es sind Zeichenfolgen) vom Nutzer bei Beginn eingegeben und in der Datei gefunden werden sollten.(z.b. wert1='plz', wert2=ort wert3=straße) Als Beispiel zur Bezeichnung: Einmal steht der Wert 'plz 12345' und in der nächsten Datei ' postleitzahl 12345'
Im Ergebnis soll in der neuen Datei dann eine Spalte mit Postleitzahl als überschrift und die Werte darunter aufgelistet werden. Im Beispiel also drei Spalten: plz, ort, straße9
Zum zweiten Punkt ist es so dass in 99% der fälle die Werte in 3 aufeinanderfolgenden Zeilen stehen. Allerdings gibt es auch eine Datei in der die Werte in einer Zeile hintereinander gereiht sind(durch Leerzeichen getrennt) Die Lösung die auch diese Datei abfrägt wäre natürlich das nonplus ultra, ist aber nicht zwingend.

Ich hoffe ich konnte die Anforderungen damit konkretisieren, ich bin für jede Hilfe dankbar und natürlich auch für Rückfragen...( Programmierung ist und war nie mein Steckenpferdface-smile)
Gruß Snakebite
114757
Lösung 114757 09.03.2016 aktualisiert um 10:19:38 Uhr
Goto Top
Obwohl ich das bei der Kombination von Excel und Powershell mit VBS machen würde (da sehr viel schneller... die Automatisierung von Excel ist in Powershell nämlich ziemlich lahm) hier die Powershell-Variante:
Die Anzeige der Excel-Fenster lässt sich im Code Zeile 29 ausschalten, ist nur für deine Debug-Zwecke eingeschaltet. Nicht ungeduldig werden wenn das Fenster etwas länger offen ist während gesucht wird - wie gesagt Excel-Automatisierung via COM ist mit Powershell ein graus!

Abgespeichert wird das Result-Sheet im selben Verzeichnis wie die vom User ausgewählte Datei, kannst du aber nach belieben in Zeile 20 ändern.
Add-Type -AssemblyName System.Windows.Forms
cls
# Suchwörter abfragen
$searchterms = @()
1..3 | %{
    $searchterms += (Read-Host "Suchwert $_ eingeben").ToString()  
}

# Datei-Auswahldialog ----
$dlg = New-Object System.Windows.Forms.OpenFileDialog
$dlg.Multiselect = $false
$dlg.Title = 'Datei die durchsucht werden soll auswählen'  
$dlg.Filter = 'Excel Dateien | *.xlsx;*.xls;*.xlsm'  
if($dlg.ShowDialog() -eq 'OK'){  
    $quelle = $dlg.FileName
}
# --------

# Speicherpfad für Ausgabedatei (im selben Ordner wie die Quelle)
$savepath = "$(Split-Path $quelle -Parent)\result.xlsx"  

# Excel Objekt
$objExcel = New-Object -Com Excel.Application
# Dialogfelder ausschalten
$objExcel.DisplayAlerts = $false
# Mappe öffnen
$wb = $objExcel.Workbooks.Open($quelle)
# Excel anzeigen (wenn nicht gewünscht auf $false setzen)
$objExcel.Visible = $true
# Neues Workbook erstellen
$wbout = $objExcel.Workbooks.Add()
# Ausgabesheet im neuen Workbook
$wsout = $wbout.Sheets.Item(1)
# Überschriften der Spalten im Ausgabesheet setzen
$wsout.Range("A1:C1").Value() = $searchterms  

# Suchbereich im Quellsheet festlegen
$rngSearch =  $wb.Sheets.Item(1).Range("A:A")  
$col = 1
# Für jedes Suchwort einen Suchvorgang starten
$searchterms | %{
    $found = @()
    $result = $rngSearch.Find("$_*",[System.Reflection.Missing]::Value,-4163)  
    # Wenn Wert gefunden wurde
    if ($result -ne $null){
        # erste Fundstelle speichern wegen Abbruchbedingung
        $f = $result.Address()
        Do{
            # Fund mit Leerzeichen splitten und in Array speichern
            $found += $result.Value().Split(" ",2)[1]  
            # nächste Fundstelle suchen
            $result = $rngSearch.FindNext($result)
        }while($result -ne $null -and $result.Address() -ne $f)
        
        # 2-dim Array erstellen und gefundene Wert dort hinterlegen
        $arrFound = New-Object 'object[,]' $found.Count,1  
        0..($found.count-1) | %{
            $arrFound[$_,0] = $found[$_]
        }
        # Array in Spalte schreiben
        $wsout.Cells.Item(2,$col).Resize($found.Count,1).Value() = $arrFound
    }
    $col++
}

$wbout.SaveAs($savepath)
$wbout.Close($true)
#$objExcel.DisplayAlerts = $true
# Dokument schließen
$wb.Close($false)
# Excel schließen
$objExcel.Quit()
# Ressourcen freigeben
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($objExcel)

Viel Spaß damit Mister Schlangenbiss face-wink.

Weitere Anpassungen gibt's von mir nur gegen Cash.

Gruß jodel32
Snakebite2004
Snakebite2004 09.03.2016 um 10:21:11 Uhr
Goto Top
Vielen Dank! Das hilft mir sehr viel weiter!