在 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
我有下面的代码导入一个 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