【问题标题】:PowerShell Excel Report Script Weird ErrorPowerShell Excel 报告脚本奇怪的错误
【发布时间】:2026-02-09 17:25:02
【问题描述】:

我在使用 powershell 时遇到了一个奇怪的问题。我还有其他脚本类似于在整个脚本中多次使用的行上引发错误的脚本。

我正在使用get-content 来获取 CSV 文件。然后我开始解析这些数据,只选择某些列并将它们输出到 excel 中。这是我的一个问题发生的地方......

这是非常不一致的,但是在解析 csv 的某个时间点我得到了这个错误

Exception setting "Item": "Call was rejected by callee. (Exception from HRESULT: 0x80010001 (RPC_E_CALL_REJECTED))"

在这一行上,用于将数据输出到excel中的特定列和行。

$excel.Cells.Item <<<< ($rowMonth, $columnMonth) = "$item"

我注意到,如果我在解析数据时按住滚动条,我会忽略此错误。我还注意到它几乎每次都停在不同的位置(提供或获取一些数据单元格),或者有时我根本没有收到错误。

在每次插入失败后我立即收到此错误

Assignment failed because [System.__ComObject] doesn't contain a settable property 'Item()'.

...直到我在脚本的解析部分完成错误。

我已尝试用 Google 搜索这些错误,但关于 PowerShell 和 Excel 的信息已经很少,我很难找出问题所在(第 3 天..)

我还有 4 个运行这行代码的其他脚本..

$excel.Cells.Item($rowNumber, $column) = "$item"

他们从来没有告诉我这个错误。

一旦我的解析完成(如果它在那里,我在尝试调试并按住滚动条时作弊)我在这里有这一行,我用它来切换到 Excel 中的另一个工作表,它会出错每次都在这里。

$sheet2 = $workBook.WorkSheets.Item($sheetName2).Select()

还给了我我发布的第一个错误..而且当我在解析一半时确实收到错误时,一旦出错,excel要求我将书设置为读/写(......再次......只是有时.....)。

这可能是什么问题,为什么如此不一致?会不会是内存限制? (我在 CSV 中解析的数据比我在脚本中解析的数据多,并且从未遇到过这个问题)

请帮忙!

这是我创建 excel 对象的方式。

#Create an instance of Excel
$excel = New-Object -comobject Excel.Application

#declaring sheet names 
$sheetName = "some sheet name"

#open Excel file
[string]$file = "C:\Users\Desktop\excel-file.xlsx"

$workBook = $excel.Workbooks.open($file)

$workBook.WorkSheets.Item($sheetName).activate()

$excel.Visible = $true

$excel.displayAlerts = $false 

这是我输出到 excel 的地方:

#Declaring variables
$i = 0
$rowNumber = 2     
$rowMonth = 2786

$data1 = Get-Content $file1

foreach($row in $data1){    

    if($row){   
        $line = $row.Split(",")                      
        $i++

        #reset back to the first column once there is no more data for that row
        $column = 1       
        $columnMonth = 7     
        $dataColumn = 0    


        if($i -ge 1){    
                foreach($item in $line){
                    $dataColumn++
                    if($dataColumn -eq 1 -or $dataColumn -eq 2 -or $dataColumn -eq 5 -or $dataColumn -eq 7){                        
                            $excel.Cells.Item($rowNumber, $column) = "$item"
                            $excel.Cells.Item($rowMonth, $columnMonth) = "$item"
                            $column++
                            $columnMonth++
                        }#endif
                }#end foreach  
            $rowNumber++
            $rowMonth++
        }#end if $i          
    }#end if $row
}#end foreach

【问题讨论】:

  • 当您尝试向其中插入项目时,您的 Excel 文件是否打开?
  • 您的$excel 对象是什么,您是如何创建它的?另外,为什么需要切换到另一个工作表?你应该只做$sheet2 = $workBook.WorkSheets.Item(2)$sheet2.Name = $sheet2name...调用$sheet2.cells.item($row,$col) = $item 将为你“切换”工作表
  • 我正在切换到另一个工作表来更新图表标题。

标签: excel powershell


【解决方案1】:

我发现我的问题是什么:

在脚本中,我打开工作簿,检查单元格中的日期,而不是将该日期与当前日期进行比较。一旦我得到了差异,我现在就知道我必须循环浏览我的报告多少次并关闭工作簿。然后我开始一个批处理脚本,它收集过去 15 天的一堆数据,然后我开始使用(开关)。获得数据后,我再次打开 Excel,并开始报告。

问题是关闭和重新打开 excel 之间的时间,我在它完全关闭之前重新打开了同一个工作簿。因此,在解析我的数据时,工作簿将变得“可用”并中断我的脚本并抛出这些错误。

我通过在第二次打开 excel 之前输入 Start-Sleep -sec 20 来解决这个问题,但还没有给我任何问题。

编辑:我已经正确地修复了我对对象的使用。另外,我已经将我的代码调整为只打开一次excel,而不是我一直在做的open-close、open-close。

【讨论】:

    【解决方案2】:

    我不会使用 select 或 activate,而是为每个工作表创建对象,并在单个工作表上调用 cells.item,而不是在整个工作簿上调用。 所以首先做$Sheet1 = $WorkBook.Worksheets.Item(1) 创建第一张工作表的工作表对象。然后使用$sheet1.Cells.item($row,$col) = $item添加您的项目

    关于为什么不使用 select 或 activate 的原因有很多。这是一个:How do i activate a specific workbook and a specific sheet?

    你不应该使用它的最大原因是性能,主要是没有必要。

    【讨论】:

    • 我从不知道这一点,但我会将其合并到我的脚本中。虽然它没有回答我的问题。不过谢谢!
    • @BigRabbit “这可能是什么问题,为什么如此不一致?”那不是你的问题吗?答案是因为您使用 select.. 并且当您尝试使用 excel 对象插入项目时,这是非常错误的。 Excel 包含具有工作表和单元格的工作簿。问题是你不够具体
    • 因为我使用.select 不是它为什么会坏的原因,你自己去测试一下,那部分是有效的。现在,当我运行我的脚本时,我可以直观地看到我所有的数据操作。我之所以具体是因为您指出我的 PowerShell 编程礼仪很草率,但这并不意味着这就是我的答案(我还在学习)。
    • @BigRabbit 这不是礼仪或风格,而是你如何做。请看一个简单的教程,并注意 Application 对象不是调用 Cells 的方式。它有时可能会起作用,但显然会中断:blogs.technet.com/b/heyscriptingguy/archive/2006/09/08/… .. 在此示例中,$a 是应用程序对象,$b 是工作簿对象,$c 是工作表对象...如果您仍然不了解这些对象,你应该阅读图书馆:msdn.microsoft.com/en-us/library/wss56bz7.aspx
    • @BigRabbit 这是一个 hack,而不是修复