2013-11-15 3 views
1

Powershell에서 기존 (암호로 보호 된) Excel 스프레드 시트 (.xlsx 파일)를 읽을 수 있어야하지만 Excel을 설치하고 싶지 않습니다. 내가 찾은 모든 접근 방식은 스크립트가 실행되는 워크 스테이션에 Excel이 설치되어 있다고 가정합니다.powershell Excel을 설치하지 않고도 엑세스 가능

Excel 뷰어를 사용해 보았지만 작동하지 않는 것 같습니다. 제대로 호출되지 않습니다. stackoverflow에서 다른 솔루션을 살펴 보았습니다. 그러나 이들 모두는 Excel 스프레드 시트를 업데이트하려는 것으로 보이며, 지금까지 그렇게 할 필요가 없기를 희망합니다.

나는 분명한 뭔가를 놓치고 있습니까?

답변

4

자세한 내용은 에서 Scripting Guy을 참조하십시오. Powershell 스크립트에서 고전적인 COM ADO를 사용해야합니다.

Hey, Scripting Guy! How Can I Read from Excel Without Using Excel?

관련 파워 쉘 코드 조각 :

$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() 

말했다, 당신은 당신의 엑셀 파일 암호로 보호 것을 주장했다.

this Microsoft Support article에 따르면 OLEDB 연결을 사용하여 암호로 보호 된 Excel 파일을 열 수 없습니다. 기사에서

: 연결 탭에서

, 통합 문서 파일을 찾습니다. " ID"및 "암호"항목은 Excel 연결에 적용되지 않으므로 무시하십시오. (당신은 데이터 소스로 암호로 보호 된 Excel 파일을 열 수 없습니다. 나중에 기사에서이 주제에 대한 자세한 정보가 있습니다.)

당신은 Excel이 설치되어 있지 않은 경우
2

EPPlus 최고의 솔루션입니다 PowerShell에서 Excel 파일에 액세스하는 방법을 알고 있습니다. PowerShell 용 EPPlus를 설치하려면 내 대답 here을 참조하십시오.

다음 코드는 Get-Process의 출력을 포함하는 Excel 파일을 보호 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 

은 Excel 파일을 보호하기 위해 더 많은 옵션에 대한 내 대답 here 참조를 .

관련 문제