PowerShell Excel报表脚本奇怪的错误

时间:2014-03-03 14:36:14

标签: excel powershell

我对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()'.

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

我已经尝试过谷歌这些错误了,关于PowerShell的信息已经很少了,而且我很难弄清楚问题是什么(第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

2 个答案:

答案 0 :(得分:2)

我发现了我的问题:

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

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

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

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

答案 1 :(得分:1)

我不会使用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?

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