如果只有从PowerShell函数返回的工作表引用,如何关闭Excel应用程序?

如果只有从PowerShell函数返回的工作表引用,如何关闭Excel应用程序?,excel,function,powershell,reference,Excel,Function,Powershell,Reference,我以前问过一个关于他的问题。现在,我想在保存Excel应用程序后使用PowerShell关闭它 调用的函数 Function Create-Excel-Spreadsheet() { [CmdletBinding()] Param ( [Parameter(Position=0)] [string]$title_row='1', [Parameter(Position=1)] [string]$header_row=

我以前问过一个关于他的问题。现在,我想在保存Excel应用程序后使用PowerShell关闭它

调用的函数

Function Create-Excel-Spreadsheet() {
    [CmdletBinding()]
    Param (
        [Parameter(Position=0)]
        [string]$title_row='1',
        [Parameter(Position=1)]
        [string]$header_row='2',
        [Parameter(Position=2)]
        [string]$data_row_start='3',
        [Parameter(Position=3)]
        [string]$data_row_end='10'
    )

    # open excel
    $excel = New-Object -ComObject excel.application
    $excel.visible = $True
    $workbook = $excel.Workbooks.Add()
    $xl_wksht= $workbook.Worksheets.Item(1)
    $xl_wksht.Name = 'Cut-off'   #give the worksheet a name
    $xl_wksht.Cells.Item($title_row, 1)= 'Cut-off Processing Ran ' + $startday + ' at ' + $starttime_str
    $MergeCells = $xl_wksht.Range("A1:Q1")
    $MergeCells.MergeCells = $true

    #formatting the title and giving it a font & color
    $xl_wksht.cells($title_row, 1).HorizontalAlignment = -4108   # center the title
    $xl_wksht.cells.Item($title_row,1).Font.Size = 18
    $xl_wksht.cells.Item($title_row,1).Font.Bold = $True
    $xl_wksht.cells.Item($title_row,1).Font.Name = "Cambria"
    $xl_wksht.cells.Item($title_row,1).Font.ThemeFont = 1
    $xl_wksht.cells.Item($title_row,1).Font.ThemeColor = 4
    $xl_wksht.cells.Item($title_row,1).Font.ColorIndex = 55
    $xl_wksht.cells.Item($title_row,1).Font.Color = 8210719
    $xl_wksht.cells.Item($title_row,1).Font.Color = 8210719
    $xl_wksht.Rows[$title_row].RowHeight = 39
    $xl_wksht.Rows[$title_row].VerticalAlignment = 2

    $xl_wksht.Rows[$header_row].WrapText = $True
    $xl_wksht.Rows[$header_row].Font.Bold = $True
    $xl_wksht.Rows[$header_row].columnWidth = 12.57
    $xl_wksht.Rows[$header_row].HorizontalAlignment = -4108

    $xl_wksht.cells.Item($header_row, 1).value2 = 'Current Load Date'
    $xl_wksht.Columns[1].HorizontalAlignment = -4108
    $xl_wksht.Columns[1].NumberFormat = "@"

    $xl_wksht.cells.Item($header_row, 2).value2 = 'Export File Type'
    $xl_wksht.Columns[2].columnWidth = 26

    $xl_wksht.cells.Item($header_row,3).value2 = 'File Name to Downloaded'
    $xl_wksht.Columns[3].columnWidth = 37

    $xl_wksht.cells.Item($header_row,4).value2 = 'Source Path'
    $xl_wksht.Columns[4].columnWidth = 23

    $xl_wksht.cells.Item($header_row,5).value2 = 'File Available?'
    $xl_wksht.Columns[5].HorizontalAlignment = -4108

    $xl_wksht.cells.Item($header_row,6).value2 = 'Already Loaded in DB?'
    $xl_wksht.Columns[6].HorizontalAlignment = -4108

    $xl_wksht.cells.Item($header_row,7).value2 = 'Checking Database.Owner.Table'
    $xl_wksht.Columns[7].columnWidth = 50

    $xl_wksht.cells.Item($header_row,8).value2 = 'Query Count for Current Date'
    $xl_wksht.Columns[8].Style.NumberFormat = '#,##0'

    $xl_wksht.cells.Item($header_row,9).value2 = 'Previous Load Date'
    $xl_wksht.Columns[9].HorizontalAlignment = -4108
    $xl_wksht.Columns[9].NumberFormat = "@"

    $xl_wksht.cells.Item($header_row,10).value2 = 'Query Count for Previous Load'
    $xl_wksht.cells.Item($header_row,11).value2 = 'Diff between Current and Previous Load Count'

    $xl_wksht.cells.Item($header_row,12).value2 = 'Pct Diff between Current and Previous Load Count'
    # Add formatting for the percentage column
    $fmt_range_start=('L' + $data_row_start)
    $fmt_range_end=('L' + $data_row_end)
    $fmt_range="$fmt_range_start" + ":" + "$fmt_range_end"
    $FormatRange = $xl_wksht.Range($($fmt_range))
    $FormatRange.NumberFormat = "#,##0.000000%"

    $xl_wksht.cells.Item($header_row, 13).value2 = 'Compressed File Size'
    $xl_wksht.Columns[13].HorizontalAlignment = -4108

    $xl_wksht.cells.Item($header_row, 14).value2 = 'Successfully Downloaded and Unzipped File'
    $xl_wksht.Columns[14].HorizontalAlignment = -4108

    $xl_wksht.cells.Item($header_row, 15).value2 = 'Un-Zip Time (Mins:Secs,Fract Secs)'
    #$xl_wksht.columns.item('n').NumberFormat = "@"  #alternative notation using letter of column
    $xl_wksht.Columns[15].columnWidth = 24
    $xl_wksht.columns[15].NumberFormat = "@"
    $xl_wksht.Columns[15].HorizontalAlignment = -4108

    $xl_wksht.cells.Item($header_row, 16).value2 = 'Un-Zipped File Size'    
    $xl_wksht.Columns[16].columnWidth = 14
    $xl_wksht.Columns[16].HorizontalAlignment = -4108

    $xl_wksht.cells.Item($header_row, 17).value2 = 'Un-Zipped File Line Count'

    $xl_wksht.cells.Item($header_row, 18).value2 = 'Time to Count Lines (mins:secs,fract secs)'
    $xl_wksht.Columns[18].columnWidth = 24
    $xl_wksht.columns[18].NumberFormat = "@"
    $xl_wksht.Columns[18].HorizontalAlignment = -4108

    $xl_wksht.cells.Item($header_row, 19).value2 = 'Parse File Directory'
    $xl_wksht.Columns[19].columnWidth = 36

    $xl_wksht.cells.Item($header_row, 20).value2 = 'Parse File Name'
    $xl_wksht.Columns[20].columnWidth = 44

    $xl_wksht.cells.Item($header_row, 21).value2 = 'Fields Per Line'

    $xl_wksht.cells.Item($header_row, 22).value2 = 'Time to Parse File (hrs:mins:secs,fract secs)'
    $xl_wksht.Columns[22].columnWidth = 24
    $xl_wksht.columns[22].NumberFormat = "@"
    $xl_wksht.Columns[22].HorizontalAlignment = -4108

    $xl_wksht.cells.Item($header_row, 23).value2 = 'Total Line Count During Parsing'
    $fmt_range_start=('W' + $data_row_start)
    $fmt_range_end=('W' + $data_row_end)
    $fmt_range="$fmt_range_start" + ":" + "$fmt_range_end"
    $FormatRange = $xl_wksht.Range($($fmt_range))
    $FormatRange.NumberFormat = "#,##0"

    $xl_wksht.cells.Item($header_row, 24).value2 = 'Count of Lines Parsed for Loading'
    $fmt_range_start=('X' + $data_row_start)
    $fmt_range_end=('X' + $data_row_end)
    $fmt_range="$fmt_range_start" + ":" + "$fmt_range_end"
    $FormatRange = $xl_wksht.Range($($fmt_range))
    $FormatRange.NumberFormat = "#,##0"

    $xl_wksht.cells.Item($header_row, 25).value2 = 'Count of Unloadable Lines'
    $fmt_range_start=('Y' + $data_row_start)
    $fmt_range_end=('Y' + $data_row_end)
    $fmt_range="$fmt_range_start" + ":" + "$fmt_range_end"
    $FormatRange = $xl_wksht.Range($($fmt_range))
    $FormatRange.NumberFormat = "#,##0"

    $xl_wksht.cells.Item($header_row, 26).value2 = 'Pct of Unloadable Lines'
    # Add formatting for the percentage column
    $fmt_range_start=('Z' + $data_row_start)
    $fmt_range_end=('Z' + $data_row_end)
    $fmt_range="$fmt_range_start" + ":" + "$fmt_range_end"
    $FormatRange = $xl_wksht.Range($($fmt_range))
    $FormatRange.NumberFormat = "#,##0.000000%"

    $xl_wksht.cells.Item($header_row, 27).value2 = 'Error File Directory'
    $xl_wksht.Columns[27].columnWidth = 36

    $xl_wksht.cells.Item($header_row, 28).value2 = 'Error File Name'
    $xl_wksht.Columns[28].columnWidth = 44

    $xl_wksht.cells.Item($header_row, 29).value2 = 'Staging Directory'
    $xl_wksht.Columns[29].columnWidth = 45

    $xl_wksht.cells.Item($header_row, 30).value2 = 'Successfully Copied to Staging Directory'
    $xl_wksht.cells.Item($header_row, 31).value2 = 'Local Processing Files Removed'

    $xl_wksht.cells.Item($header_row, 32).value2 = 'Start Time for DB Load'
    $xl_wksht.columns[32].NumberFormat = "@"
    $xl_wksht.Columns[32].HorizontalAlignment = -4108

    $xl_wksht.cells.Item($header_row, 33).value2 = 'End Time for DB Load'
    $xl_wksht.columns[33].NumberFormat = "@"
    $xl_wksht.Columns[33].HorizontalAlignment = -4108

    $xl_wksht.cells.Item($header_row, 34).value2 = 'Total Time to Load File (hrs:mins:secs)'
    $xl_wksht.Columns[34].columnWidth = 20
    $xl_wksht.columns[34].NumberFormat = "@"
    $xl_wksht.Columns[34].HorizontalAlignment = -4108

    $xl_wksht.cells.Item($header_row, 35).value2 = 'Count of Rows Uploaded'
    $fmt_range_start=('AI' + $data_row_start)
    $fmt_range_end=('AI' + $data_row_end)
    $fmt_range="$fmt_range_start" + ":" + "$fmt_range_end"
    $FormatRange = $xl_wksht.Range($($fmt_range))
    $FormatRange.NumberFormat = "#,##0"

    $xl_wksht.cells.Item($header_row, 36).value2 = 'Count of Rows Not Loaded'
    $fmt_range_start=('AJ' + $data_row_start)
    $fmt_range_end=('AJ' + $data_row_end)
    $fmt_range="$fmt_range_start" + ":" + "$fmt_range_end"
    $FormatRange = $xl_wksht.Range($($fmt_range))
    $FormatRange.NumberFormat = "#,##0"

    $xl_wksht.cells.Item($header_row, 37).value2 = 'Pct of Rows Not Loaded'
    # Add formatting for the percentage column
    $fmt_range_start=('AK' + $data_row_start)
    $fmt_range_end=('AK' + $data_row_end)
    $fmt_range="$fmt_range_start" + ":" + "$fmt_range_end"
    $FormatRange = $xl_wksht.Range($($fmt_range))
    $FormatRange.NumberFormat = "#,##0.000000%"

    return $xl_wksht
}
我做了很多事情,然后我准备在主程序结束时进行清理

来自主程序

    $xl_wksht.Application.DisplayAlerts = $False  # don't show overwrite warning if it displays
    $xl_wksht.Application.ActiveWorkbook.SaveAs("$savePath")
    $xl_wksht.Application.ActiveWorkbook.Close($false) 
    $xl_wksht.Application.Quit()

在我到达目的地之前,一切似乎都很顺利。然后我得到了“不能对空值表达式调用方法”错误。

未经测试,但可能在关闭工作簿之前先尝试获取对Excel应用程序的引用:

$xl = $xl_wksht.Application
... hide alerts, saveas and close
$xl.Quit()

Excel应用程序在函数中创建(请参见链接)。我返回工作表引用并使用它做我需要做的一切,直到退出时间。。。然后我被卡住了。哦,我以为你在
函数中关闭了。。。未经测试,但请尝试
$excelApp=$xl_wksht.Application
并调用
Quit()
。@Mark-修改后的答案有效吗?如果没有,我将删除答案。我现在正在尝试。。。但是我以前试过$($xl_wksht.Application).Quit(),我想它也可以做同样的事情吗?这很有效。。。在关闭工作表之前获取应用程序对象。。。知道了。