提问人:jeriru 提问时间:9/12/2022 最后编辑:jeriru 更新时间:9/20/2022 访问量:165
使用 Powershell 检查多个工作簿中具有相同名称的工作表
Check Worksheet that has same names from Multiple Workbooks using Powershell
问:
我不知道如何解释这一点,但我正在尝试使用 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")
}
源文件中的工作表:
输出文件示例模板:
我很高兴学习这个,所以谢谢你花时间解决这个问题:)
答:
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 中制作新工作表并设置值。我认为这更容易、更简单。
评论
ImportExcel
模块定位特定工作表,这很简单,假设工作表只有一个表,输出与 (PsCustomObjects 数组) 给出的输出相同Import-Excel file.xlsx -WorksheetName sheetnamehere
Import-Csv