Wie Öffnen; Speichern als; Schließen Sie anschließend eine Excel 2013-Arbeitsmappe (für Makros aktiviert) in PowerShell4

Wenn Sie nach den oben genannten Com-Operationen suchen, erhalten Sie Links aus dem Jahr '09 und noch früher. Vielleicht hat sich das nicht geändert, aber ich stoße auf Fehler, bei denen "es von einem anderen Prozess verwendet wird". - obwohl auf meinem Desktop keine Excel-App geöffnet ist. Ich muss neu starten, um fortzufahren.

Um es klar auszudrücken: Ich versuche, eine vorhandene Datei zu öffnen. sofortSaveAs() (so viel funktioniert), fügen Sie ein Blatt,Save(); Close() - und dann, was wichtig ist, wiederholen Sie diesen Zyklus. Tatsächlich erstelle ich ein paar Dutzend neuer Blätter in einer Schleife, die den oben genannten 'Open Master' ausführt.SaveAs(); Sachen bearbeiten; Sparen; Schließen;

In den Beispielen habe ich gesehen, dass dies kein typischer Workflow für PowerShell ist. Ganz unten ist mein vorläufiges Skript eingefügt - ziemlich rau und unvollständig, aber die Dinge öffnen sich, was sie zum Öffnen benötigen, und das Hinzufügen von Arbeitsblättern funktioniert auch - bis ich weiß, dass ich den richtigen Weg habe, um Dinge sauber zu schließen. Ich mache mir keine Sorgen um die Iterationen .

Ich habe ein paar Beispiele gefunden, die das Schließen der Adresse betreffen:

Von http://theolddogscriptingblog.wordpress.com/2012/06/07/get-rid-of-the-excel-com-object-once-and-for-all/

$x = New-Object -com Excel.Application
$x.Visible = $True
Start-Sleep 5
$x.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($x)
Remove-Variable x

Und von http://social.technet.microsoft.com/Forums/windowsserver/en-US/24e57b61-e792-40c1-8aff-b0a8205f48ab/updated-opened-excel-using-powershell?forum=winserverpowershell

Set-ItemProperty $path -name IsReadOnly -value $false
$Excel.ActiveWorkBook.Save()
$openfile.Close() 
$openfile = $null 
$Excel.Quit() 
$Excel = $null 
[GC]::Collect() 

<>

function MakeNewBook($theWeek, $AffID){
    $ExcelFile = "C:\csv\InvoiceTemplate.xlsm"
    $Excel = New-Object -Com Excel.Application
    $Excel.Visible = $True  
    $Workbook = $Excel.Workbooks.Open($ExcelFile)
    $theWeek = $theWeek  -replace "C:\\csv\\", ""
    $theWeek = $theWeek  -replace "\.csv", ""

    $theWeek = "c:\csv\Invoices\" +$AffID +"_" + $theWeek + ".xlsm"

    $SummaryWorksheet = $Workbook.worksheets.Item(1)

    $Workbook.SaveAs($theWeek)
    return $Excel
}

function MakeNewSheet($myBook, $ClassID){
    $SheetName = "w"+$ClassID
    #$Excel = New-Object -Com Excel.Application
    #$Excel.Visible = $True  
    $wSheet = $myBook.WorkSheets.Add()

}

function SaveSheet ($myExcel)
{
    #$WorkBook.EntireColumn.AutoFit()
    #Set-ItemProperty $path -name IsReadOnly -value $false
    $myExcel.ActiveWorkBook.Save()

    $openfile= $myExcel.ActiveWorkBook
    $openfile.Close() 
    $openfile = $null 
    $myExcel.Quit() 
    $myExcel = $null 
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($myExcel)
    Remove-Variable $myExcel
    [GC]::Collect() 

}

$theWeek = "C:\csv\wkStart2013-11-04.csv"
$x = Import-Csv $theWeek

foreach ($xLine in $x){
    if ($x[0]){
        $AffID = $x[1].idAffiliate
        $myExcel = MakeNewBook $theWeek  $x[1].idAffiliate

        $ClassID = $x[1].idClass
        MakeNewSheet $myExcel $ClassID
        continue
    }
    SaveSheet($myExcel)
    $AffID = $_.$AffID
    $wID = $xLine.idClass
    #MakeNewSheet($wID)
    Echo "$wID"

}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage