2016-03-25 248 views
0

我试图扩展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参数?

+1

'-ArgumentList(,$ foo)'? – PetSerAl

+0

'Invoke-GenericMethod'不是内置的PowerShell命令行开关。请参阅[此问题](http://stackoverflow.com/q/18774889/1001100)以获取更多信息。 – JamesQMurphy

+0

@PetSerAl它的工作。但我不明白为什么。现在空对象被调用的方法返回。 –

回答

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)