2013-05-17 65 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() 
}