使用 Powershell 检查多个工作簿中具有相同名称的工作表

Check Worksheet that has same names from Multiple Workbooks using Powershell

提问人:jeriru 提问时间:9/12/2022 最后编辑:jeriru 更新时间:9/20/2022 访问量:165

问:

我不知道如何解释这一点,但我正在尝试使用 Powershell 创建一个比较工具。 我有多个源文件,其中包含多个工作表,这些工作表与其他源文件同名。

我的问题是如何在相同的工作表名称下获取每个工作表的内容并将其粘贴到输出文件中,并生成与源工作表同名的新工作表。

到目前为止,我有这个,它可以复制每个工作表的内容。但是我在重命名工作表时遇到错误,因为它已经存在。我已经通过放置“If 语句”有了这个想法,但它让我对放置什么条件感到困惑。

ForEach($File in $Files){
$Source = $Excel.Workbooks.Open($File,$true,$true)
$SourceSheets = $Source.Worksheets

For ($i = 1; $i -le $SourceSheets.Count; $i++){
    # Select the current sheet of the Source
    $currentSheet = $Source.Sheets($i)
    # Copy the desired Range
    $currentSheet.Range("L6","M$(($currentSheet.UsedRange.Rows|Select -Last 1).Row)").Copy()

    # Add a new worksheet in Output and Rename it same as with the Source sheets
    $OutputSheet = $Dest.Worksheets.Add()
    $OutputSheet.Name = $Source.Sheets.Item($i).Name

    If ($OutputSheet.Name is already existing){
        Paste the Copied Contents from Source and Paste it in OutputSheet
    } Else {
        Add new Worksheet
    }
    
    $Dest.SaveAs("$ParentFolder\Output Folder\SampleOutput.xlsx")
}

源文件中的工作表:

Worksheets on Source Files

输出文件示例模板:

Output File

我很高兴学习这个,所以谢谢你花时间解决这个问题:)

Excel PowerShell 比较

评论

0赞 Santiago Squarzon 9/12/2022
您可以使用 ImportExcel 模块定位特定工作表,这很简单,假设工作表只有一个表,输出与 (PsCustomObjects 数组) 给出的输出相同Import-Excel file.xlsx -WorksheetName sheetnamehereImport-Csv
0赞 jeriru 9/12/2022
嗨:)我认为这行不通,因为我在 1 个工作簿下有多个工作表。我不想指定工作表名称。我试图遍历不同工作簿中的每个工作表,并将每个工作表的内容放在 1 个工作表名称下,该工作表名称与每个源文件的名称相同:)

答:

1赞 23whome 9/12/2022 #1

我以为你想知道如何遍历一本书中的所有纸张。

# $source = $excel.Workbooks.Open($File)
#Loop through sheets
for ($i = 1; $i -le $source.Sheets.Count; $i++){
    $currentSheet = $source.Sheets($i)
    #Do something on $currentSheet
}

对于第二个问题,我会像下面这样做。

# make a list for file you would like to look up
$files = @("File1.xlsx","File2.xlsx","File3.xlsx")
# loop through $files
for ($j = 0; $j -lt $files.Count; $j++){
    $FullPath = (Get-ChildItem -Path $files[$j]).FullName
    $source = $excel.Workbooks.Open($FullPath)
    #Do something on $source
}

我希望这会有所帮助。

#20-09-2022 添加

对于另一个问题,我会先得到所有工作表的名称。

# before the loop
$arraySheetNames = @()
# get all names
# if $outputFile not exists (make it later), you do not need following for-loop
for ($i = 1; $i -le $outputFile.Count; $i++) {
    $arraySheetNames += $outputFile.Sheets($i).Name
}

# in the loop
# check if the sheet already exists
if (-not $arraySheetNames.Contains($currentSheet.Name)) {
    # if the same name doesn't exist, add sheets and put 
    $OutputSheet = $Dest.Worksheets.Add()
    $OutputSheet.Name = $Source.Sheets.Item($i).Name
    $arraySheetNames += $OutputSheet.Name
}

评论

0赞 jeriru 9/12/2022
嗨:)这很有帮助!不过,有一件事,如何过滤每个工作簿中具有相同名称的工作表名称?我的方法是在输出文件上添加一个新工作表,但我看不到可以获取每个相同工作表的工作表名称并将其用作输出工作表名称的代码。
0赞 jeriru 9/12/2022
$OutputSheet = $Dest.Worksheets.Add() $OutputSheet.Name = $currentSheet.Name这就是我所做的,但显然它没有用......
0赞 23whome 9/13/2022
@jeriru对于第一条评论,你说的“申报者”是什么意思?要获取工作表的名称,应该可以工作。然后,设置工作表的名称,应该可以工作。$currentSheetName = $currentSheet.Name$OutputSheet.Name = $currentSheetName
0赞 jeriru 9/13/2022
嗨,@23whome,感谢您回答我的问题:)我编辑了我的帖子,所以我可以澄清我的问题......这是关于错误的:这个名字已经被占用了。尝试不同的。因为我有同名的工作表。
0赞 23whome 9/14/2022
嘿,@jeriru为什么不先获取所有值(包括工作表的名称)并将它们放入变量(可能是 2D 数组)中,然后在 OutputFile 中制作新工作表并设置值。我认为这更容易、更简单。