Объединить содержимое нескольких файлов Excel в один с помощью PowerShell - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть несколько файлов Excel с разными именами в пути.

например. C:\Users\XXXX\Downloads\report

Каждый файл имеет фиксированное количество столбцов.

например. Date | Downtime | Response

Я хочу создать новый файл Excel с объединением всех данных Excel. Новый столбец должен быть добавлен с именем клиента, в котором я хочу ввести имя файла. Затем данные каждого файла Excel добавляются ниже одного за другим.

например. Client name | Date | Downtime | Response

Ниже кода можно добавить все данные Excel, но теперь нужно добавить столбец Имя клиента.

$path = "C:\Users\XXXX\Downloads\report"

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

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

#Loop through files, opening each, selecting the Used range, and only grabbing the first 5 columns of it. Then find next available row on the destination worksheet and paste the data
ForEach($File in $Files)
{
    $Source = $Excel.Workbooks.Open($File.FullName,$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","E$(($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","E$(($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("$path\Merge.xls")
$Dest.close()
$Excel.Quit()

Предложите любой эффективный способ сделать это. Пожалуйста, предоставьте ссылки, если таковые имеются.

Конвертировать XLS в XLSX:

$xlFixedFormat = [Microsoft.Office.Interop.Excel.XlFileFormat]::xlWorkbookDefault
$excel = New-Object -ComObject excel.application
$excel.visible = $true
$folderpath = "C:\Users\xxxx\Downloads\report\*"
$filetype ="*xls"
Get-ChildItem -Path $folderpath -Include $filetype | 
ForEach-Object `
{
    $path = ($_.fullname).substring(0,($_.FullName).lastindexOf("."))
    "Converting $path to $filetype..."
    $workbook = $excel.workbooks.open($_.fullname)

    $workbook.saveas($path, $xlFixedFormat)
    $workbook.close()
}
$excel.Quit()
$excel = $null
[gc]::collect()
[gc]::WaitForPendingFinalizers()

1 Ответ

1 голос
/ 10 апреля 2019

Если вы хотите использовать внешний модуль Import-Excel, вы можете просто просмотреть файлы следующим образом:

$report_directory = ".\reports"

$merged_reports = @()

# Loop through each XLSX-file in $report_directory
foreach ($report in (Get-ChildItem "$report_directory\*.xlsx")) {

    # Loop through each row of the "current" XLSX-file
    $report_content = foreach ($row in Import-Excel $report) {
        # Create "custom" row
        [PSCustomObject]@{
            "Client name" = $report.Name
            "Date"        = $row."Date"
            "Downtime"    = $row."Downtime"
            "Response"    = $row."Response"
        }
    }

    # Add the "custom" data to the results-array
    $merged_reports += @($report_content)
}

# Create final report
$merged_reports | Export-Excel ".\merged_report.xlsx"

Обратите внимание, что этот код не оптимизирован с точки зрения производительности, но он должен позволить вам начать работу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...