0

PowerShell スクリプトで読み取り、ダウン ストリーム プロセスのデータを抽出できる「名簿」スプレッドシートを設計するという単純なビジネス要件があります。スプレッドシートには、FirstName、LastName、Company、StartDate などのヘッダーがあります。これらのヘッダーは A1 から始まり、J1 まで続きます。スプレッドシートは 2007 (xlsm) で、書式設定されたテーブル (DataTable?) を含む 1 つのワークシートが含まれています。DataTable の右側には、NumberOfRecords や ContactInfo などのいくつかのフィールドがあります。

これまでの PowerShell スクリプトは、DataTable が最初の列/行である限り正常に機能します。NumberOfRecords & ContactInfo フィールドを上または左に切り替えると、レコードの読み取り順序全体が乱れます。

以下は現在のスクリプトです

function getData {
$excelPath = "c:\temp\Roster.xlsm"
$global:roster = @()

$conn = new-object System.Data.OleDb.OleDbConnection
$conn.ConnectionString = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source='+$excelPath+';Extended Properties="Excel 12.0 Xml;HDR=YES";'

$cmd = new-object System.Data.OleDb.OleDbCommand("SELECT * FROM [Roster$] WHERE [Valid] = true",$conn)
$conn.open()

$reader = $cmd.ExecuteReader()
while ($reader.Read())
{
    $user = new-object object
    $user | add-member -MemberType NoteProperty -Name "FirstName" -Value $reader.item(1).ToString()
    $user | add-member -MemberType NoteProperty -Name "MName" -Value $reader.item(2).ToString()
    $user | add-member -MemberType NoteProperty -Name "LastName" -Value $reader.item(3).ToString()
    $user | add-member -MemberType NoteProperty -Name "Company" -Value $reader.item(6).ToString()
    $user | add-member -MemberType NoteProperty -Name $reader.GetName(8) -Value $reader.item(8).ToString()
    $global:roster += $user
}

$conn.close()

$global:roster | out-gridview
#
}

この DataTable を直接参照する方法はありますか? Excel 2010 では、データをテーブルとしてフォーマットするときに、名前を付けることができることを知っています (デフォルトの Table1)。次のようなことができますか"SELECT Table1.* FROM [Roster$] WHERE [VALUE] = true"??

私の目標は、適切にフォーマットされたスプレッドシートを提供し、Powershell を介してフォーマットされたテーブルからデータを抽出することです。

4

1 に答える 1

0

解決策を見つけましたが、OLEDB または ADO の代わりに COM を使用する必要があります。名前付きオブジェクトを呼び出すために、OLE を使用してオンラインで解決策を見つけることができませんでした。ワークシートのどこにでも DataTable を配置できるため、このソリューションは少し優れていますが、Office をインストールする必要があるため、あまり好きではありませんが、基本的には、Excel オブジェクトを作成して名前付きテーブルへの参照を呼び出すことができます。次に、ActiveSheet で ListObjects を呼び出します。これは、すべての列/行/範囲を含む DataTable を返します。あとは、各行と列をループしてデータを取得するだけです。

$excel = new-object -ComObject Excel.Application
$tmp = $excel.Workbooks.Open('c:\temp\Roster.xlsm')
$table = $excel.ActiveSheet.ListObjects | where-object { $_.DisplayName -eq "MyNamedRange" }    
$rows = $table.ListRows
于 2012-05-15T19:55:25.477 に答える