skripte:excel_umstrukturierung
Excel-Umstrukturierung
Nutzen: Dieses Skript automatisiert die Umstrukturierung von „Kostenartensalden“-Dateien. Es findet eine spezifische „Lieferkunden“-Zeile, verschiebt sie und fügt einen neuen „Wiederverkäufer“-Block an der korrekten Position ein. Es ist darauf ausgelegt, eine stabile Methode zu verwenden, die Fehler in der Excel-Schnittstelle vermeidet.
Funktion:
Liest die Originaldatei einmal komplett in den Speicher ein.
Sucht die Positionen der „Lieferkunden“- und „gesamt“-Zeile direkt in den Daten.
Baut die neue CSV-Struktur Zeile für Zeile direkt im Arbeitsspeicher auf.
Schreibt das fertige Ergebnis aus dem Speicher in eine neue CSV-Datei mit korrekter Kodierung für alle Zeichen, inklusive Umlaute (UTF8BOM).
--- Skript-Konfiguration --- $sourcePath = (Get-Location).Path $filePattern = "* Kostenartensalden.xlsx" $lieferkundenValue = 100 $kontoGesamtTextPattern = "Konto8300gesamt" $newBlockValueA = "83001" $newBlockValueC = "Wiederverkäufer" --- Hauptverarbeitung --- Write-Host "Starte Excel-Prozess im Hintergrund..." -ForegroundColor Gray $excel = New-Object -ComObject Excel.Application $excel.Visible = $false $excel.DisplayAlerts = $false try { $files = Get-ChildItem -Path $sourcePath -Filter $filePattern -File if ($files.Count -eq 0) { Write-Host "Keine passenden Dateien gefunden." -ForegroundColor Yellow } foreach ($file in $files) { Write-Host "--- Verarbeite Datei: $($file.Name) ---" -ForegroundColor Cyan $workbook = $excel.Workbooks.Open($file.FullName, $true) $worksheet = $workbook.ActiveSheet $sourceData = $worksheet.UsedRange.Value2 $workbook.Close() Write-Host " > Originaldatei eingelesen und geschlossen." $continueProcessing = $true; $customerRowNumber = 0; $gesamtRowNumber = 0 for ($i = 1; $i -le $sourceData.GetUpperBound(0); $i++) { if ($null -ne $sourceData[$i, 2] -and $sourceData[$i, 2] -eq $lieferkundenValue) { $customerRowNumber = $i; break } } if ($customerRowNumber -eq 0) { Write-Host "[Fehler] Die 'Lieferkunden'-Zeile wurde nicht gefunden." -ForegroundColor Red; $continueProcessing = $false } else { Write-Host " > 'Lieferkunden'-Zeile in Zeile $customerRowNumber gefunden." } if ($continueProcessing) { for ($i = $customerRowNumber + 1; $i -le $sourceData.GetUpperBound(0); $i++) { $rowContent = "" if ($sourceData.Rank -gt 1) { for ($j = 1; $j -le $sourceData.GetUpperBound(1); $j++) { $rowContent += $sourceData[$i, $j] + " " } } else { $rowContent = $sourceData[$i] } if ($rowContent -like $kontoGesamtTextPattern) { $gesamtRowNumber = $i; break } } } if ($gesamtRowNumber -eq 0) { Write-Host "[Fehler] Die zugehörige '$kontoGesamtTextPattern'-Zeile wurde nicht gefunden." -ForegroundColor Red; $continueProcessing = $false } else { Write-Host " > Zugehörige 'gesamt'-Zeile in Zeile $gesamtRowNumber gefunden." } if ($continueProcessing) { Write-Host "[Schritt 2] Baue die neue CSV-Datei im Speicher auf..." $csvOutput = @() $customerRowValues = @() $numCols = $sourceData.GetUpperBound(1) for($j = 1; $j -le $numCols; $j++){ $customerRowValues += $sourceData[$customerRowNumber, $j] } for ($i = 1; $i -le $sourceData.GetUpperBound(0); $i++) { if ($i -eq $customerRowNumber) { continue } $currentRow = @() for ($j = 1; $j -le $numCols; $j++) { $currentRow += '"{0}"' -f ($sourceData[$i, $j] -replace '"', '""') } $csvOutput += $currentRow -join ";" if ($i -eq $gesamtRowNumber) { $newBlockRow = @(('"{0}"' -f $newBlockValueA), '""', ('"{0}"' -f $newBlockValueC)) $csvOutput += $newBlockRow -join ";" $customerCsvRow = @() foreach($val in $customerRowValues){ $customerCsvRow += '"{0}"' -f ($val -replace '"', '""') } $csvOutput += $customerCsvRow -join ";" } } Write-Host " > Aufbau der CSV-Daten erfolgreich." -ForegroundColor Green $baseName = ($file.BaseName -split ' ')[0] $newCsvName = "$($baseName)kost.csv" $csvPath = Join-Path -Path $sourcePath -ChildPath $newCsvName Write-Host "[Schritt 3] Schreibe CSV-Datei nach: $newCsvName" $csvOutput | Out-File -FilePath $csvPath -Encoding UTF8BOM Write-Host "Speichern erfolgreich." -ForegroundColor Green } else { Write-Host "Bearbeitung der Datei wird wegen fehlender Ankerpunkte abgebrochen." -ForegroundColor Red } } } catch { Write-Host "[FATALER FEHLER] Ein unerwarteter Fehler ist aufgetreten: (_.Exception.Message)" -ForegroundColor Red } finally { if ($excel) { $excel.Quit() [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null } Write-Host "========== Skript beendet ==========" } //Author: Stefan Agethen //Letzte Bearbeitung: 2025//
skripte/excel_umstrukturierung.txt · Zuletzt geändert: von Stefan Agethen
