powershell 从循环中逐行写入Excel文件-仅写入最后一行

m4pnthwp  于 11个月前  发布在  Shell
关注(0)|答案(1)|浏览(130)

我们的目标是能够把一个杂乱的电子邮件列表中不需要的字符和修剪下来,然后把它写到一个电子表格上做一些其他的工作。我迭代了一个文本文件,做修剪工作,然后逐行写结果。
作为参考,当不包括excel com对象并且仅使用Out-File时,这可以正常工作:

$untrimmedEmails = 'S:\PS_Scripts\Data\trimEmails.txt'
foreach ($line in Get-Content $untrimmedEmails) {
    $row = 1
    $newLine = $line.Split(':')[1]
    Out-File -FilePath .\Notes\trimResults.txt -InputObject $newLine.trimEnd('>') -Encoding ASCII -Append
    $row++
}

字符串
但是,当尝试使用excel com对象写入每个单元格时,这个微小的更改只会导致最后一行的输出:

$untrimmedEmails = 'S:\PS_Scripts\Data\trimEmails.txt'
& {
    $excel = New-Object -ComObject Excel.Application
    $wb = $excel.Workbooks.Open('S:\PS_Scripts\Data\Leavers.xlsx')
    $ws = $wb.WorkSheets.Add()
    foreach ($line in Get-Content $untrimmedEmails) {
        $row = 1
        $newLine = $line.Split(':')[1]
        $ws.cells.item($row, 1).Value2 = $newLine.TrimEnd('>')
        $row++
    }
    $wb.SaveAs($CSVImportFile, 6)
    $wb.Close()
    $excel.Quit()
}
[GC]::Collect()


有什么想法是出了问题吗?我的印象是,循环工作正常,因为我看到写的最后一行.

pvabu6sv

pvabu6sv1#

$row的初始赋值移出循环-否则您将在每次迭代时重置行偏移量:

$untrimmedEmails = 'S:\PS_Scripts\Data\trimEmails.txt'
& {
    $excel = New-Object -ComObject Excel.Application
    $wb = $excel.Workbooks.Open('S:\PS_Scripts\Data\Leavers.xlsx')
    $ws = $wb.WorkSheets.Add()
    # initialize row offset before entering the loop
    $row = 1
    foreach ($line in Get-Content $untrimmedEmails) {
        $newLine = $line.Split(':')[1]
        $ws.cells.item($row, 1).Value2 = $newLine.TrimEnd('>')
        $row++
    }
    $wb.SaveAs($CSVImportFile, 6)
    $wb.Close()
    $excel.Quit()
}
[GC]::Collect()

字符串

相关问题