powershell excel访问而无需安装Excel

时间:2013-11-15 22:07:46

标签: excel powershell

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

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

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

2 个答案:

答案 0 :(得分:4)

请在此处查看脚本专家中的详细文章。您必须在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文件作为数据打开   资源。有关此主题的更多信息,请参见后面的内容   制品。)

答案 1 :(得分:2)

如果您没有安装Excel,EPPlus是我所知道的从PowerShell访问Excel文件的最佳解决方案。请参阅我的回答here以设置EPPlus for PowerShell。

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

# 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文件的更多选项,请参阅我的回答here

相关问题