如何将Excel工作簿合并为一个工作簿并命名工作表

时间:2019-05-29 12:51:21

标签: excel powershell

我试图在将工作表命名为复制的工作簿的文件名时将几个Excel工作簿合并为一个工作簿。

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

$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无法访问“新建”。该文档可以是只读的或加密的。 您不能在空值表达式上调用方法。

1 个答案:

答案 0 :(得分:0)

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

我不确定如何将工作表名称跟踪到各个工作簿以重命名它们,但是我强烈建议对所有与Excel相关的文件使用ImportExcel模块。它使他们更容易使用,仅需几秒钟即可使其正常工作。此外,它的好处是可以使用无需读取和编辑Excel文件而无需安装Microsoft 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))
}