【问题标题】:powershell excel access without installing Excel无需安装Excel即可访问powershell excel
【发布时间】:2013-11-29 11:02:41
【问题描述】:

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

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

我是否遗漏了一些明显的东西?

【问题讨论】:

    标签: excel powershell


    【解决方案1】:

    在此处查看 Scripting Guy 的详细文章。您必须在 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 为 PowerShell 设置 EPPlus。

      以下代码创建一个包含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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多