2015-12-01 42 views
0

好吧,我有6個CSV,每個包含一列。對於此示例,來自第一個CSV的數據用於創建初始文檔,然後每個數據都試圖保存到文檔中。PowerShell錯誤創建XLSX

#ID 

    $csvFile = "$path\ID.csv" 
    $fpath = $Filename 
$processes = Import-Csv -Path $csvFile 
$Excel = New-Object -ComObject excel.application 
$Excel.visible = $false 
$workbook = $Excel.workbooks.add() 
$excel.cells.item(1,1) = "ID" 
$i = 2 
foreach($process in $processes) 
{ 
$excel.cells.item($i,1) = $process.ID 
$i++ 
} #end foreach process 
$workbook.saveas($fpath) 
$Excel.Quit() 
Remove-Variable -Name excel 
[gc]::collect() 
[gc]::WaitForPendingFinalizers() 

#SRP 

    $csvFile = "$path\SRP.csv" 

$processes = Import-Csv -Path $csvFile 
$Excel = New-Object -ComObject excel.application 
$Excel.visible = $false 
$workbook = $Excel.workbooks.add() 
$excel.cells.item(1,2) = "SRP" 
$i = 2 
foreach($process in $processes) 
{ 
$excel.cells.item($i,2) = $process.SRP 
$i++ 
} #end foreach process 
$workbook.save($fpath) 
$Excel.Quit() 
Remove-Variable -Name excel 
[gc]::collect() 
[gc]::WaitForPendingFinalizers() 

當我坐下來的第二個(#SRP部分)我得到以下錯誤的節約線路:

Cannot find an overload for "Save" and the argument count: "1". 
At D:\UserAdminScripts\0_Powershell_Test_Scripts\Scripts_For_Lisa\NED Stuff\NED_Reports.ps1:130 char:15 
+ $workbook.save <<<< ($fpath) 
    + CategoryInfo   : NotSpecified: (:) [], MethodException 
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest 

如果我讓腳本錯誤後運行,我得到相同每列的結果。

我知道這個腳本並不乾淨,因爲我不需要關閉並重新打開每個運行Excel,但我從http://blogs.technet.com/b/heyscriptingguy/archive/2010/09/09/copy-csv-columns-to-an-excel-spreadsheet-by-using-powershell.aspx屠殺此腳本。 saveas在第一次嘗試中正常工作,它只是save導致錯誤。

我發現,當我打破腳本,我彈出確認是否要更改Book2.xlsx。我告訴它是的,我檢查並且Book2的第二列填寫了我想要的數據作爲我原始表單上的第二列。

任何幫助表示讚賞。

+0

將取出'$ workbook.saveas($ fpath)'' $ Excel.Quit()'' 刪除變量-Name excel' '[ gc] :: collect()' '[gc] :: WaitForPendingFinalizers()'完全直到我試圖添加所有6列,而沒有做任何直到最後纔是解決方案? – Nate

回答

0

好吧,看起來我回答了我自己的問題,因爲ConanW的靈感實際上,你知道,批判性地思考。這個問題的答案我的問題如下:

#ID 

    $csvFile = "$path\ID.csv" 
    $fpath = $Filename 
$processes = Import-Csv -Path $csvFile 
$Excel = New-Object -ComObject excel.application 
$Excel.visible = $false 
$workbook = $Excel.workbooks.add() 
$excel.cells.item(1,1) = "ID" 
$i = 2 
foreach($process in $processes) 
{ 
$excel.cells.item($i,1) = $process.ID 
$i++ 
} #end foreach process 


#SRP 

    $csvFile = "$path\SRP.csv" 

$processes = Import-Csv -Path $csvFile 
$excel.cells.item(1,2) = "SRP" 
$i = 2 
foreach($process in $processes) 
{ 
$excel.cells.item($i,2) = $process.SRP 
$i++ 
} #end foreach process 
$workbook.saveas($fpath) 
$Excel.Quit() 
Remove-Variable -Name excel 
[gc]::collect() 
[gc]::WaitForPendingFinalizers() 
1

看一看在$Workbook對象與Get-Member

Save        Method    void Save() 

的Save()方法不接受任何參數和它未能制定出如何處理方法和文件名參數做。

您退出#ID部分中的Excel應用程序(因此關閉文件),因此您需要在訪問工作簿並嘗試寫入之前重新打開該文件。

+0

P.S.我花了一些時間來處理Office COM對象,並發現它們笨重和複雜。我最近發現了一個優秀的PowerShell模塊,它提供了更快的Excel功能,使用起來更簡單。試試看,它可能適合您的需求。它甚至不需要安裝Excel。看看GitHub上的這個頁面(感謝作者dfinke):[https://github.com/dfinke/ImportExcel](https://github.com/dfinke/ImportExcel) – ConanW

+0

我不知道你是否看到我的對我的問題發表評論。你是這個意思嗎?我打賭我不需要繼續調用它:'$ Excel = New-Object -ComObject excel.application $ Excel.visible = $ false $ workbook = $ Excel.workbooks.add()'right? – Nate

+0

對不起,錯過了。是的,如果你不關閉它,你將不必重新打開它:)認真,但看看這個模塊。 – ConanW