在 PowerShell 数据挖掘中根据条件导出 .xlsx 文件

Export .xlsx file based on conditions in PowerShell data mining

我有下面的代码导入一个 Excel 文件,然后将工作簿导出到一个 sheet:

$sheets = (Get-ExcelSheetInfo -Path 'C:\TEMP\Template\TemplateName.xlsx').Name 
$i = 1
foreach ($sheet in $sheets) {
    Import-Excel -WorksheetName $sheet -Path 'C:\TEMP\Template\TemplateName.xlsx' -StartRow 5 -HeaderName 'Property','Current settings','Proposed settings' | Export-Excel -Path C:\Temp\Template\Changes.xlsx -AutoSize
    Write-Progress -Activity "Generating Changes" -Status "Worksheet $i of $($sheets.Count) completed" -PercentComplete (($i / $sheets.Count) * 100)  
    $i++
}

上面代码的问题在于它先输出xlsx文件的最后一行,然后再反向输出。我想保持导入文件的原始顺序。

其次,我一直在尝试不同的方法来将列分配给 PS 对象并使用 Where-Object 来过滤输出,但无法弄清楚。

我想做的是,如果“当前设置”列为空或与“建议设置”列中的文本不匹配,则将该行保留在导出之外。本质上,我只想填写“当前设置”不为空且 -notmatch“建议设置”的行。

我在你的代码中看到的问题是,除了不过滤 Current settings 列之外,你在每次迭代时输出到你的 Excel 文件你的外循环,因此,你正在替换最后一个工作表内容的输出(这是因为你没有使用 -Append 开关)。

然而,正确有效的方法是先在内存中生成您想要的输出,然后将其输出到文件一次(这始终适用,而不是附加到文件文件适合内存).

$param = @{
    Path       = 'C:\TEMP\Template\TemplateName.xlsx'
    StartRow   = 5
    HeaderName = 'Property', 'Current settings', 'Proposed settings'
}

# foreach worksheet in this file
Get-ExcelSheetInfo -Path 'C:\TEMP\Template\TemplateName.xlsx' | ForEach-Object {
    # set the worksheetname name in $param
    $param['WorksheetName'] = $_.Name
    # import the worksheet and enumerate it
    foreach($line in Import-Excel @param) {
        $currSettings = $line.'Current settings'
        $propSettings = $line.'Proposed settings'
        # if the value of 'Current settings' cell is equal to the value of
        # 'Proposed settings' cell OR is empty / white spaces, skip it, go to next iteration
        if($currSettings -eq $propSettings -or [string]::IsNullOrWhiteSpace($currSettings)) {
            continue
        }
        # if we're here, condition before this was not true, hence we want to
        # output this line
        $line
    }
} | Export-Excel -Path C:\Temp\Template\Changes.xlsx -AutoSize