2016-03-25 14 views
0

Genel yöntemleri aramak için extarnal module'u kullanarak this example'u genişletmeye çalışıyorum. Amacım yeni xls dosyası oluşturmak ve ona yazmak.Yeni Nesne, boş nesneyi döndürür

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

sorun kodu

[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 

bu parça hatasını Invoke-GenericMethod : No matching method was found atar olmasıdır. Atarlar, New-Object, Invoke-GenericMethod işleviyle boş dizi olarak değerlendirilen bir şey oluşturduğundan. Yani modül hiçbir parametresi olmayan jenerik yöntemler arıyor. İlk aramanın Invoke-GenericMethod numaralı telefona düzgün çalıştığını unutmayın.

Invoke-GenericMethod-ArgumentList parametresiyle nasıl aramalıyım?

+1

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

+0

'Invoke-GenericMethod' yerleşik bir PowerShell komutu değildir. Daha fazla bilgi için [bu soru] bölümüne bakın (http://stackoverflow.com/q/18774889/1001100). – JamesQMurphy

+0

@PetSerAl Çalışıldı. Ama nedenini anlayamıyorum. Ve şimdi boş nesne çağrılan yöntemle döndürülür. –

cevap

2

Kodunuzdaki sorun, DocumentFormat.OpenXml.OpenXmlElement sınıfının (DocumentFormat.OpenXml.Spreadsheet.Sheets temel sınıfı) IEnumerable arabirimini uyguladığıdır. Bu, PowerShell'in tekil bir nesne yerine DocumentFormat.OpenXml.Spreadsheet.Sheets örneğini koleksiyon olarak yorumlamasını sağlar.

sen (biçimlendirme davranırlar normalde koleksiyonların başka numaralandırma çünkü hassas olmak, sen çocuğun çocuğu göreceksiniz) sadece

$foo 

PowerShell yerine toplama ve görüntüleme alt öğelerini numaralandırma yazarken. Ve bu nesneyi yeni oluşturduğunuzdan, boş olacak ve hiçbir şey gösterilmeyecek.

aslında $foo nesnenin kendisini görüntülemek için, bu gibi yazmak gerekir:

,$foo | Format-Table -Expand CoreOnly 

veya

,,$foo 

gerçeği, PowerShell topluluğu olarak DocumentFormat.OpenXml.Spreadsheet.Sheets örneğini yorumlamak olduğunu, ayrıca nasıl dönüşüm etkiler [Object[]] (-ArgumentList parametresi türü) yapılır. Tek öğe dizisine (tek argümanla yöntemi çağırmak istediğiniz gibi), tekil nesneler için olduğu gibi, PowerShell koleksiyonun öğelerinden diziyi yaratır.

Sorununuzu çözmek için tek öğe dizisine kendiniz sarmanız gerekir. Tek bir virgül ile yapabilirsiniz:

-ArgumentList (,$foo)