none
"Range" aus Excel ermitteln RRS feed

  • Frage

  • Hallo zusammen, 

    ich habe sehr wenig Erfahrung mit PowerShell, möchte jedoch durch kleine "Projekte" mehr und mehr lernen. Zurzeit habe möchte ich aus einer Excel-Datei bestimmte Daten ermitteln. 

     Mein erstes Problem ist es, eine Range aus einer Zeile zu ermitteln. Ich habe eine Zeile mit verschiedenen Tagen. Ich möchte, dass das PS-Skript die Excel-Datei öffnet und guckt, In welcher Spalte das heutige Datum sowie das heutige Datum +13Tage ist, damit ich diese Info nutzen kann um den nötigen Inhalt zu erlangen.

    Ich will also, dass das Skript in Zeile 5 nach dem Datum sucht und mir z. B. C5:Q5 ausgibt. Kann mir da jemand helfen?

    Danke im Voraus

    LG Marchionni

    Mittwoch, 20. Januar 2016 23:40

Antworten

  • Hi,

    hab hier mal einen Ansatz für dich gebastelt, vielleicht hilft dir das schon mal weiter.

    $objExcel = New-Object -comobject Excel.Application  
    $objExcel.Visible = $True
    
    $objWorkbook = $objExcel.Workbooks.Open("C:\Test.xls")
    $objWorkSheet = $objWorkbook.Worksheets.Item(1)
    
    $objRange = $objWorksheet.UsedRange
    
    $now = Get-Date
    $next = $now.AddDays(13)
    
    $objTarget1 = $objRange.Find($now.ToShortDateString())
    $objTarget2 = $objRange.Find($next.ToShortDateString())
    
    if ($objTarget1 -ne $null)
    {
        Write-Host "Reihe: " $objTarget1.Row  
        Write-Host "Zeile: " $objTarget1.Column 
        Write-Host "Excel-Wert: " $objTarget1.AddressLocal($false,$false)
        
    }    
    
    if ($objTarget2 -ne $null)
    {
        Write-Host "Reihe: " $objTarget2.Row  
        Write-Host "Zeile: " $objTarget2.Column 
        Write-Host "Excel-Wert: " $objTarget2.AddressLocal($false,$false)
        
    }    
    
    $objWorkbook.Close()

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Donnerstag, 21. Januar 2016 08:27

Alle Antworten

  • Hi,

    hab hier mal einen Ansatz für dich gebastelt, vielleicht hilft dir das schon mal weiter.

    $objExcel = New-Object -comobject Excel.Application  
    $objExcel.Visible = $True
    
    $objWorkbook = $objExcel.Workbooks.Open("C:\Test.xls")
    $objWorkSheet = $objWorkbook.Worksheets.Item(1)
    
    $objRange = $objWorksheet.UsedRange
    
    $now = Get-Date
    $next = $now.AddDays(13)
    
    $objTarget1 = $objRange.Find($now.ToShortDateString())
    $objTarget2 = $objRange.Find($next.ToShortDateString())
    
    if ($objTarget1 -ne $null)
    {
        Write-Host "Reihe: " $objTarget1.Row  
        Write-Host "Zeile: " $objTarget1.Column 
        Write-Host "Excel-Wert: " $objTarget1.AddressLocal($false,$false)
        
    }    
    
    if ($objTarget2 -ne $null)
    {
        Write-Host "Reihe: " $objTarget2.Row  
        Write-Host "Zeile: " $objTarget2.Column 
        Write-Host "Excel-Wert: " $objTarget2.AddressLocal($false,$false)
        
    }    
    
    $objWorkbook.Close()

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Donnerstag, 21. Januar 2016 08:27
  • Hallo,

    ev. hilft dir dieser Beitrag aus dem Englischen Forum weiter:

    powershell-and-search-in-excel-file-get-a-row-values

    Lg

    Donnerstag, 21. Januar 2016 08:37
  • Hallo,

    es kommt darauf an, was du insgesamt machen möchtest, aber vielleicht ist der Hinweis sinnvoll. Wenn du nur die Daten auslesen möchtest, bietet es sich an, das Excel-Dokument durch das Skript als csv-Datei zu speichern und dann die csv-Datei mit Import-csv einzulesen. Dieses Verfahren ist deutlich performanter als die Excel-Schnittstelle.

    Viele Grüße

    Christoph

    Donnerstag, 21. Januar 2016 10:52
  • Schon mal danke für die hilfreichen Antworten.

    Ich habe mir tatsächlich überlegt ein teil der Excel-Datei in eine csv -Datei zu kopieren. Die Sache ist nämlich die, dass unser Dienstplan eine einfache Excel-Datei ist wo in der 3 Zeile das Datum 01.01.2016 - 31.12.2016 und da drunter stehen die einzelnen Mitarbeiter (jeweils 4 Zeilen pro Mitarbeiter) mit dem eingetragenen Dienst. Ich wollte mir jetzt ein Script machen, welches den Dienstplan öffnet (m)ein teil (den Montag der nächsten KW + 13 Tage) in eine CSV-Datei schreibt und evtl. auf Änderungen prüft und mich per E-Mail benachrichtigt. Es ist zwar ne Spielerei aber in meinem Fall doch nützlich :)

    Donnerstag, 21. Januar 2016 14:28
  • Ich lese auch recht viele Daten aus Excel-Tabellen aus und für mich hat sich das Vorgehen bewährt, die Excel-Datei überhaupt nicht zu bearbeiten, sondern gleich alles in csv zu speichern.

    Danach kann man die csv-Datei als Text (Get-Content) einlesen und dann mit "Select-Object -Skip ..." die oberen Zeilen entfernen, bis der eigentliche Tabellenkopf in der ersten Zeile steht. Wenn dein Tabellenkopf mehrspaltig ist, musst du ihn u.U. in eine Zeile zusammenschreiben.

    Danach kannst du alles über ConvertFrom-CSV in Objekte übersetzen und hast das übliche PowerShell-Instrumentarium zum filtern.

    Aber das kommt natürlich alles auf den Einzelfall an...

    Freitag, 22. Januar 2016 07:47