2012-05-05 57 views
0

使用Excel 2010 OleDb driver和一個OleDbConnection我可以查詢和操作工作表和命名區域在電子表格中,像這樣:如何使用OLEDB查詢excel列表或表格?

$cn = New-Object System.Data.OleDb.OleDbConnection $cnStr; 
$cmd = $cn.CreateCommand() 

$cmd.CommandText = "INSERT INTO [Some Named Range] (" + 
@" 
    [Name], [Description], 
    [Type], [Val], 
) VALUES(
    'Justin', 'A Programmer', 
    'Senor Developer', 11 
)"@ 
$cmd.ExecuteNonQuery(); 

$cmd.CommandText = "SELECT * FROM [Some WorkSheet$]" 
$rdr = $cmd.ExecuteReader(); 
[PSObject[]] $data = [PSObject[]]@(); 
while ($rdr.Read()) { 
    $row = @{}; 0..($rdr.FieldCount-1) | %{$row[$rdr.GetName($_)] = $rdr[$_]; } 
    $data += New-Object PSObject -Property $row; 
} 

然而,最新的命名約定的表,這是refered爲Excel 2003中的列表?

回答

0

你根本無法與OLEDB或ODBC驅動程序做到這一點。

0

你必須使用的ListObject /表的地址:

Dim Table as Excel.ListObject 
dim TableAddress as String 

Set Table = Worksheets("Some Worksheet").ListObjects("SomeTable") 
TableAddress = Table.Range.Address(RowAbsolute:=False,ColumnAbsolute:=False) 
... 
$cmd.CommandText = "SELECT * FROM [Some WorkSheet$" TableAddress & "]" 
+0

我想從OleDb這樣做,而不是Excel COM互操作。我不希望Excel生成此文件的服務器上安裝,只是[Microsoft Access數據庫引擎2010年可再發行組件](http://www.microsoft.com/en-us/download/details.aspx?id=13255)。 –

+0

對。假設命名約定是相同的,我不認爲你可以通過名稱來引用表,即使你可以到一個範圍。我認爲你必須使用地址。在我的答案中,即使在Excel中,還有一件事情是錯誤的,即地址必須是相對的,即沒有美元符號。 –