2015-03-09 4 views
0

Я столкнулся с некоторыми проблемами (DCOM) при использовании объекта Excel.Application. Поэтому я переписал свою функцию для чтения файлов Excel с помощью объектов OleDbConnection и OleDbCommand, доступных в пределах AccessDatabaseEngine_x64. Поэтому нет необходимости устанавливать MS Office на сервере, и я думаю, что это также более надежно.PowerShell DataTable удаляет пустые строки

Это работает отлично, но единственное, чего не хватает, это то, что я не могу понять, как удалить пустые строки с выхода функции. Я знаю, что это можно сделать, используя $DataTable[0].Delete(), но я не знаю, как определить, является ли полная строка пустой. Поскольку он может варьироваться в зависимости от ввода.

пример XLSX-файла:

Name  | Sir name 
Bob Lee | Swagger 
     | 
Jake  | Thornton 

В приведенном выше примере, я хотел бы иметь выход только 2 (или 3 линии в зависимости от переключателя $Header), но я не хочу видеть пустая строка на выходе.

Я нашел solution на другом языке, но я не могу перевести его в PowerShell.

Код:

Function Import-Excel { 
    [CmdletBinding()] 
    Param (
     [parameter(Mandatory=$true,Position=0)] 
     [ValidateScript({Test-Path $_ -PathType Leaf})] 
     [String]$FileName, 
     [parameter(Mandatory=$true,Position=1)] 
     [String]$WorksheetName, 
     [Switch]$Header 
    ) 

    Begin { 
     # We can't read open XLSX-Files 
     Copy-Item -LiteralPath $FileName -Destination $env:TEMP 
    } 

    Process { 
     $OleDbConnection = New-Object 'System.Data.OleDb.OleDbConnection' 
     $OleDbCommand = New-Object 'System.Data.OleDb.OleDbCommand' 
     $ConnString = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=' 
     $ConnString += "$env:TEMP\$(Split-Path $FileName -Leaf)" 

     if ($header) { 
      $ConnString += ';Extended Properties="Excel 12.0;HDR=YES;IMEX=1";' 
     } 
     else { 
      $ConnString += ';Extended Properties="Excel 12.0;HDR=NO;IMEX=1";' 
     } 

     $OleDbConnection.ConnectionString = $ConnString 
     $OleDbConnection.Open() 

     $OleDbCommand.Connection = $OleDbConnection 
     $OleDbCommand.CommandText = "SELECT * FROM [$WorksheetName$]" 

     $OleDbAdapter = New-Object "System.Data.OleDb.OleDbDataAdapter" 
     $OleDbAdapter.SelectCommand = $OleDbCommand 

     $DataTable = New-Object "System.Data.DataTable" 
     $OleDbAdapter.Fill($DataTable) 

     $OleDbConnection.Close() 
     Write-Output $DataTable 
    } 
    End { 
     Remove-Item "$env:TEMP\$(Split-Path $FileName -Leaf)" 
    } 
} 

Спасибо за вашу помощь.

ответ

0

нашел ответ в то же время, для тех, кто сталкиваются с теми же проблемами:

Function Import-Excel { 
    [CmdletBinding()] 
    Param (
     [parameter(Mandatory=$true,Position=0)] 
     [ValidateScript({Test-Path -LiteralPath $_ -PathType Leaf})] 
     [String]$FileName, 
     [parameter(Mandatory=$true,Position=1)] 
     [String]$WorksheetName, 
     [Switch]$Header 
    ) 

    Begin { 
     # We can't read open XLSX-Files 
     Copy-Item -LiteralPath $FileName -Destination $env:TEMP 
    } 

    Process { 
     $OleDbConnection = New-Object 'System.Data.OleDb.OleDbConnection' 
     $OleDbCommand = New-Object 'System.Data.OleDb.OleDbCommand' 
     $OleDbAdapter = New-Object 'System.Data.OleDb.OleDbDataAdapter' 
     $DataTable  = New-Object 'System.Data.DataTable' 

     $ConnString = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=' 
     $ConnString += "$env:TEMP\$(Split-Path $FileName -Leaf)" 

     if ($header) { 
      $ConnString += ';Extended Properties="Excel 12.0;HDR=YES;IMEX=1";' 
     } 
     else { 
      $ConnString += ';Extended Properties="Excel 12.0;HDR=NO;IMEX=1";' 
     } 

     $OleDbConnection.ConnectionString = $ConnString 
     $OleDbConnection.Open() 

     $OleDbCommand.Connection = $OleDbConnection 
     $OleDbCommand.CommandText = "SELECT * FROM [$WorksheetName$]" 

     $OleDbAdapter.SelectCommand = $OleDbCommand 
     $OleDbAdapter.Fill($DataTable) 

     $OleDbConnection.Close() 

     # Remove empty lines 
     $Columns = $DataTable.Columns.Count 
     $Rows = $DataTable.Rows.Count 

     for ($r = 0; $r -lt $Rows; $r++) {  
      $Empty = 0 
      for ($c = 0; $c -lt $Columns; $c++) { 

       if ($DataTable.Rows[$r].IsNull($c)) { 
        $Empty++ 
       } 
      } 
      if ($Empty -eq $Columns) { 
       # Mark row for deletion: 
       $DataTable.Rows[$r].Delete() 
      } 
     } 
     # Delete marked rows: 
     $DataTable.AcceptChanges() 

     Write-Output $DataTable 
    } 

    End { 
     Remove-Item "$env:TEMP\$(Split-Path $FileName -Leaf)" 
    } 
} 
Смежные вопросы