没有安装Excel的PowerShell Excel的访问

我需要能够从Powershell读取现有(受密码保护的)Excel电子表格(.xlsx文件) – 但我不想安装Excel。 我发现的每种方法都假定Excel安装在运行脚本的工作站上。

我试过Excel查看器,但似乎没有工作; 它不会正确调用。 我已经看过其他的解决scheme,但他们似乎都想更新Excel电子表格,我希望我不必走得太远。

我错过了什么明显的?

请参阅脚本专家的详细文章。 您必须在PowerShell脚本中使用经典的COM ADO。

嘿,脚本专家! 如何在不使用Excel的情况下从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文件是受密码保护的。

根据这篇Microsoft支持文章 ,您无法使用OLEDB连接打开密码保护的Excel文件。

从文章:

在连接选项卡上浏览到您的工作簿文件。 忽略“用户名”和“密码”条目,因为这些条目不适用于Excel连接。 (您无法打开受密码保护的Excel文件作为数据源。本文稍后会介绍有关此主题的更多信息。

如果您没有安装Excel, EPPlus是我知道的从PowerShell访问Excel文件的最佳解决scheme。 参考我的答案在这里设置EPPlus的PowerShell。

以下代码创build一个密码保护的Excel文件,其中包含Get-Process的输出,然后从受密码保护的文件读取进程信息:

 # 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 

请参阅我的答案在这里更多的选项来保护Excel文件。