在excel中搜索多个项目并返回整个字段
我有一个excel文件,其中包含多个表格,其中填充了sku和数量列。我需要在整个工作簿中搜索多个项目并返回它们的数量。products.txt包含sku ID在excel中搜索多个项目并返回整个字段,excel,powershell,vba,Excel,Powershell,Vba,我有一个excel文件,其中包含多个表格,其中填充了sku和数量列。我需要在整个工作簿中搜索多个项目并返回它们的数量。products.txt包含sku ID ABC1234 BCDH214 LDJI983 Excel工作簿inventory.xlsx包含以下列 **sku** ***Quantity*** ABC1234 2 BCDH214 0 LDJI98
ABC1234
BCDH214
LDJI983
Excel工作簿inventory.xlsx包含以下列
**sku** ***Quantity***
ABC1234 2
BCDH214 0
LDJI983 1
我想对inventory.xlsx运行prodcuts.txt并返回每个产品的数量
这可以通过powershell完成吗?或者其他运行这种查询的方法 使用此处显示的代码并确保已安装
我创建了一个简单的xlsx,其中包括:
SKU Quantity
one 1
two 4
three 9
然后我在Excel中调用:
$path = 'd:\test\exceldb.xlsx'
$results = Get-ExcelData -Path $path -Query 'SELECT * FROM [Sheet1$]'
$stuffFromProductsTxtFile = 'one', 'two', 'three'
foreach ($sku in $stuffFromProductsTxtFile)
{
$results.Rows | Where-Object {$_.SKU -eq $sku} | % {Write-Output "$($_.SKU) has quantity $($_.Quantity)"}
}
这将提供以下输出:
one has quantity 1
two has quantity 4
three has quantity 9
我认为有了这个,你可以根据需要做出相应的改变
为了完整起见,我从前面提到的MSDN博客中复制了示例代码:
function Get-ExcelData {
[CmdletBinding(DefaultParameterSetName='Worksheet')]
Param(
[Parameter(Mandatory=$true, Position=0)]
[String] $Path,
[Parameter(Position=1, ParameterSetName='Worksheet')]
[String] $WorksheetName = 'Sheet1',
[Parameter(Position=1, ParameterSetName='Query')]
[String] $Query = 'SELECT * FROM [Sheet1$]'
)
switch ($pscmdlet.ParameterSetName) {
'Worksheet' {
$Query = 'SELECT * FROM [{0}$]' -f $WorksheetName
break
}
'Query' {
# Make sure the query is in the correct syntax (e.g. 'SELECT * FROM [SheetName$]')
$Pattern = '.*from\b\s*(?<Table>\w+).*'
if($Query -match $Pattern) {
$Query = $Query -replace $Matches.Table, ('[{0}$]' -f $Matches.Table)
}
}
}
# Create the scriptblock to run in a job
$JobCode = {
Param($Path, $Query)
# Check if the file is XLS or XLSX
if ((Get-Item -Path $Path).Extension -eq 'xls') {
$Provider = 'Microsoft.Jet.OLEDB.4.0'
$ExtendedProperties = 'Excel 8.0;HDR=YES;IMEX=1'
} else {
$Provider = 'Microsoft.ACE.OLEDB.12.0'
$ExtendedProperties = 'Excel 12.0;HDR=YES'
}
# Build the connection string and connection object
$ConnectionString = 'Provider={0};Data Source={1};Extended Properties="{2}"' -f $Provider, $Path, $ExtendedProperties
$Connection = New-Object System.Data.OleDb.OleDbConnection $ConnectionString
try {
# Open the connection to the file, and fill the datatable
$Connection.Open()
$Adapter = New-Object -TypeName System.Data.OleDb.OleDbDataAdapter $Query, $Connection
$DataTable = New-Object System.Data.DataTable
$Adapter.Fill($DataTable) | Out-Null
}
catch {
# something went wrong :-(
Write-Error $_.Exception.Message
}
finally {
# Close the connection
if ($Connection.State -eq 'Open') {
$Connection.Close()
}
}
# Return the results as an array
return ,$DataTable
}
# Run the code in a 32bit job, since the provider is 32bit only
$job = Start-Job $JobCode -RunAs32 -ArgumentList $Path, $Query
$job | Wait-Job | Receive-Job
Remove-Job $job
}
因此,products.txt是您的主文件,您希望在Excel中查找.txt中每个SKU的所有工作表,并计算它在Excel文件中出现的次数?嘿!否,我想对inventory.xlsx运行prodcuts.txt并返回每个产品的数量。因此,对于.txt中的每一行,您想扫描Excel文档中的所有工作表,并在每张工作表的“数量”列中添加数字?是,但不添加数量。我想看看products.txt中每个项目的数量。谢谢!我会调查一下,让你知道!很好,请标记为答案,以便搜索此问题的其他人看到该问题有解决方案。嘿,为什么我突然发现术语“Get ExcelData”不被识别为cmdlet的名称。我正在使用Powershell v5