无法使用 Interopservices 关闭 excel

Posted

技术标签:

【中文标题】无法使用 Interopservices 关闭 excel【英文标题】:Unable to close excel using Interopservices 【发布时间】:2017-08-07 22:23:13 【问题描述】:

我试图在 SQL 导入脚本之后关闭 excel,但我无法使用 Interopservices 方法释放 Com 对象。

当我尝试释放 com 对象时 [System.Runtime.Interopservices.Marshal]::ReleaseComObject(New-Object -Com Excel.Application) 我收到一个错误,提示我缺少括号。 我已经在其他人的代码中查看了这个过程的一些示例,虽然我一定遗漏了一些东西,但我一直在遗漏它,并且希望在找到它时得到一些帮助。

以下是我的脚本。

$serverName = "SERVER";
$databaseName = "User_Data" ;
$tableName = "TABLE" ;
$filepath = "Path to Xls";

#create object to open Excel workbook
$Excel = New-Object -ComObject Excel.Application
$Workbook = $Excel.Workbooks.Open($filepath)
$Worksheet = $Workbook.Worksheets.Item(1)
$startRow = 2

#create System.DataTable
    $dt = new-object "System.Data.DataTable"                                
    [void]$dt.Columns.Add("StaffStudentID", [System.Type]::GetType("System.String"))
    [void]$dt.Columns.Add("SurName", [System.Type]::GetType("System.String"))
    [void]$dt.Columns.Add("FirstName", [System.Type]::GetType("System.String"))
    [void]$dt.Columns.Add("Year", [System.Type]::GetType("System.String"))
    [void]$dt.Columns.Add("HomeGroup", [System.Type]::GetType("System.String"))
    [void]$dt.Columns.Add("DOB", [System.Type]::GetType("System.String"))
    [void]$dt.Columns.Add("StaffStudent", [System.Type]::GetType("System.String"))
    [void]$dt.Columns.Add("email", [System.Type]::GetType("System.String"))
    [void]$dt.Columns.Add("ImageName", [System.Type]::GetType("System.String"))
    [void]$dt.Columns.Add("CardKey", [System.Type]::GetType("System.String"))
    [void]$dt.Columns.Add("F11", [System.Type]::GetType("System.String"))
    Do                     
        $ColValues1 = $Worksheet.Cells.Item($startRow, 2).Value()
        $ColValues2 = $Worksheet.Cells.Item($startRow, 3).Value()
        $ColValues3 = $Worksheet.Cells.Item($startRow, 4).Value()
        $ColValues4 = $Worksheet.Cells.Item($startRow, 5).Value()
        $ColValues5 = $Worksheet.Cells.Item($startRow, 6).Value()
        $ColValues6 = $Worksheet.Cells.Item($startRow, 7).Value()
        $ColValues7 = $Worksheet.Cells.Item($startRow, 8).Value()
        $ColValues8 = $Worksheet.Cells.Item($startRow, 9).Value()
        $ColValues9 = $Worksheet.Cells.Item($startRow, 10).Value()
        $ColValues10 = $Worksheet.Cells.Item($startRow, 11).Value()
        $ColValues11 = $Worksheet.Cells.Item($startRow, 12).Value()
        $startRow++
        $dt.Rows.Add($ColValues1,$ColValues2,$ColValues3,$ColValues4,$ColValues5,$ColValues6,$ColValues7,$ColValues8,$ColValues9,$ColValues10,$ColValues11)
        
    While ($Worksheet.Cells.Item($startRow,2).Value() -ne $null)

$Excel.Quit()

#connect to SQL Server and import the system.data.table
$SQLServerConnection = "Data Source=$serverName;Integrated Security=true;Initial Catalog=$databaseName;"
$bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $SQLServerConnection
$bulkCopy.DestinationTableName = $tableName
$bulkCopy.WriteToServer($dt)


#Remove Veriables and com object 
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel)
Remove-Variable serverName
Remove-Variable databaseName
Remove-Variable tableName
Remove-Variable filepath
Remove-Variable excel
Remove-Variable workbook
Remove-Variable worksheet
Remove-Variable startRow
Remove-Variable dt
Remove-Variable bulkCopy
Remove-Variable sqlserverconnection

谢谢你,

女人

【问题讨论】:

【参考方案1】:

您需要在 Quit() 之前保存您的更改吗? 这种模式适合我。

Powershell: Excel, save and close after run

【讨论】:

如果它是通过计划任务运行的,它是否真的关闭了 excel 进程?当我这样运行它时,我最终会运行一个 excel 进程。 但是,不,我不需要保存数据,因为它是导入 SQL 的。

以上是关于无法使用 Interopservices 关闭 excel的主要内容,如果未能解决你的问题,请参考以下文章

System.Runtime.InteropServices.COMException (0x800A03EC): 无法访问文件

project处理 InteropServices.COMException 异常

关于异常System.Runtime.InteropServices.COMException

HikariPool-1 - 无法验证连接 org.postgresql.jdbc.PgConnection@2a84e649(此连接已关闭。)

winform窗体怎么获得焦点

使用服务结构时出现 System.Runtime.InteropServices.COMException