【问题标题】:How Do I Close the Excel Application if I Only Have a Worksheet Reference Returning from a PowerShell Function?如果我只有从 PowerShell 函数返回的工作表引用,如何关闭 Excel 应用程序?
【发布时间】:2020-01-18 06:10:46
【问题描述】:

我之前问过一个关于Returning an Excel Worksheet Reference from a Function Call 的问题。现在我想在保存后使用 PowerShell 关闭 Excel 应用程序。

函数调用

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()

在我到达 Quit() 之前,一切似乎都有效。然后我收到“您不能在空值表达式上调用方法”错误。

【问题讨论】:

    标签: excel function powershell reference


    【解决方案1】:

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

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

    【讨论】:

    • Excel 应用程序的创建发生在函数中(参见链接)。我返回工作表参考并使用它来做我需要做的所有事情,直到退出时间......然后我被卡住了。
    • 哦,我以为你在 Function... 内关闭... 未经测试,但请尝试 $excelApp = $xl_wksht.Application 并调用 Quit()
    • @Mark - 修改后的答案有效吗?如果不是,我将删除答案。
    • 我现在正在尝试...但我之前尝试过 $($xl_wksht.Application).Quit() 我认为它会做同样的事情?
    • 那行得通...在关闭工作表之前获取应用程序对象...知道了。
    猜你喜欢
    • 2020-04-30
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    相关资源
    最近更新 更多