用Powershell读取Excel数据并写入一个variables

使用PowerShell我想要捕获用户input,将input与Excel电子表格中的数据进行比较,并将相应单元格中的数据写入variables。 我对PowerShell相当陌生,似乎无法弄清楚这一点。 例如:提示用户input“123”。 然后将input与列A中的数据进行比较。捕获相应单元格中的数据并将其写入variables,例如$ GoLiveDate。

任何帮助将不胜感激。

示例数据: http : //reddirttechnology.com/table.html

用户input可以这样读取:

$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) 

在一列中查找一个值,并将另一列的对应值赋值给一个variables,可以这样做:

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

完成后请不要忘记清理 :

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

我发现最好使用OleDB连接与Excel进行交互。 它比COM interop更快,比import-csv更less出错。 您可以准备一个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() } 

我find了这个,Yevgeniy的回答。 为了使其工作,我必须对上述function做一些小的改动。 最值得注意的是input数组中空值或空值的操作。 Yevgeniy的代码有一些小的改变:

 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() }