我正在尝试使用this example扩展extarnal module来调用泛型方法。我的目标是创建新的xls文件并写入它。
[Reflection.Assembly]::LoadWithPartialName("DocumentFormat.OpenXml") | Out-Null
[Reflection.Assembly]::LoadWithPartialName("DocumentFormat.OpenXml.Packaging")
[Reflection.Assembly]::LoadWithPartialName("DocumentFormat.OpenXml.Spreadsheet")
[Reflection.Assembly]::LoadWithPartialName("OpenXmlPowerTools")
Import-Module (join-path (Split-Path $MyInvocation.MyCommand.Path) "GenericMethods.psm1")
$document = [DocumentFormat.OpenXml.Packaging.SpreadsheetDocument]::Create("C:\Temp\text.xlsx", [DocumentFormat.OpenXml.SpreadsheetDocumentType]::Workbook)
$workbookPart = $document.AddWorkbookPart();
$workbookPart.Workbook = New-Object -TypeName DocumentFormat.OpenXml.Spreadsheet.Workbook
$worksheetPart = Invoke-GenericMethod -InputObject $workbookPart -MethodName AddNewPart -GenericType DocumentFormat.OpenXml.Packaging.WorksheetPart
$sheetData = New-Object -TypeName DocumentFormat.OpenXml.Spreadsheet.SheetData
$worksheetPart.Worksheet = New-Object -TypeName DocumentFormat.OpenXml.Spreadsheet.Worksheet -ArgumentList $sheetData
[DocumentFormat.OpenXml.Spreadsheet.Sheets]$foo = New-Object -TypeName DocumentFormat.OpenXml.Spreadsheet.Sheets
Invoke-GenericMethod -InputObject $document.WorkbookPart.Workbook -MethodName AppendChild -GenericType DocumentFormat.OpenXml.Spreadsheet.Sheets -ArgumentList $foo
$document.Close()
问题是这段代码
[DocumentFormat.OpenXml.Spreadsheet.Sheets]$foo = New-Object -TypeName DocumentFormat.OpenXml.Spreadsheet.Sheets
Invoke-GenericMethod -InputObject $document.WorkbookPart.Workbook -MethodName AppendChild -GenericType DocumentFormat.OpenXml.Spreadsheet.Sheets -ArgumentList $foo
抛出错误Invoke-GenericMethod : No matching method was found
。引发因为New-Object
创建的某些内容被Invoke-GenericMethod
函数视为空数组。因此该模块正在寻找没有参数的通用方法。请注意,第一次调用Invoke-GenericMethod
工作正常。
如何使用Invoke-GenericMethod
参数调用-ArgumentList
?
答案 0 :(得分:2)
您的代码的问题是DocumentFormat.OpenXml.OpenXmlElement
类(DocumentFormat.OpenXml.Spreadsheet.Sheets
的基类)实现IEnumerable
接口。这使PowerShell将DocumentFormat.OpenXml.Spreadsheet.Sheets
的任何实例解释为集合,而不是单个对象。
当你只写
时$foo
PowerShell将枚举收集和显示子元素(确切地说,您将看到子元素,因为格式化cmdlet通常会执行另一个集合枚举)。而且由于你刚刚创建了这个对象,它将是空的并且不会显示任何内容。
要实际显示$foo
对象本身,您需要这样写:
,$foo | Format-Table -Expand CoreOnly
或
,,$foo
事实上,PowerShell将DocumentFormat.OpenXml.Spreadsheet.Sheets
的实例解释为集合,也会影响转换为[Object[]]
(-ArgumentList
参数的类型)的转换方式。而不是包装到单个元素数组中(因为你想用单个参数调用方法),就像单个对象一样,PowerShell从集合的元素创建数组。
要解决您的问题,您需要自己包装到单个元素数组中。你可以用一元逗号操作符来做到这一点:
-ArgumentList (,$foo)