使用PowerShell,可以轻松创建Excel Application类的实例并开始操作它:
$app = New-Object -ComObject "Excel.Application"
但是,如果我需要使用像xlDoubleQuote或xlDelimited这样的常量 - 似乎我不得不对它们进行硬编码。我真的希望能够做到这样的事情:
$constants = New-Object -ComObject "Excel.Constants"
$constants.xlDoubleQuote
并且看到它将返回值1.不幸的是我无法创建枚举的实例,并且似乎没有像普通.NET类库那样引用它的方法:< / p>
[Excel.Constants]::xlDoubleQuote
有没有办法将该枚举动态导入PowerShell?也许通过托管库而不是COM?
答案 0 :(得分:9)
使用Excel的主互操作程序集。如果您安装了Office,则这些应该在GAC中。像这样使用:
Add-Type -AssemblyName Microsoft.Office.Interop.Excel
[int][Microsoft.Office.Interop.Excel.Constants]::xlDoubleQuote
答案 1 :(得分:4)
基思已经给你答案,这是另一个选择。您可以在$ xlConstants对象上使用制表符完成来获取常量:
$xl = New-Object -ComObject Excel.Application
$constants = $xl.gettype().assembly.getexportedtypes() | where-object {$_.IsEnum -and $_.name -eq 'constants'}
$pso = new-object psobject
[enum]::getNames($constants) | foreach { $pso | Add-Member -MemberType NoteProperty $_ ($constants::$_) }
$xlConstants = $pso
答案 2 :(得分:1)
使用Excel 2003或Excel 2007时,应在计算机上安装Office主互操作程序集(PIA)。 Microsoft提供了可再发行版本。有关详细信息,请参阅此stackoverflow.com发布此处:
Different Interop references on two different computers doesn't work
答案 3 :(得分:0)
使用32位Visio 2016,我发现尝试使用Keith Hill的方法会导致错误消息:“添加类型:无法添加类型。找不到程序集'Microsoft.Office.Interop.Visio'。” Shay Levy的方法需要更多修改才能与Visio一起使用。这就是我能够开始工作的地方:
$visioApp = New-Object -ComObject Visio.Application
$visioConstants = @{}
$visioEnums = $visioApp.gettype().assembly.getexportedtypes() | where-object {$_.IsEnum } #-and $_.name -eq 'constants'}
The answers of Keith Hill and Shay Levy are best, however, I found that Visio
$visioEnums |%{
$enumname = $_
[enum]::getNames($enumname) | foreach {
$val = invoke-expression "[$($enumname)]::$($_).value__"
$visConstants.$_ = $val
}
}
$visioApp.Quit()
echo $visConstants.visTopEdge
令人失望的是,我测试时大约需要12秒钟才能执行。
答案 4 :(得分:0)
要将Keith Hill's helpful answer中的技术与Shay Levy's answer中的制表符完成想法结合起来:
# Instantiate Excel, which implicitly loads the interop
# assembly that contains the [enum] type of interest.
# Assign to $null, if you're not planning on using the object further.
$xl = New-Object -ComObject Excel.Application
# Store the [enum] type of interest in a variable for easier access.
$xlConstants = [Microsoft.Office.Interop.Excel.Constants]
注意:要查找Constants
类型的全名,可以使用制表符补全:运行New-Object -ComObject Excel.Application
后,键入[constants<tab>
(不要键入结尾{{1 }}),应扩展为]
;如果显示的是来自{<1> other 以外的名称空间的[Microsoft.Office.Interop.Excel.Constants
类型,请按Tab键,直到找到所需的类型。
现在您可以:
通过Microsoft.Office.Interop.Excel
运算符访问单个枚举值作为$xlConstants
中存储的类型的静态成员,该运算符也可用于制表符补全;例如:
::
通过强制转换为$xlConstants::xl3d<tab> # -> expands to $xlConstants::xl3DBar
或访问[int]
属性来获取特定值的基础数字:
.Value__
枚举所有符号名称:
[int] $xlConstants::xl3DBar # -> -4099
$xlConstants::xl3DBar.Value__ # ditto
还要显示符号名称下面的数字:
[enum]::GetNames($xlConstants)