【问题标题】:PowerShell DataTable delete empty rowsPowerShell DataTable 删除空行
【发布时间】:2015-03-10 18:38:44
【问题描述】:

我在使用 Excel.Application 对象时偶然发现了一些 (DCOM) 问题。因此,我使用AccessDatabaseEngine_x64 中的OleDbConnectionOleDbCommand 对象重写了读取Excel 文件的函数。所以服务器上不用再安装MS Office了,我觉得也比较靠谱。

它工作得很好,但唯一缺少的是我似乎无法弄清楚如何从函数的输出中删除空行。我知道可以通过使用$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)"
    }
}

感谢您的帮助。

【问题讨论】:

    标签: excel powershell


    【解决方案1】:

    同时为遇到相同问题的任何人找到答案:

    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)"
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      相关资源
      最近更新 更多