2013-11-15 51 views
1

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

我试过Excel查看器,但它似乎不工作;它不会正确调用。我已经看过其他解决方案在stackoverflow,但他们似乎都想更新Excel电子表格,我希望我不必走那么远。

我错过了一些明显的东西吗?

回答

4

查看来自的详细文章脚本专家 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文件作为数据 来源。有关于这个主题以后这个 文章中的更多信息。)

2

如果你没有安装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文件。