Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Werte aus Powershell-Script in erste freie Zeile kopieren.

Forumthread: Werte aus Powershell-Script in erste freie Zeile kopieren.

Werte aus Powershell-Script in erste freie Zeile kopieren.
17.10.2024 20:04:50
Yankee
Hallo,

ich habe ein Powershell-Script, welches mir Daten aus einer PDF ausliest und in bestimmte Zellen einer Excel-Datei einsetzt.
Im Moment geht es eben nur in ganz bestimmte Zellen der Excel-Datei.
Es wäre aber schön, wenn die Werte in die jeweils erste freie Zeile der Excel-Datei eingesetzt werden könnten.

Hier der bisherige Code:



# Variablen bitte anpassen ---------------------------
# Pfad zur PDF Datei
$sourcefile = "C:\data\quelle.pdf"
# Pfad zum Excel-Template
$templatefile = "c:\data\template.xlsx"
# ------------------------------------------------------
$ErrorActionPreference = 'Stop'

# Funktion zum Laden des iTextSharp Assemblies
function Load-iTextLibrary {
if($psscriptroot -ne ''){
$localpath = join-path $psscriptroot 'itextsharp.dll'
}else{
$localpath = join-path $env:TEMP 'itextsharp.dll'
}
$zip = $null;$tmp = ''
try{
if(!(Test-Path $localpath)){
Add-Type -A System.IO.Compression.FileSystem
$tmp = "$env:TEMP\$([IO.Path]::GetRandomFileName())"
write-host "Downloading and extracting required 'iTextSharp.dll' ... " -F Green -NoNewline

(New-Object System.Net.WebClient).DownloadFile('https://www.nuget.org/api/v2/package/iTextSharp/5.5.13.1', $tmp)
$zip = [System.IO.Compression.ZipFile]::OpenRead($tmp)
$zip.Entries | ?{$_.Fullname -eq 'lib/itextsharp.dll'} | %{
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($_,$localpath)
}
write-host "OK" -F Green
}
if (Get-Item $localpath -Stream zone.identifier -ea SilentlyContinue){
Unblock-File -Path $localpath
}
Add-Type -Path $localpath
}catch{
throw "Error: $($_.Exception.Message)"
}finally{
if ($zip){$zip.Dispose()}
if ($tmp -ne ''){del $tmp -Force -EA SilentlyContinue}
}
}
# iText Library laden
Load-iTextLibrary

# auch geschütze PDFs öffnen aktivieren
[iTextSharp.text.pdf.PdfReader]::unethicalreading = $true

$reader = $null; $xl = $null
try {
# Excel Object erstellen
$xl = New-Object -Com Excel.Application -P @{Visible = $false}
# workbook öffnen
$wb = $xl.Workbooks.Open($templatefile)
# wir arbeiten auf dem ersten Arbeitsblatt
$ws = $wb.Sheets.Item(1)
write-host "Exportiere Daten aus '$($sourcefile)' ... " -F Green -NoNewline
# PDF Reader Object erstellen
$reader = New-Object iTextSharp.text.pdf.PdfReader $sourcefile
# Gesamtergebnisse aus dem PDF in die entsprechenden Felder der Exceldatei übertragen
$ws.Range("E7").Value = $reader.AcroFields.GetField("GESAMT")
$ws.Range("I4").Value = $reader.AcroFields.GetField("GESAMT_2")
$ws.Range("B10").Value = $reader.AcroFields.GetField("GESAMT_3")
$ws.Range("K7").Value = $reader.AcroFields.GetField("GESAMT_4")
# Arbeitsmappe speichern und schließen
$wb.Save();$wb.Close($true)
# reader schließen und ressourcen freigeben
$reader.Close(); $reader.Dispose()
}catch{
write-host $_.Exception.Message -F Red
}finally{
# cleanup
if($reader){$reader.Dispose()}
# Excel schließen
$xl.Quit()
# release com resources
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($xl)
}


Bisher habe ich nur diesen Code-Schnipsel gefunden, mit dem ich mein vorhandenes Powershell-Script entsprechend erweitern könnte. Allerdings bekomme ich es irgendwie nicht hin.

$worksheet.usedrange.rows.count + 1


Kann ich den o.g. Code dafür verwenden - oder habt Ihr vielleicht eine andere Idee?

Grüße,
Yank
Anzeige

23
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
17.10.2024 21:28:16
ralf_b
nur so auf verdacht. Du erkennst was hier anders ist? Dir ist klar das man einen Text wie "I4" auch so schreiben kann "I" + 4 ?

    

$ws = $wb.Sheets.Item(1)
$rng= $ws.usedrange.rows.count +1
write-host "Exportiere Daten aus '$($sourcefile)' ... " -F Green -NoNewline
# PDF Reader Object erstellen
$reader = New-Object iTextSharp.text.pdf.PdfReader $sourcefile
# Gesamtergebnisse aus dem PDF in die entsprechenden Felder der Exceldatei übertragen
$ws.Range("A"+ $rng).Value = $reader.AcroFields.GetField("GESAMT")
$ws.Range("I4").Value = $reader.AcroFields.GetField("GESAMT_2")
$ws.Range("B10").Value = $reader.AcroFields.GetField("GESAMT_3")
Anzeige
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
18.10.2024 08:48:26
Yankee
Hallo Ralf,

auch Dir danke für Deine Ergänzung.

Auch hier habe ich noch eine Verständnisfrage.

Du hast den Code ja in zwei Zeilen wie folgt angepaßt:

1)
$rng= $ws.usedrange.rows.count +1


2)
$ws.Range("A"+ $rng).Value = $reader.AcroFields.GetField("GESAMT") 


Bedeutet bei Pkt. 2 der Zusatz "+ $rng" nun, dass der entsprechende Wert (hier "GESAMT") automatisch die nächste freie Zeile der Spalte "A" eingefügt wird?
Genau so sollte es ja sein. Dann müßte ich das für die Werte "GESAMT_2" bis "GESAMT_4" dann genauso machen... also z.B. "I + $rng"... richtig?
Und die Codezeile (Pkt. 1) wäre dann dazu da, um grds. Powershell zu sagen, dass Werte immer in die erste freie Zeile unten angehangen werden sollen?

Grüße,
Yank
Anzeige
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
18.10.2024 10:00:14
Yankee
Hallo Ralf,

nochmal eine Ergänzung.
Habe es eben mal einfach so probiert.
Wie auch schon an Ulf geschrieben, ist ab der 4. Zeile alles frei. In der 3. Zeile sind all die gewünschten Einträge vorhanden.

Wenn ich nun das PS-Script ausführe, passiert auch hier nichts...

Mache ich vielleicht auch bei Deiner Lösung etwas falsch?

Hier meine beiden Code-Teile:

1)
$rng= $ws.usedrange.rows.count +1


2)
    # festen Text aus diesem Script übertragen (Zeilen 1 - 4)

$ws.Range("B3" + $rng).Value = "Sonstiges"
$ws.Range("C3" + $rng).Value = "WBS"
$ws.Range("E3" + $rng).Value = "2024"
$ws.Range("G3" + $rng).Value = "WBS (Projekt)"

# Gesamtergebnisse aus dem PDF in die entsprechenden Felder der Exceldatei übertragen
$ws.Range("D3" + $rng).Value = $reader.AcroFields.GetField("Name")
$ws.Range("S3" + $rng).Value = $reader.AcroFields.GetField("GESAMT")
$ws.Range("I3" + $rng).Value = $reader.AcroFields.GetField("GESAMT_2")
$ws.Range("AC3" + $rng).Value = $reader.AcroFields.GetField("GESAMT_3")
$ws.Range("Y3" + $rng).Value = $reader.AcroFields.GetField("GESAMT_4")


Grüße,
Yank
Anzeige
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
18.10.2024 16:41:38
ralf_b
ich habe davon keinen Plan, der Lösungsansatz war von den übrigen Objektverweisen abgeleitet. Vorrausgesetzt deine usedrange objektreferenz funktioniert auch im Powershell ,dann sollte das gehen. Ich hab aber die Beiträge des Kollegen noch nicht gesehen. Evtl hat es sich ja schon erledigt.
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
17.10.2024 22:08:39
Ulf
Hi
~



# Variablen bitte anpassen ---------------------------
# Pfad zur PDF Datei
$sourcefile = "C:\data\quelle.pdf"
# Pfad zum Excel-Template
$templatefile = "c:\data\template.xlsx"
# ------------------------------------------------------
$ErrorActionPreference = 'Stop'

# Funktion zum Laden des iTextSharp Assemblies
function Load-iTextLibrary {
if($psscriptroot -ne ''){
$localpath = join-path $psscriptroot 'itextsharp.dll'
}else{
$localpath = join-path $env:TEMP 'itextsharp.dll'
}
$zip = $null;$tmp = ''
try{
if(!(Test-Path $localpath)){
Add-Type -A System.IO.Compression.FileSystem
$tmp = "$env:TEMP\$([IO.Path]::GetRandomFileName())"
write-host "Downloading and extracting required 'iTextSharp.dll' ... " -F Green -NoNewline

(New-Object System.Net.WebClient).DownloadFile('https://www.nuget.org/api/v2/package/iTextSharp/5.5.13.1', $tmp)
$zip = [System.IO.Compression.ZipFile]::OpenRead($tmp)
$zip.Entries | ?{$_.Fullname -eq 'lib/itextsharp.dll'} | %{
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($_,$localpath)
}
write-host "OK" -F Green
}
if (Get-Item $localpath -Stream zone.identifier -ea SilentlyContinue){
Unblock-File -Path $localpath
}
Add-Type -Path $localpath
}catch{
throw "Error: $($_.Exception.Message)"
}finally{
if ($zip){$zip.Dispose()}
if ($tmp -ne ''){del $tmp -Force -EA SilentlyContinue}
}
}
# iText Library laden
Load-iTextLibrary

# auch geschütze PDFs öffnen aktivieren
[iTextSharp.text.pdf.PdfReader]::unethicalreading = $true

$reader = $null; $xl = $null; $lRow=0
try {
# Excel Object erstellen
$xl = New-Object -Com Excel.Application -P @{Visible = $false}
# workbook öffnen
$wb = $xl.Workbooks.Open($templatefile)
# wir arbeiten auf dem ersten Arbeitsblatt
$ws = $wb.Sheets.Item(1)
$lRow = $ws.UsedRange.Rows.Count + 1
write-host "Exportiere Daten aus '$($sourcefile)' ... " -F Green -NoNewline
# PDF Reader Object erstellen
$reader = New-Object iTextSharp.text.pdf.PdfReader $sourcefile
# Gesamtergebnisse aus dem PDF in die entsprechenden Felder der Exceldatei übertragen
# Mit Zellkoordinaten
$ws.Cells($lRow,1).Value = $reader.AcroFields.GetField("GESAMT")
$ws.Cells($lRow,2).Value = $reader.AcroFields.GetField("GESAMT_2")
$ws.Cells($lRow,3).Value = $reader.AcroFields.GetField("GESAMT_3")
$ws.Cells($lRow,4).Value = $reader.AcroFields.GetField("GESAMT_4")
# Arbeitsmappe speichern und schließen
$wb.Save();$wb.Close($true)
# reader schließen und ressourcen freigeben
$reader.Close(); $reader.Dispose()
}catch{
write-host $_.Exception.Message -F Red
}finally{
# cleanup
if($reader){$reader.Dispose()}
# Excel schließen
$xl.Quit()
# release com resources
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($xl)
}

hth
Ulf
Anzeige
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
18.10.2024 08:38:23
Yankee
Hallo Ulf,

zunächst mal vielen Dank für Deine Ergänzung.
Ich habe nur noch eine Frage dazu...

Im Bereich "Mit Zellkoordinaten" stehen ja jetzt die Einträge



$ws.Cells($lRow,1).Value = $reader.AcroFields.GetField("GESAMT")
$ws.Cells($lRow,2).Value = $reader.AcroFields.GetField("GESAMT_2")
$ws.Cells($lRow,3).Value = $reader.AcroFields.GetField("GESAMT_3")
$ws.Cells($lRow,4).Value = $reader.AcroFields.GetField("GESAMT_4")


Nun ist es ja so, dass die Ergebnisse nicht nur in die nächste freie Zeile eingetragen werden sollen, sondern dort auch in vorgegebene Spalten, wie es in meinem vorherigen Code ja angegeben war.

Dabei soll das Ergebnis "GESAMT" in die erste freie Zeile der Spalte "S"
Dabei soll das Ergebnis "GESAMT_2" in die erste freie Zeile der Spalte "I"
Dabei soll das Ergebnis "GESAMT_3" in die erste freie Zeile der Spalte "AC"
Dabei soll das Ergebnis "GESAMT_4" in die erste freie Zeile der Spalte "Y"

Es sind also jeweils mehrere Spalten dazwischen, in die kein Wert eingetragen wird.

Habe ich in dem Code etwas übersehen oder es einfach nur nicht richtig verstanden? ;-)

Viele Grüße,
Yank
Anzeige
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
18.10.2024 08:57:32
Ulf
Hi,
hier müsstest du die Spalten wie in Z1S1-Schreibweise addressieren:
S=>19


$ws.Cells($lRow,19).Value = $reader.AcroFields.GetField("GESAMT")

usw...
hth
Ulf
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
18.10.2024 09:41:19
Yankee
Hallo Ulf,

danke für die weitere Erläuterung.
Ich habe das jetzt genauso umgesetzt, aber wenn ich das PS-Script ausführe, passiert überhaupt nichts.
In meiner Testdatei ist die Zeile 3 ausgefüllt und ab Zeile 4 ist alles leer.

Hier mal der Code, den ich eben genutzt habe:

    # festen Text aus diesem Script übertragen (Zeilen 1 - 4)

$ws.Cells($lRow,2).Value = "Sonstiges"
$ws.Cells($lRow,3).Value = "WBS"
$ws.Cells($lRow,5).Value = "2024"
$ws.Cells($lRow,7).Value = "WBS (Projekt)"

# Mit Zellkoordinaten
$ws.Cells($lRow,4).Value = $reader.AcroFields.GetField("Name")
$ws.Cells($lRow,19).Value = $reader.AcroFields.GetField("GESAMT")
$ws.Cells($lRow,9).Value = $reader.AcroFields.GetField("GESAMT_2")
$ws.Cells($lRow,29).Value = $reader.AcroFields.GetField("GESAMT_3")
$ws.Cells($lRow,25).Value = $reader.AcroFields.GetField("GESAMT_4")


Eigentlich sollte es so doch funktionieren...

Und weiter oben habe ich ebenfalls Deinen Code eingetragen:

    $lRow = $ws.UsedRange.Rows.Count + 1


Vorher, als ich feste Zellen angegeben hatte, hat es funktioniert. Da wurden alle Werte eingetragen - auch die aus dem Script selbst (Sonstiges... etc.).
Was mache ich falsch?

Grüße,
Yank
Anzeige
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
18.10.2024 10:09:36
Ulf
Hi
hab einen Test mit fixen Daten durchlaufen lassen und das Ergebnis ist OK. Es werden neue Zeilen angelegt bei Aufruf.
Mögliche Fehlerquellen könnten ein fehlendes Komma sein, oder die fehlende Deklaration von $lRow.
Bitte prüfe mal


# Variablen bitte anpassen ---------------------------
# Pfad zur PDF Datei
# Pfad zum Excel-Template
$templatefile = "c:\users\xx\documents\template.xlsx"
# ------------------------------------------------------
$ErrorActionPreference = 'Stop'

# auch geschütze PDFs öffnen aktivieren
# DIESE ZEILE SO ÜBERNEHMEN
$reader = $null; $xl = $null; $lRow=0
try {
# Excel Object erstellen
$xl = New-Object -Com Excel.Application -P @{Visible = $false}
# workbook öffnen
$wb = $xl.Workbooks.Open($templatefile)
# wir arbeiten auf dem ersten Arbeitsblatt
$ws = $wb.Sheets.Item(1)
$lRow = $ws.UsedRange.Rows.Count + 1
# Gesamtergebnisse aus dem PDF in die entsprechenden Felder der Exceldatei übertragen
# Mit Zellkoordinaten
# KOMMA VOR SPALTE
$ws.Cells($lRow, 1).Value = "1"
$ws.Cells($lRow, 2).Value = "2"
$ws.Cells($lRow, 3).Value = "3"
$ws.Cells($lRow, 4).Value = "4"
# Arbeitsmappe speichern und schließen
$wb.Save();$wb.Close($true)
# reader schließen und ressourcen freigeben
}catch{

}finally{
# cleanup
# Excel schließen
$xl.Quit()
# release com resources
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($xl)
}

hth
Ulf
Anzeige
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
18.10.2024 10:49:04
Yankee
Vielen Dank Ulf für Deine weitere Mühe.

Ich verstehe nicht, wieso es nicht funktioniert.
In einer Zeile hatte ich nochmal etwas hinzufügen müssen... und zwar hier:

$reader = $null; $xl = $null; $lRow=0


Da hatte ich den Teil hinter dem letzten Semikolon vergessen. Nun steht er aber drin und auch die Kommas waren gesetzt. Habe da jetzt auch zusätzlich noch ein Leerzeichen eingefügt, wie Du es in Deiner letzten Antwort auch gemacht hattest.

Es funktioniert noch immer nicht. Es werden keine Werte übertragen.

Hier mal der komplette aktuelle Code:

# Variablen bitte anpassen ---------------------------

# Pfad zur PDF Datei
$sourcefile = "C:\Users\Name\Desktop\w.pdf"
# Pfad zum Excel-Template
$templatefile = "C:\Users\Name\Desktop\TEST Excel.xlsx"
# ------------------------------------------------------
$ErrorActionPreference = 'Stop'

# Funktion zum Laden des iTextSharp Assemblies
function Load-iTextLibrary {
if($psscriptroot -ne ''){
$localpath = join-path $psscriptroot 'itextsharp.dll'
}else{
$localpath = join-path $env:TEMP 'itextsharp.dll'
}
$zip = $null;$tmp = ''
try{
if(!(Test-Path $localpath)){
Add-Type -A System.IO.Compression.FileSystem
$tmp = "$env:TEMP\$([IO.Path]::GetRandomFileName())"
write-host "Downloading and extracting required 'iTextSharp.dll' ... " -F Green -NoNewline

(New-Object System.Net.WebClient).DownloadFile('https://www.nuget.org/api/v2/package/iTextSharp/5.5.13.1', $tmp)
$zip = [System.IO.Compression.ZipFile]::OpenRead($tmp)
$zip.Entries | ?{$_.Fullname -eq 'lib/itextsharp.dll'} | %{
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($_,$localpath)
}
write-host "OK" -F Green
}
if (Get-Item $localpath -Stream zone.identifier -ea SilentlyContinue){
Unblock-File -Path $localpath
}
Add-Type -Path $localpath
}catch{
throw "Error: $($_.Exception.Message)"
}finally{
if ($zip){$zip.Dispose()}
if ($tmp -ne ''){del $tmp -Force -EA SilentlyContinue}
}
}
# iText Library laden
Load-iTextLibrary

# auch geschütze PDFs öffnen aktivieren
[iTextSharp.text.pdf.PdfReader]::unethicalreading = $true

$reader = $null; $xl = $null; $lRow=0
try {
# Excel Object erstellen
$xl = New-Object -Com Excel.Application -P @{Visible = $false}
# workbook öffnen
$wb = $xl.Workbooks.Open($templatefile)

# wir arbeiten auf dem siebten Arbeitsblatt --> später ändern auf (7)
$ws = $wb.Sheets.Item(1)

# Angabe, dass die Werte in die jeweils erste freie Zeile eingetragen werden sollen
$lRow = $ws.UsedRange.Rows.Count + 1

write-host "Exportiere Daten aus '$($sourcefile)' ... " -F Green -NoNewline

# PDF Reader Object erstellen
$reader = New-Object iTextSharp.text.pdf.PdfReader $sourcefile

# festen Text aus diesem Script übertragen (Zeilen 1 - 4)
$ws.Cells($lRow, 2).Value = "Sonstiges"
$ws.Cells($lRow, 3).Value = "WBS"
$ws.Cells($lRow, 5).Value = "2024"
$ws.Cells($lRow, 7).Value = "WBS (Projekt)"

# Mit Zellkoordinaten
$ws.Cells($lRow, 4).Value = $reader.AcroFields.GetField("Name")
$ws.Cells($lRow, 19).Value = $reader.AcroFields.GetField("GESAMT")
$ws.Cells($lRow, 9).Value = $reader.AcroFields.GetField("GESAMT_2")
$ws.Cells($lRow, 29).Value = $reader.AcroFields.GetField("GESAMT_3")
$ws.Cells($lRow, 25).Value = $reader.AcroFields.GetField("GESAMT_4")

# Arbeitsmappe speichern und schließen
$wb.Save();$wb.Close($true)
# reader schließen und ressourcen freigeben
$reader.Close(); $reader.Dispose()
}catch{
write-host $_.Exception.Message -F Red
}finally{
# cleanup
if($reader){$reader.Dispose()}
# Excel schließen
$xl.Quit()
# release com resources
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($xl)
}


Habe mir den Code jetzt zig-fach durchgelesen, aber ich kann keinen Fehler finden :-(

Grüße,
Yank
Anzeige
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
18.10.2024 12:19:14
Ulf
Hi,
sollte an den Berechtigungen liegen. Ich entdecke auch keinen Fehler. Als Workaround: Powershell als Administrator starten und den Text des Skriptes einfügen->RETURN
hth
Ulf
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
18.10.2024 13:29:16
Yankee
Hallo Ulf,

danke für den weiteren Tipp, den ich soeben getestet habe.

Das lief zwar durch und unten stand auch die Meldung in grün, dass Daten aus der PDF übertragen wurden...
Aber in der Excel-Datei kam nichts an.

Du hattest ja geschrieben:

"Powershell als Administrator starten und den Text des Skriptes einfügen->RETURN"

Ich habe eben gesehen, dass es auf meinem Rechner mehrere Windows Powershell Einträge gibt. Vielleicht liegt da auch das Problem. Ich habe es jedoch mit allen Einträgen versucht, wobei dieser Eintrag mit (86) sich seltsam verhielt und offenbar schon grds. nicht funktionierte.

Hier habe ich mal einen Screenshot hochgeladen in dieses Forum:

Userbild

Merkwürdig ist ja noch immer, dass mein vorheriger Code (siehe weiter unten) einwandfrei funktioniert hatte, wo ich feste Zellen angegeben hatte, in die die Werte aus der PDF-Datei eingesetzt werden sollen (D3, S3, I3, AC3, Y3).

Der vorherige Code:

# Gesamtergebnisse aus dem PDF in die entsprechenden Felder der Exceldatei übertragen

# $ws.Range("D3").Value = $reader.AcroFields.GetField("Name")
# $ws.Range("S3").Value = $reader.AcroFields.GetField("GESAMT")
# $ws.Range("I3").Value = $reader.AcroFields.GetField("GESAMT_2")
# $ws.Range("AC3").Value = $reader.AcroFields.GetField("GESAMT_3")
# $ws.Range("Y3").Value = $reader.AcroFields.GetField("GESAMT_4")


...noch ne Idee? ;-)

Grüße,
Yank
Anzeige
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
18.10.2024 13:45:37
Yankee
Hallo Ulf,

sorry, nochmal kurz...

Ich habe eben einfach mal eine NEUE Excel-Testdatei angelegt, in der ich einfach 2 Zeilen manuell ausgefüllt habe.
Dann habe ich den Namen der Excel-Datei im PS-Script entsprechend angepaßt und sie dann ausgeführt... und siehe da... die Werte aus der PDF wurden korrekt übertragen und auch in die korrekten Spalten.

Jetzt bin ich natürlich etwas verwirrt, denn ich verstehe nicht, wieso es in der bisherigen Testdatei nicht funktionierte.
Eben habe ich auch mal Formatierungen in der Problem-Excel-Datei entfernt und verbundene Zellen etc. Aber auch das funktioniert nicht.
Ich werde es als nächstes mal mit der Original Datei versuchen...

Aber hast Du dazu noch eine Idee?

Grüße,
Yank
Anzeige
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
18.10.2024 14:01:09
Yankee
Nochmal SORRY :-)

Leider kann man hier keine Beiträge löschen...

Es hat jetzt grds. sogar mit der ORIGINAL Excel-Datei funktioniert. Die Werte wurden korrekt übernommen!!
Nur ist es offenbar so, dass das PS-Script auch Formeln, die in Zellen stehen, als Einträge wertet und dann die Werte in die erste Zeile einsetzt, in der keine Formeln mehr stehen.

Ich habe mir jetzt beholfen, indem ich einfach die Formeln gelöscht habe. Dann funktioniert es.
Vielleicht teste ich noch mal, ob es was bringt, wenn ich die Formeln ausblende (obwohl ich das nicht glaube, denn das PS-Script schaut ja wohl nach dem Inhalt und nicht danach, ob man den Inhalt auch sieht...).

Notfalls müßte man dann halt immer mal wieder die Excel-Datei öffnen und die Formeln "weiter nach unten ziehen" (mit der Maus). Aber vielleicht geht´s ja auch besser.

Und eine letzte Frage wäre da noch:
Man kann in einem PS-Script ja auch eine Message-Box einsetzen, also sowas:

MsgBox "Bitte ID eingeben"


Was müßte ich tun, damit eine solche Message-Box erscheint, in der ich eine Eingabe machen muss (hier ID-Nummer), die dann ebenfalls in die Excel-Liste in die gleiche Zelle eingetragen wird, wo die anderen Werte auch hin sollen?

Danke Dir schon mal und wünsche Dir schon mal ein schönes Wochenende...

Grüße,
Yank
Anzeige
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
18.10.2024 21:15:14
Ulf
Hi,
am einfachsten und ohne anderes .NET-Gedöns:


$eingabe=""
$eingabe = Read-Host 'Bitte WASGEWÜNSCHTWIRD hier eingeben:' -AsSecureString

hth
Ulf
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
21.10.2024 08:59:09
Yankee
Hallo Ulf,

hoffe Du hattest ein schönes WE ;-)
Danke für den Code für die Eingabe der ID.

Leider hat das noch nicht funktioniert. Aber vielleicht habe ich den Code ja auch an der falschen Stelle eingesetzt.

Daher hier mal ein Code-Ausschnitt:
* siehe ziemlich unten bei "Eingabe der Antragsnummer abfragen..." *

# PDF Reader Object erstellen

$reader = New-Object iTextSharp.text.pdf.PdfReader $sourcefile

# festen Text aus diesem Script übertragen (Zeilen 1 - 4)
$ws.Cells($lRow, 2).Value = "Sonstiges"
$ws.Cells($lRow, 3).Value = "WBs"
$ws.Cells($lRow, 5).Value = "2024"
$ws.Cells($lRow, 7).Value = "WBs (Projekt)"

# Mit Zellkoordinaten
$ws.Cells($lRow, 4).Value = $reader.AcroFields.GetField("Name")
$ws.Cells($lRow, 19).Value = $reader.AcroFields.GetField("GESAMT")
$ws.Cells($lRow, 9).Value = $reader.AcroFields.GetField("GESAMT_2")
$ws.Cells($lRow, 29).Value = $reader.AcroFields.GetField("GESAMT_3")
$ws.Cells($lRow, 25).Value = $reader.AcroFields.GetField("GESAMT_4")

# Eingabe der ID-Nummer abfragen und diese in das Excel-Dokument eintragen (Spalte A)
$eingabe=""
$eingabe = Read-Host 'Bitte ID-nummer hier eingeben:' -AsSecureString

# Arbeitsmappe speichern und schließen
$wb.Save();$wb.Close($true)


Dabei öffnet sich zunächst das PS-Fenster, dann erscheint zunächst der rote Code, dann am Ende der grüne Code und kurz darauf wird die ID abgefragt.
Die ID sieht man dann nicht, da dort Sternchen angezeigt werden (quasi wie bei Eingabe eines Kennwortes). Das kommt wohl durch den Zusatz "AsSecureString".
Danach passierte nichts mehr und daher habe ich dann ENTER gedrückt. Dann schloss sich das Fenster.
Aber als ich die Excel-Datei öffnete, war Spalte A leer.
Ich habe im Code aber auch keine Angabe der Spalte A gefunden. Sicher hängt es auch damit zusammen... oder ich habe was nicht verstanden :-)

Kannst Du hier nochmal weiterhelfen?

Ansonsten ist das Ganze so gut gelöst, wobei es jedoch ideal wäre, wenn es vielleicht doch zunächst ein Message-Fenster gäbe, in das man die ID (gerne sichtbar) eintragen kann. Und wenn man das Fenster dann schließt, läuft der Rest des Programms erst weiter.
Bei der jetzigen Lösung wird die ID halt innerhalb dieses Fensters abgefragt und die Abfrage ist nicht so gut sichtbar.

Schöne Grüße,
Yank
Anzeige
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
21.10.2024 09:21:44
Yankee
Hallo Ulf,

sorry... mein Fehler :-)

Ich hatte im Code natürlich noch die wichtigste Angabe vergessen.
Habe es jetzt wie folgt ergänzt und das funktionierte:

$eingabe=""

$eingabe = Read-Host 'Bitte ID-nummer hier eingeben:'
$ws.Cells($lRow, 1).Value = $eingabe


Ich habe auch den Zusatz "-AsSecureString" dabei weggelassen, damit man die Eingabe auch sieht.

Ich denke, so geht es auch.
Messagebox am Anfang wäre natürlich noch besser gewesen, aber das ist vielleicht auch nicht ganz so wichtig.

Hast Du vielleicht noch eine Idee bezüglich der Formeln?
Gibt es eine Möglichkeit, in Zeilen befindliche Formeln zu ignorieren, damit die Einträge auch in Zeilen eingetragen werden, in denen schon Formeln stehen?
Ggf. könnte man dazu ja auch den Code so ändern, dass man sagt... suche die nächste freie Zelle in Spalte A, statt suche die nächste freie Zeile. Denn in Spalte A muss immer etwas stehen, aber dort wird nie eine Formel stehen.

Schöne Grüße,
imebro
Anzeige
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
21.10.2024 09:27:45
Yankee
...Zusatz:

Bisher steht in meinem Code ja die folgende Zeile:

$lRow = $ws.UsedRange.Rows.Count + 1


Das könnte man ja ggf. so abändern, dass es sich auf die erste freie Zelle in Spalte A bezieht. Aber natürlich muss es dann so sein, dass dennoch auch die im Code vorgegebenen Zellen der anderen Spalten ausgefüllt werden in der gleichen Zeile. Falls das geht, könnten die Formeln ja stehen bleiben.

Es sei denn, die Formeln würden eh vom Code überschrieben. Dann wäre die Änderung natürlich unsinnig ;-)

Grüße,
Yank
Anzeige
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
21.10.2024 10:02:02
Ulf
Hi,
davon ausgehend, dass es unbekannt viele belegte Zellen im Bereich ab Spalte B gibt, suchen wir die letzte, d.h. erste blanke Zelle der ersten Spalte ?
~
$lRow = rg.Columns(1).SpecialCells(4).Cells(1).Row

hth
Ulf
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
21.10.2024 10:28:40
Yankee
Hallo Ulf,

danke für die weitere Hilfe.

Ich hatte nun den Code wie folgt ersetzt:

# $lRow = $ws.UsedRange.Rows.Count + 1

$lRow = rg.Columns(1).SpecialCells(4).Cells(1).Row


Beim Ausführen der PS-Datei geschah jedoch dann nichts. Auch die ID-Nummer wurde nicht mehr abgefragt.

Vielleicht ist das aber jetzt auch zu aufwendig und nicht wirklich nötig.
Ich würde es dann so lassen, wie bisher und eben einfach alle Formeln in den Zeilen löschen, in denen noch keine Werte stehen.
So hat es ja funktioniert.

Interessanter wäre eher nochmal die Anpassung der Eingabe der ID-Nummer.
Wäre es aufwendig, das so anzupassen, dass ich zuerst ein kleines Fenster erhalte, in dem steht "Hier bitte die ID-Nummer eingeben - dann Enter-Taste drücken", worin ich dann die entspr. Nummer (sichtbar) eintragen kann und dann (nach Klick auf ENTER) läuft erst der Rest des Programms ab, wo die Werte aus der PDF nach Excel übertragen werden. Die ID-Nummer soll dann (wie ja jetzt auch schon) in Spalte A eingetragen werden.

Grüße,
Yank
Anzeige
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
21.10.2024 11:34:18
Ulf
Hi,
sry rg steht für Range; in deinem Fall:

# $lRow = $ws.UsedRange.Rows.Count + 1
# $lRow = rg.Columns(1).SpecialCells(4).Cells(1).Row

$lRow = $ws.UsedRange.Columns(1).SpecialCells(4).Cells(1).Row


hth
Ulf
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
21.10.2024 11:49:37
Yankee
Hallo Ulf,

auch das hat nicht funktioniert. Es lief zwar diesmal komplett durch und ich konnte auch die ID-Nummer angeben. Aber am Ende wurden keine Werte in die Excel-Datei übertragen.

Aber - wie schon geschrieben - diese Änderung ist auch nicht ganz so wichtig.
Vielleicht geht das mit der Messagebox ja noch ein bisschen besser, so wie in meinem vorherigen Post beschrieben.

Hast Du da noch eine Idee?

Grüße,
Yank
Anzeige
AW: Werte aus Powershell-Script in erste freie Zeile kopieren.
22.10.2024 08:59:55
Yankee
Hallo Ulf,

das Script ist nun gut so... auch mit dem jetzigen Eingabefenster.
Ich habe dort nochmal zwei Zeilensprünge eingegeben durch die Angabe "`n`n", wie Du hier sehen kannst:

$eingabe = Read-Host `n`n 'Bitte ID-Nummer eingeben - dann ENTER drücken '


Ich starte die .ps1-Datei mit einer Batch-Datei, damit man sie per Doppelklick starten kann. Das funktioniert auch sehr gut.

Leider habe ich im .ps1-Script noch keinen Weg gefunden, die Angabe bei "$Sourcefile" so zu machen, dass automatisch der Pfad im Profil des gerade angemeldeten Users geöffnet wird. Die Angabe %USERPROFILE% hat dabei nicht funktioniert.

Hier mal der Code-Ausschnitt:

$sourcefile = "\\DASFILE2\Daten\ARCHIV\AidA\scans\max-müller\w.pdf"


Hast Du da noch ne Idee?

Grüße,
Yank
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige