我需要能夠從Powershell讀取現有(受密碼保護的)Excel電子表格(.xlsx文件) - 但我不想安裝Excel。我找到的每種方法都假設Excel安裝在運行腳本的工作站上。powershell excel訪問沒有安裝Excel
我試過Excel查看器,但它似乎不工作;它不會正確調用。我已經看過其他解決方案在stackoverflow,但他們似乎都想更新Excel電子表格,我希望我不必走那麼遠。
我錯過了一些明顯的東西嗎?
我需要能夠從Powershell讀取現有(受密碼保護的)Excel電子表格(.xlsx文件) - 但我不想安裝Excel。我找到的每種方法都假設Excel安裝在運行腳本的工作站上。powershell excel訪問沒有安裝Excel
我試過Excel查看器,但它似乎不工作;它不會正確調用。我已經看過其他解決方案在stackoverflow,但他們似乎都想更新Excel電子表格,我希望我不必走那麼遠。
我錯過了一些明顯的東西嗎?
查看來自的詳細文章腳本專家 here。您必須在PowerShell腳本中使用經典的COM ADO。
Hey, Scripting Guy! How Can I Read from Excel Without Using Excel?
相關Powershell的摘錄:
$strFileName = "C:\Data\scriptingGuys\Servers.xls"
$strSheetName = 'ServerList$'
$strProvider = "Provider=Microsoft.Jet.OLEDB.4.0"
$strDataSource = "Data Source = $strFileName"
$strExtend = "Extended Properties=Excel 8.0"
$strQuery = "Select * from [$strSheetName]"
$objConn = New-Object System.Data.OleDb.OleDbConnection("$strProvider;$strDataSource;$strExtend")
$sqlCommand = New-Object System.Data.OleDb.OleDbCommand($strQuery)
$sqlCommand.Connection = $objConn
$objConn.open()
$DataReader = $sqlCommand.ExecuteReader()
While($DataReader.read())
{
$ComputerName = $DataReader[0].Tostring()
"Querying $computerName ..."
Get-WmiObject -Class Win32_Bios -computername $ComputerName
}
$dataReader.close()
$objConn.close()
這就是說,你已經指出,您的Excel文件的密碼保護。
根據this Microsoft Support article,您無法使用OLEDB連接打開密碼保護的Excel文件。
從文章:
在連接選項卡,瀏覽到您的工作簿文件。忽略「用戶 ID」和「密碼」條目,因爲這些條目不適用於Excel 連接。 (您不能打開一個密碼保護的Excel文件作爲數據 來源。有關於這個主題以後這個 文章中的更多信息。)
如果你沒有安裝Excel,EPPlus是最好的解決辦法我知道從PowerShell訪問Excel文件。請參閱我的回答here以設置EPPlus for PowerShell。
下面的代碼創建保護的Excel文件,其中包含的Get-Process
輸出一個passwort,然後再回讀密碼保護的文件的進程信息:
# Load EPPlus
$DLLPath = "C:\Windows\System32\WindowsPowerShell\v1.0\Modules\EPPlus\EPPlus.dll"
[Reflection.Assembly]::LoadFile($DLLPath) | Out-Null
$FileName = "$HOME\Downloads\Processes.xlsx"
$Passwort = "Excel"
# Create Excel File with Passwort
$ExcelPackage = New-Object OfficeOpenXml.ExcelPackage
$Worksheet = $ExcelPackage.Workbook.Worksheets.Add("FromCSV")
$ProcessesString = Get-Process | ConvertTo-Csv -NoTypeInformation | Out-String
$Format = New-object -TypeName OfficeOpenXml.ExcelTextFormat -Property @{TextQualifier = '"'}
$null=$Worksheet.Cells.LoadFromText($ProcessesString,$Format)
$ExcelPackage.SaveAs($FileName,$Passwort)
# Open Excel File with Passwort
$ExcelPackage = New-Object OfficeOpenXml.ExcelPackage -ArgumentList $FileName,$Passwort
# Select First Worksheet
$Worksheet = $ExcelPackage.Workbook.Worksheets[1]
# Get Process data from Cells
$Processes = 0..$Worksheet.Dimension.Columns | % {
# Get all Cells in a row
$Row = $Worksheet.Cells[($Worksheet.Dimension.Start.Row+$_),$Worksheet.Dimension.Start.Column,($Worksheet.Dimension.Start.Row+$_),$Worksheet.Dimension.End.Column]
# Join values of all Cells in a row to a comma separated string
($Row | select -ExpandProperty Value) -join ','
} | ConvertFrom-Csv
請參閱我的回答here了更多的選擇,以保護Excel文件。