【问题标题】:Selecting specific Excel columns using PowerShell to export to another spreadsheet使用 PowerShell 选择特定的 Excel 列以导出到另一个电子表格
【发布时间】:2021-08-05 22:33:42
【问题描述】:

我收到了特定格式的 Excel 电子表格,其中包含两列具有相同的列标题名称 - 我不需要,但电子表格的格式不会改变,因此我必须解决这两列。

我正在尝试使用 PowerShell 和 Import-Excel 模块仅选择我需要的列,然后导出到新的电子表格,以便 SSIS 进程可以提取它们。

我觉得我快到了,但我的脚本中有一些东西正在导入出于某种原因应该排除的列。查看下面的屏幕截图,它似乎正试图从电子表格中引入标题,我不知道如何解决这个问题。我确实尝试在导出上添加 -NoHeader 标记,但没有奏效。

PS 脚本:

Clear-Host

$SourceFileDirectory = "C:\STLFeeReport\Test\"
$CurrentDate = Get-Date -Format "yyyyMMdd"
$TestFile = "Test2"
$ExcelExt = ".xlsx"

$ExcelFiles = Get-ChildItem $SourceFileDirectory -Filter *.xlsx

foreach ($file in $ExcelFiles)
{

$ImportFile = -JOIN($SourceFileDirectory,$file)
$DestinationFile = -JOIN($SourceFileDirectory,$TestFile,"_",$CurrentDate,$ExcelExt)

Write-Host $ImportFile
Write-Host $DestinationFile

$data = Import-Excel -Path $ImportFile -HeaderName "CompanyID", "CompanyName", "CreateDate", "FileName", "ReferenceNumber" | Select-Object "CompanyID", "CompanyName", "CreateDate", "FileName", "ReferenceNumber"
Write-Host $data

Import-Excel -Path $ImportFile -HeaderName "CompanyID", "CompanyName", "CreateDate", "FileName", "ReferenceNumber" | Select-Object "CompanyID", "CompanyName", "CreateDate", "FileName", "ReferenceNumber" | Export-Excel -Path $DestinationFile | Select-Object "CompanyID", "CompanyName", "CreateDate", "FileName", "ReferenceNumber"

}

原始电子表格中的数据如下所示:

这是脚本运行后数据的样子:

以下是我想要的输出:

【问题讨论】:

    标签: powershell


    【解决方案1】:

    Import-Excel 类似于Import-Csv 将已经识别您的文件的标题,如果您想要相同的标题名称,我认为您不需要指定该参数(-HeaderName)。不过,如果您真的想使用特定的标头,您可以执行类似的操作(注意 -StartRow 2):

    Import-Excel -Header ExampleHeader1, ExampleHeader2, ... -StartRow 2
    

    现在是代码,试一试,我认为它应该可以工作。我还使用-HorizontalAlignment Center 添加了Set-ExcelRange,我认为这是你想要的:)

    $SourceFileDirectory = "C:\STLFeeReport\Test\"
    $CurrentDate = Get-Date -Format "yyyyMMdd"
    $TestFile = "Test2"
    $ExcelExt = ".xlsx"
    
    $ExcelFiles = Get-ChildItem $SourceFileDirectory -Filter *.xlsx
    $headers = 'CompanyID','CompanyName','Dupe1','CreateDate','FileName','Dupe2','ReferenceNumber'
    
    foreach ($file in $ExcelFiles)
    {
        $ImportFile = -JOIN($SourceFileDirectory,$file)
        $DestinationFile = -JOIN($SourceFileDirectory,$TestFile,"_",$CurrentDate,$ExcelExt)
    
        $sheetName = 'ExampleSheet' # => Define the WorkSheet Name here
    
        Write-Host $ImportFile
        Write-Host $DestinationFile
    
        $xlsx = Import-Excel -Path $ImportFile -HeaderName $headers -StartRow 2 |
        Select-Object * -ExcludeProperty Dupe* |
        Export-Excel -Path $DestinationFile -PassThru -WorksheetName $sheetName
        
        $ws = $xlsx.Workbook.Worksheets[$sheetName]
        Set-ExcelRange -HorizontalAlignment Center -Worksheet $ws -Range $ws.Dimension.Address
        Close-ExcelPackage $xlsx
    }
    

    【讨论】:

    • 感谢您的回答 - 但这对我不起作用。当我修改脚本以使用您的代码时,我得到以下信息:“使用工作表导入 Excel 工作簿 'C:\STLFeeReport\Test\Test2.xlsx' 失败:在列中的行 '1' 上找到重复的列标题' 3 6'。列标题必须是唯一的,如果这不是必需的,请使用 '-NoHeader' 或 '-HeaderName' 参数。"
    • @MISNole 你是对的,我的错,我没有看到你有 2 列具有相同的标题名称。我确实更新了我的代码,再试一次,我认为它现在应该可以工作了。
    • Import-Excel -Path $ImportFile -HeaderName $headers -StartRow 2 | Select-Object * -ExcludeProperty Dupe* 应该会给您预期的结果,我重新创建了您的文件,如果您使用 $headers 变量,它就可以工作。
    • 谢谢 - 我必须删除 -PassThru 标签才能让它工作,但它现在按预期工作。
    • @MISNole 乐于提供帮助
    猜你喜欢
    • 2017-03-18
    • 2020-11-05
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2021-07-27
    • 1970-01-01
    相关资源
    最近更新 更多