Benutzer-Werkzeuge

Webseiten-Werkzeuge


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

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki