【问题标题】:PowerShell Error Creating XLSX创建 XLSX 的 PowerShell 错误
【发布时间】:2015-12-01 20:59:38
【问题描述】:

好的,我有 6 个 CSV,每个 CSV 包含一列。对于此示例,第一个 CSV 中的数据用于创建初始文档,之后的每个都尝试保存到文档中。

#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 的第二列填写了我想要的数据,作为我原始工作表的第二列。

感谢任何帮助。

【问题讨论】:

  • 会完全取出$workbook.saveas($fpath)$Excel.Quit() Remove-Variable -Name excel[gc]::collect()[gc]::WaitForPendingFinalizers(),直到我尝试添加所有6列,直到最后才做任何事情解决方案?

标签: excel csv powershell


【解决方案1】:

Get-Member 看看$Workbook 对象:

Save                             Method                void Save ()

Save() 方法不接受任何参数,并且无法确定如何处理该方法和您的文件名参数。

您在 #ID 部分退出 Excel 应用程序(从而关闭文件),因此您需要在访问工作簿并尝试写入之前重新打开文件。

【讨论】:

  • P.S.我花了一些时间处理 Office COM 对象,发现它们既笨重又复杂。我最近发现了一个出色的 PowerShell 模块,它提供了更快的 Excel 函数并且使用起来更简单。试试看,它可能适合您的需求。它甚至不需要安装 Excel。在 GitHub 上看这个页面(感谢作者 dfinke):https://github.com/dfinke/ImportExcel
  • 不知道你有没有看到我对我的问题的评论。你是这个意思吗?我敢打赌我不需要一直打电话给这个:$Excel = New-Object -ComObject excel.application $Excel.visible = $false $workbook = $Excel.workbooks.add() 对吧?
  • 抱歉,错过了。是的,如果你不关闭它,你就不必重新打开它 :) 不过说真的,看看那个模块。
  • 我很想安装,但我无法安装任何其他工具。我得到了 PS v2 和 Quest,就是这样。
  • 当您尝试.Quit() 时,您还应该检查您的 excel 进程是否已经消失。我遇到了问题,它永远不会死去,最终会运行数十个 excel 进程,尤其是在经常打开一个新进程时。
【解决方案2】:

好吧,看来我回答了我自己的问题,因为 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() 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2019-10-22
    • 1970-01-01
    • 2016-09-12
    • 2017-11-06
    • 1970-01-01
    • 2018-11-08
    相关资源
    最近更新 更多