Powershell 脚本错误 "Cannot find an overload for "LoadFromCollection”和参数计数:“1”。
Powershell Script error "Cannot find an overload for "LoadFromCollection" and the argument count: "1"."
我正在尝试使用 LoadfromCollection 将集合对象加载到 excel 文件中。我正在使用 EPPLUS 库来这样做。但我一直收到错误消息“找不到“LoadFromCollection”的重载和参数计数:“1”。由于我是 PowerShell 的新手,不确定如何解决该问题。另外,有没有其他方法可以使用 EPPLUS 库加载集合对象?
$pkg = [OfficeOpenXml.ExcelPackage]::new($Path)
$ws = $pkg | Add-WorkSheet -WorkSheetname 'test'
$DemoData = New-Object System.Collections.ArrayList
$DemoData = 1..10 | Foreach-Object{
$BookID = Get-Random -Minimum 1 -Maximum 1000
$Date = (Get-Date).adddays(-$BookID)
New-Object -TypeName PSObject -Property @{
Name = "Book$_"
BookID = $BookID
Date = $Date
} | Select Name, BookID, Date
}
$null = $ws.Cells['A1'].LoadFromCollection($DemoData)
.LoadFromCollection
是一个 泛型 方法 ,具有以下签名:
public ExcelRangeBase LoadFromCollection<T>(
IEnumerable<T> Collection
)
为了让 PowerShell 能够调用泛型方法,它必须能够推断 IEnumerable<T>
的元素的具体类型 T
=]实例.
因此,鉴于您的 $DemoData
数组是 非强类型 - 它的类型是 [object[]
, PowerShell 的常规数组类型 - PowerShell 无法找到合适的 .LoadFromCollection
方法重载 ,导致您看到的错误。
(请注意,您的 $DemoData = New-Object System.Collections.ArrayList
语句无效:后续的 $DemoData = 1..10 ...
语句会覆盖它,并分配任何命令 returns,这是一个 [object[]]
数组.)
直接解决方法是确保您使用 强类型 数组,这意味着:[pscustomobject[]] $DemoData = 1..10 ...
,假设 [pscustomobject]
是类型Select-Object
调用的对象的数量 returns.
这 可能 就足够了,具体取决于该方法用于确定输入对象属性的反射方法:
如果它能够通过[pscustomobject]
实现的IDynamicMetaObjectProvider
接口发现属性,那么[pscustomobject[]]
类型约束就够了。
如果不是,您必须通过 (PSv5+) 自定义 class 创建常规 .NET 类型,如下图:
# PowerShell v5 and above.
$pkg = [OfficeOpenXml.ExcelPackage]::new($Path)
$ws = $pkg | Add-WorkSheet -WorkSheetname 'test'
# Define a custom class with the properties of interest.
class Custom {
[string] $Name
[int] $BookID
[datetime] $Date
}
[Custom[]] $DemoData = 1..10 | Foreach-Object{
$BookID = Get-Random -Minimum 1 -Maximum 1000
$Date = (Get-Date).adddays(-$BookID)
# Create and output a [Custom] instance with the specified property values.
[Custom] @{ Name = "Book$_"; BookId = $BookID; Date = $Date }
}
# Call .LoadFromCollection with the strongly typed array.
$null = $ws.Cells['A1'].LoadFromCollection($DemoData)
我正在尝试使用 LoadfromCollection 将集合对象加载到 excel 文件中。我正在使用 EPPLUS 库来这样做。但我一直收到错误消息“找不到“LoadFromCollection”的重载和参数计数:“1”。由于我是 PowerShell 的新手,不确定如何解决该问题。另外,有没有其他方法可以使用 EPPLUS 库加载集合对象?
$pkg = [OfficeOpenXml.ExcelPackage]::new($Path)
$ws = $pkg | Add-WorkSheet -WorkSheetname 'test'
$DemoData = New-Object System.Collections.ArrayList
$DemoData = 1..10 | Foreach-Object{
$BookID = Get-Random -Minimum 1 -Maximum 1000
$Date = (Get-Date).adddays(-$BookID)
New-Object -TypeName PSObject -Property @{
Name = "Book$_"
BookID = $BookID
Date = $Date
} | Select Name, BookID, Date
}
$null = $ws.Cells['A1'].LoadFromCollection($DemoData)
.LoadFromCollection
是一个 泛型 方法 ,具有以下签名:
public ExcelRangeBase LoadFromCollection<T>(
IEnumerable<T> Collection
)
为了让 PowerShell 能够调用泛型方法,它必须能够推断 IEnumerable<T>
的元素的具体类型 T
=]实例.
因此,鉴于您的 $DemoData
数组是 非强类型 - 它的类型是 [object[]
, PowerShell 的常规数组类型 - PowerShell 无法找到合适的 .LoadFromCollection
方法重载 ,导致您看到的错误。
(请注意,您的 $DemoData = New-Object System.Collections.ArrayList
语句无效:后续的 $DemoData = 1..10 ...
语句会覆盖它,并分配任何命令 returns,这是一个 [object[]]
数组.)
直接解决方法是确保您使用 强类型 数组,这意味着:[pscustomobject[]] $DemoData = 1..10 ...
,假设 [pscustomobject]
是类型Select-Object
调用的对象的数量 returns.
这 可能 就足够了,具体取决于该方法用于确定输入对象属性的反射方法:
如果它能够通过
[pscustomobject]
实现的IDynamicMetaObjectProvider
接口发现属性,那么[pscustomobject[]]
类型约束就够了。如果不是,您必须通过 (PSv5+) 自定义 class 创建常规 .NET 类型,如下图:
# PowerShell v5 and above.
$pkg = [OfficeOpenXml.ExcelPackage]::new($Path)
$ws = $pkg | Add-WorkSheet -WorkSheetname 'test'
# Define a custom class with the properties of interest.
class Custom {
[string] $Name
[int] $BookID
[datetime] $Date
}
[Custom[]] $DemoData = 1..10 | Foreach-Object{
$BookID = Get-Random -Minimum 1 -Maximum 1000
$Date = (Get-Date).adddays(-$BookID)
# Create and output a [Custom] instance with the specified property values.
[Custom] @{ Name = "Book$_"; BookId = $BookID; Date = $Date }
}
# Call .LoadFromCollection with the strongly typed array.
$null = $ws.Cells['A1'].LoadFromCollection($DemoData)