2013-05-17 110 views
2

使用PowerShell我想捕獲用戶輸入,將輸入與Excel電子表格中的數據進行比較,並將相應單元格中的數據寫入變量。我對PowerShell相當陌生,似乎無法弄清楚這一點。例如:將提示用戶輸入「123」。然後將輸入與列A中的數據進行比較。捕獲相應單元格中的數據並將其寫入變量,例如$ GoLiveDate。使用Powershell讀取Excel數據並寫入變量

任何幫助將不勝感激。

示例數據:http://reddirttechnology.com/table.html

回答

11

用戶輸入可以讀取這樣的:

$num = Read-Host "Store number" 

Excel可以像這樣進行處理:

$xl = New-Object -COM "Excel.Application" 
$xl.Visible = $true 
$wb = $xl.Workbooks.Open("C:\path\to\your.xlsx") 
$ws = $wb.Sheets.Item(1) 

尋找一個值在一列和分配從另一列到變量的相應值可以這樣完成:

for ($i = 1; $i -le 3; $i++) { 
    if ($ws.Cells.Item($i, 1).Value -eq $num) { 
    $GoLiveDate = $ws.Cells.Item($i, 2).Value 
    break 
    } 
} 

大功告成後,不要忘了clean up

$wb.Close() 
$xl.Quit() 
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl) 
+1

無法設置Value屬性的類型PSMemberInfo對象「System.Management.Automation.PSParameterizedProperty」。 At line:7 char:30 + if($ ws.Cells.Item($ i,1)。<<<< Value = $ num){ + CategoryInfo:InvalidOperation:(:) [],RuntimeException + FullyQualifiedErrorId:PropertyAssignmentException 這就是我所得到的。 – squishy79

+0

我的錯誤。 PowerShell中的比較運算符是'-eq',而不是'='。固定。 –

+1

This Works!我發現閱讀excel文件是非常緩慢的。在做一些研究之後,使用Import-CSV cmdlet讀取CSV顯然會更快。我知道如何用引用的cmdlet調用CSV文件。我將如何接受用戶輸入並從CSV文件中提取相應的數據? – squishy79

2

我覺得最好使用OLEDB連接與Excel交互。它比COM interop更快並且比import-csv更少出錯。您可以準備一組psobjects(一個psobject是一行,每個屬性對應一列)以匹配您所需的目標網格並將其插入到Excel文件中。同樣,您可以插入一個DataTable而不是PSObject集合,但除非從一些數據源檢索數據開始,否則PSObject收集方式通常更容易。

這裏是一個功能我用寫psobject收集到Excel:

function insert-OLEDBData ($file,$sheet,$ocol) { 

    { 
     "xlsb$" 
      {"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$File`";Extended Properties=`"Excel 12.0;HDR=YES;IMEX=1`";"} 
     "xlsx$" 
      {"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$File`";Extended Properties=`"Excel 12.0 Xml;HDR=YES;IMEX=1`";"} 
    } 
    $OLEDBCon = New-Object System.Data.OleDb.OleDbConnection($cs) 

    $hdr = $oCol|gm -MemberType NoteProperty|%{$_.name} 

    $names = '[' + ($hdr-join"],[") + ']' 
    $vals = (@("?")*([array]$hdr).length)-join',' 

    $sql = "insert into [$sheet`$] ($names) values ($vals)" 

    $sqlCmd = New-Object system.Data.OleDb.OleDbCommand($sql) 
    $sqlCmd.connection = $oledbcon 

    $cpary = @($null)*([array]$hdr).length 

    $i=0 
    [array]$hdr|%{([array]$cpary)[$i] = $sqlCmd.parameters.add($_,"VarChar",255);$i++} 
    $oledbcon.open() 

    for ($i=0;$i-lt([array]$ocol).length;$i++) 
    { 
     for ($k=0;$k-lt([array]$hdr).length;$k++) 
     { 
      ([array]$cpary)[$k].value = ([array]$oCol)[$i].(([array]$hdr)[$k]) 
     } 
     $res = $sqlCmd.ExecuteNonQuery() 
    } 
    $OLEDBCon.close() 

} 
0

我發現這一點,葉夫根尼·的答案。爲了使其工作,我必須對上述功能做一些小的改動。最值得注意的是輸入數組中空值或空值的處理。這裏是葉夫根尼·代碼有一些小的變化:

function insert-OLEDBData { 
    PARAM (
     [Parameter(Mandatory=$True,Position=1)] 
     [string]$file, 
     [Parameter(Mandatory=$True,Position=2)] 
     [string]$sheet, 
     [Parameter(Mandatory=$True,Position=3)] 
     [array]$ocol 
    ) 
    $cs = Switch -regex ($file) 
    { 
     "xlsb$" 
      {"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$File`";Extended Properties=`"Excel 12.0;HDR=YES`";"} 
     "xlsx$" 
      {"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$File`";Extended Properties=`"Excel 12.0 Xml;HDR=YES`";"} 
    } 
    $OLEDBCon = New-Object System.Data.OleDb.OleDbConnection($cs) 

    $hdr = $oCol | Get-Member -MemberType NoteProperty,Property | ForEach-Object {$_.name} 

    $names = '[' + ($hdr -join "],[") + ']' 
    $vals = (@("?")*([array]$hdr).length) -join ',' 

    $sql = "insert into [$sheet`$] ($names) values ($vals)" 

    $sqlCmd = New-Object system.Data.OleDb.OleDbCommand($sql) 
    $sqlCmd.connection = $oledbcon 

    $cpary = @($null)*([array]$hdr).length 

    $i=0 
    [array]$hdr|%{([array]$cpary)[$i] = $sqlCmd.parameters.add($_,"VarChar",255);$i++} 
    $oledbcon.open() 

    for ($i=0;$i -lt ([array]$ocol).length;$i++) 
    { 
     for ($k=0;$k -lt ([array]$hdr).length;$k++) 
     { 
      IF (([array]$oCol)[$i].(([array]$hdr)[$k]) -notlike "") { 
       ([array]$cpary)[$k].value = ([array]$oCol)[$i].(([array]$hdr)[$k]) 
      } ELSE { 
       ([array]$cpary)[$k].value = "" 
      } 
     } 
     $res = $sqlCmd.ExecuteNonQuery() 
    } 
    $OLEDBCon.close() 
}