2016-03-18 9 views
1

私は、複数のシートを持つExcelファイルを持ち、その中にSKUと数量の列が挿入されています。ワークブック全体を複数の項目で検索し、その数量を返す必要があります。 products.txtにはスキューIDが含まれています。複数の項目をExcelで検索して全体を返します

ABC1234 
BCDH214 
LDJI983 

そして、Excelワークブック、inventory.xlsxは、次の列に私がinventory.xlsxに対してprodcuts.txt実行し、各製品の数量を返したい

**sku**     ***Quantity*** 
ABC1234      2 
BCDH214      0  
LDJI983      1 

が含まれています。

これはpowershellで行うことができますか?この種のクエリを実行するための他の方法はありますか?

+0

だから、 'products.txt'はあなたのメインのファイルで、あなたは(Excelで見てみたいがすべてのシート)を「.txt」内の各SKUごとにチェックし、それがExcelファイルに表示される回数を数えますか? – BruceWayne

+0

ちょっと!いいえ、私はinventory.xlsxに対してprodcuts.txtを実行して、各製品の数量を返したいと思います。 –

+0

したがって、 '.txt'の各行について、Excelのドキュメント内のすべてのシートをスキャンし、各シートにある可能性のある「数量」列の数値を加算しますか? – BruceWayne

答えて

1

ここに示すコードGet Excel data without Excelを使用して、ACE.OLEDB providerがインストールされていることを確認してください。

私はシンプルなXLSXを作成しました。その後、私はExcelに呼ば

SKU Quantity 
one 1 
two 4 
three 9 

:これは、次のように出力できます

$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 
} 
+0

ありがとう!私はそれを見てあなたに知らせるでしょう! –

+0

私たちはすでに上記の作品を知っています。あなたに何を提供できるかわからない... –

+0

これで問題は解決しましたか? –

関連する問題