首页 > 解决方案 > 如何将 Excel 工作簿合并为一个工作簿并命名工作表

问题描述

我正在尝试将多个 Excel 工作簿合并到一个工作簿中,同时将工作表命名为复制的工作簿的文件名。

我尝试在 for 循环内外移动 $Worksheet.Name 。它仍然只为新工作簿中的空工作表命名 - 将其命名为最后一个复制的文件。

$ExcelObject=New-Object -ComObject excel.application
$ExcelObject.visible=$true
$ExcelFiles=Get-ChildItem -Path C:\Users\u1\Documents\Testing

$Workbook=$ExcelObject.Workbooks.add()
$Worksheet=$Workbook.Sheets.Item("Sheet1")

foreach($ExcelFile in $ExcelFiles){

$Everyexcel=$ExcelObject.Workbooks.Open($ExcelFile.FullName)
$Everysheet=$Everyexcel.sheets.item(1)
$Everysheet.Copy($Worksheet)
$Worksheet.Name = [io.path]::GetFileNameWithoutExtension($ExcelFile) 
$Everyexcel.Close()
}

$Workbook.SaveAs("C:\Users\u1\Documents\Testing\New\merged.xlsx")
$ExcelObject.Quit()

新工作簿已创建 (merged.xlsx),但工作表都命名为 Sheet1(...),但一个空工作表被命名为目录中的最后一个文件。我也收到以下错误。Excel 无法访问“新建”。该文档可以是只读的或加密的。您不能在空值表达式上调用方法。

标签: excelpowershell

解决方案


您面临的问题是$Everysheet.Copy($Worksheet)调用正在复制值和工作表名称,$Everysheet并将其放在$Worksheet. 您可以在此处查看 Copy 方法的文档。

我不确定您如何将工作表名称跟踪到各个工作簿以重命名它们,但是我强烈建议对任何与 Excel 相关的文件使用ImportExcel模块。它使它们更易于使用,并且只需几秒钟即可使其正常工作。此外,它还具有无需安装 Microsoft Excel 即可使用读取和编辑 Excel 文件的好处。

您可以通过几行来完成您想要做的事情:

$exportExcelPath = "C:\Users\u1\Documents\Testing\New\merged.xlsx"

$excelFiles = Get-ChildItem -Path 'C:\Users\u1\Documents\Testing' -Filter "*.xlsx"
foreach ($excelFile in $excelFiles)
{
    Import-Excel -Path $excelFile.FullName | Export-Excel -Path $exportExcelPath -WorkSheetname ([io.path]::GetFileNameWithoutExtension($excelFile))
}

推荐阅读