Переименуйте несколько листов и несколько файлов с помощью powershell - PullRequest
2 голосов
/ 13 июля 2020

Извините за плохой английский sh Я француз.

Я новичок в Powershell, и я хотел переименовать весь свой рабочий лист в нескольких файлах. Пока что у меня есть этот код, который переименовывает все файлы в каталоге

    Function Rename()
{
$path = Get-Location
$files = Get-ChildItem
$counter = 1

foreach($file in $files)
    {
       Rename-Item $file.FullName "$counter" + ".xlsx"
       $counter++
    }
}

Затем я попытался с помощью файла c переименовать все листы, которые находятся внутри, но это не работает. L oop работает только один раз, пока у него 4 рабочих листа.

Function RenameTab ($ExcelFileName)
{
#Emplacement du fichier
$excelFile = "C:\Users\Donosaure\Documents\Magister\" + $excelFileName + ".xlsx"

#Ouverture d'excel
$xldoc =  New-Object -ComObject "Excel.Application"

#Message de confirmation
$xldoc.Visible = $false
$xldoc.DisplayAlerts = $false

#Ouverture du fichier
$workbook = $xldoc.Workbooks.Open($excelFile)
$inc = 1
$i=1
foreach ($worksheet in $workbook.Worksheets.count)
{
    $worksheet = $workbook.Sheets.Item($i)
    $worksheet.Name = $inc
    $inc++
    $i++

    $workbook.SaveAs("C:\Users\Donosaure\Documents\Magister\1.xlsx")
    $workbook.Close()
}
$xldoc.Quit()
}

RenameTab("Magister")

Кто-нибудь может мне помочь?

Спасибо за ваше время

1 Ответ

1 голос
/ 13 июля 2020

Несколько замечаний по поводу вашего кода:

  • Параметры, отправляемые функции в PowerShell, разделяются пробелом, вам не следует использовать квадратные скобки вокруг них, как в RenameTab("Magister")
  • Когда используя COM-объекты, всегда убедитесь, что вы освободили их из памяти, когда закончите, иначе они будут задерживаться в памяти, и если вы будете запускать это снова и снова, у вас будут исчерпаны ресурсы, иначе
  • Проверьте Excel Соглашение об именах рабочих листов , поэтому вы не создаете имена рабочих листов с недопустимыми символами. На данный момент это не так, но вы никогда не знаете, как это будет развиваться.
  • Пожалуйста, используйте соглашение об именах «Глагол-Существительное» PowerShell для создаваемых вами функций.

Ниже должно быть сделано то, что вы хотите:

Function Rename-ExcelTabs ($ExcelFileName) {
    #Emplacement du fichier
    $excelFile = "C:\Users\Donosaure\Documents\Magister\" + $excelFileName + ".xlsx"

    #Ouverture d'excel
    $xldoc =  New-Object -ComObject "Excel.Application"

    #Message de confirmation
    $xldoc.Visible = $false
    $xldoc.DisplayAlerts = $false

    #Ouverture du fichier
    $workbook = $xldoc.Workbooks.Open($excelFile)
    for ($i = 1; $i -le $workbook.Worksheets.Count; $i++) {
        $workbook.Sheets.Item($i).Name = $i
    }
    $workbook.SaveAs("C:\Users\Donosaure\Documents\Magister\" + $excelFileName + "_1.xlsx")
    $workbook.Close()
    $xldoc.Quit()

    # clean-up used COM objects
    $null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook)
    $null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($xldoc)
    [System.GC]::Collect()
    [System.GC]::WaitForPendingFinalizers()
}

Rename-ExcelTabs "Magister"

Согласно вашему комментарию, функцию можно переписать, чтобы не только изменить имена вкладок в одном файле Excel, но и обработать все файлы .xlsx внутри папки и также переименуйте эти файлы.

Одним из способов было бы удалить исходный файл после того, как вкладки были переименованы и новый файл был создан с $workbook.SaveAs(), как в приведенном выше коде.

Следующая функция делает это, сначала переименовывая файл, а затем меняя в нем имена вкладок.

function Rename-ExcelTabsAndFiles {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [ValidateScript({Test-Path -Path $_ -PathType Container})]
        [Alias('Path')]
        [string]$SourceFolder
    )
    # get a list of xlsx files
    $allFiles = Get-ChildItem -Path $SourceFolder -Filter '*.xlsx' -File

    # create an Excel object
    $xldoc = New-Object -ComObject Excel.Application

    # Message de confirmation
    $xldoc.Visible = $false
    $xldoc.DisplayAlerts = $false

    $fileCount = 1
    foreach ($excelFile in $allFiles) {
        # rename the file. use -PassThru to get the FileInfo object of the renamed file
        # apparently you want the files to be called '1.xlsx', '2.xlsx' etc.
        $newName = '{0}.xlsx' -f $fileCount++
        Write-Host "Renaming file '$($excelFile.Name)' to '$newName'"
        $excelFile = Rename-Item -Path $excelFile.FullName -NewName $newName -PassThru

        # Ouverture du fichier
        $workbook = $xldoc.Workbooks.Open($excelFile.FullName)
        # rename all worksheets in the file
        Write-Host "Renaming all worksheets in '$newName'"
        for ($i = 1; $i -le $workbook.Worksheets.Count; $i++) {
            $workbook.Sheets.Item($i).Name = $i
        }
        $workbook.Save()
        $workbook.Close()
    }

    $xldoc.Quit()

    # clean-up used COM objects
    $null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook)
    $null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($xldoc)
    [System.GC]::Collect()
    [System.GC]::WaitForPendingFinalizers()
}

Rename-ExcelTabsAndFiles "C:\Users\Donosaure\Documents\Magister"
...