获取Excel元数据

时间:2018-01-18 02:29:02

标签: excel-vba powershell metadata vba excel

我使用this PowerShell script来演示如何获取Excel文件元数据:

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$workbook = $excel.Workbooks.Open("C:\test\excel.xls")
$binding = "System.Reflection.BindingFlags" -as [type]
foreach ($property in $workbook.BuiltInDocumentProperties) {
    $pn = [System.__ComObject].InvokeMember("name", $binding::GetProperty, $null, $property, $null)
    trap [System.Exception] {
        Write-Host -Foreground blue "Value not found for $pn"
        continue
    }
    "$pn`: " + [System.__ComObject].InvokeMember("value", $binding::GetProperty, $null, $property, $null)
}
$excel.Quit()

有人可以协助:

  1. 对于脚本行:

    [System.__ComObject].InvokeMember("name", $binding::GetProperty, $null, $property, $null)
    

    我理解这个[System.__ComObject]的方式代表"类型"在foreach循环中返回的对象。

    你能解释一下为什么

    [System.__ComObject]$property.InvokeMember("name", $binding::GetProperty, $null, $property, $null)
    

    导致"陷阱"被触发?不是"对象"是在foreach循环中返回的,$property

  2. 此外,我发现this Excel VBA code可以获得"上次保存时间":

    Function LastModified() as Date
        LastModified = ActiveWorkbook.BuiltinDocumentProperties("Last Save Time")
    End Function
    

    此代码适用于Excel VBA。那么为什么这个等效的PowerShell代码不起作用:

    $lst = $workbook.BuiltinDocumentProperties("Last Save Time")
    [System.__ComObject]$lst.InvokeMember("value", $binding::GetProperty, $null, $property, $null)
    

1 个答案:

答案 0 :(得分:0)

  1. 来自about_Trap documentation
  2.   

    当发生未以其他方式处理的终止错误时   Windows PowerShell检查脚本或命令是否检查Trap语句   处理错误。如果存在Trap语句,则为Windows   PowerShell继续在陷阱中运行脚本或命令   言。

    1. 此处的代码逻辑与$lst = $excel.ActiveWorkbook.BuiltinDocumentProperties("Last save time") # like in VBA $lst = $workbook.BuiltinDocumentProperties("Last Save Time") # also fine [System.__ComObject].InvokeMember("value", $binding::GetProperty, $null, $lst, $null) 循环内的代码逻辑不同。第一行也与VBA示例不同,但该部分应该正常工作。
    2. $(document).ready(function() {
        $("#fullpage").fullpage({
          scrollOverflow: true
        });
      });