使用PowerShell将多个工作簿复制到一个工作簿中

时间:2018-06-15 15:11:30

标签: powershell

我正在尝试将多个excel工作簿复制到单个excel工作簿中,但是当我有35个时,它只复制了6个列。

#Get a list of files to copy from
   $Files = GCI 'C:\Users\bob\Desktop\Und' | ?{$_.Extension -Match "xlsx?"} |    select -ExpandProperty FullName

  #Launch Excel, and make it do as its told (supress confirmations)
  $Excel = New-Object -ComObject Excel.Application
  $Excel.Visible = $True
  $Excel.DisplayAlerts = $False

  #Open up a new workbook
  $Dest = $Excel.Workbooks.Add()


 `enter code here` ForEach($File in $Files[0..4]){
    $Source = $Excel.Workbooks.Open($File,$true,$true)
    If(($Dest.ActiveSheet.UsedRange.Count -eq 1) -and ([String]::IsNullOrEmpty  ($Dest.ActiveSheet.Range("A1").Value2))){ #If there is only 1 used cell and it is blank select A1
        [void]$source.ActiveSheet.Range("A1","F$(($Source.ActiveSheet.UsedRange.Rows|Select -Last 1).Row)").Copy()
        [void]$Dest.Activate()
        [void]$Dest.ActiveSheet.Range("A1").Select()}
     Else{ #If there is data go to the next empty row and select Column A
        [void]$source.ActiveSheet.Range("A2","F$(($Source.ActiveSheet.UsedRange.Rows|Select -Last 1).Row)").Copy()
        [void]$Dest.Activate()
        [void]$Dest.ActiveSheet.Range    ("A$(($Dest.ActiveSheet.UsedRange.Rows|Select -last 1).row+1)").Select()}
    [void]$Dest.ActiveSheet.Paste()
    $Source.Close()}
    $Dest.SaveAs("C:\Users\bob\Desktop\Und\combo\Combined.xlsx",51)
    $Dest.close()
    $Excel.Quit()

1 个答案:

答案 0 :(得分:0)

具有优秀PoserShell模块ImportExcel(使用PowerShell 5或更高版本)的解决方案

首先,安装模块:

    管理员PowerShell控制台中的
  • Install-Module -Name ImportExcel
  • 在非管理员PowerShell控制台中:Install-Module -Name ImportExcel -Scope CurrentUser

然后,使用以下代码:

$source      = 'C:\Users\bob\Desktop\Und'
$destination = 'C:\Users\bob\Desktop\Und\combo\Combined.xlsx'
$fileList    = Get-ChildItem -Path $source -Filter '*.xlsx'
foreach ($file in $fileList) {
    $fileContent = Import-Excel -Path $file.FullName
    $excelParameters = @{
        Path          = $destination 
        WorkSheetname = 'Combined'
    }

    if ((Test-Path -Path $destination) -and (Import-Excel @excelParameters)) {
        $excelParameters.Append = $true
    }

    $fileContent | Export-Excel @excelParameters
}

此代码假定您的所有Excel源文件具有相同的标题,并且您希望所有数据都在同一个工作表中。但可以适应其他情况。