8

PowerShell を使用して、ユーザー入力をキャプチャし、入力を Excel スプレッドシートのデータと比較して、対応するセルのデータを変数に書き込みたいと考えています。私は PowerShell にかなり慣れていないため、これを理解できないようです。例: ユーザーは店舗番号の入力を求められ、「123」と入力します。次に、入力が列 A のデータと比較されます。対応するセルのデータがキャプチャされ、$GoLiveDate などの変数に書き込まれます。

どんな助けでも大歓迎です。

サンプル データ: http://reddirttechnology.com/table.html

4

4 に答える 4

17

ユーザー入力は次のように読み取ることができます。

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

完了したら、クリーンアップすることを忘れないでください。

$wb.Close()
$xl.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl)
于 2013-05-17T20:36:00.563 に答える
2

OleDB 接続を使用して Excel とやり取りする方が望ましいと思います。COM 相互運用よりも高速で、import-csv よりもエラーが発生しにくいです。psobjects のコレクション (1 つの psobject が 1 つの行で、各プロパティが列に対応する) を準備して、目的のターゲット グリッドに一致させ、それを Excel ファイルに挿入することができます。同様に、PSObject コレクションの代わりに DataTable を挿入することもできますが、何らかのデータ ソースからデータを取得することから始めない限り、通常は 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()

}
于 2014-01-08T18:06:00.813 に答える