Powershell Excel 自动添加工作表
Powershell Excel Automating adding worksheet
我正在尝试自动为月度报告类型工作簿excel 中的每个客户名称添加工作sheet(含数据)
我认为它应该是直截了当的……但是我使用的方法不起作用……它甚至没有进入 sheet 制作模式……你能帮我想想吗找出我做错了什么?
下面是我做的函数
function Excelclientstatstemplate ($clients) {
$Exl = New-Object -ComObject "Excel.Application"
$Exl.Visible = $false
$Exl.DisplayAlerts = $false
$WB = $Exl.Workbooks.Open($excelmonthlysummary)
$clientws = $WB.worksheets | where {$_.name -like "*$clients*"}
#### Check if Clients worksheet exists, if no then make one with client name ###
$sheetcheck = if (($clientws)) {} Else {
$WS = $WB.worksheets.add
$WS.name = "$clients"
}
$sheetcheck
$WB.Save
# Enter stat labels
$clientws.cells.item(1,1) = "CPU Count"
$clientws.cells.item(2,1) = "RAM"
$clientws.cells.item(3,1) = "Reserved CPU"
$clientws.cells.item(4,1) = "Reserved RAM"
### Put in Values in the next column ###
$clientws.cells.item(1,2) = [int]($cstats.cpuAllocationGHz/2)
$clientws.cells.item(2,2) = [decimal]$cstats.memoryLimitGB
$clientws.cells.item(3,2) = [int]($cstats.rescpuAllocationGHz/2)
$clientws.cells.item(4,2) = [decimal]$cstats.resmemoryLimitGB
$WB.save
$Exl.quit()
Stop-Process -processname EXCEL
Start-Sleep -Seconds 1
Echo "$clients excel sheet in monthly summary is done.."
}
然后我尝试为它制作一个 Foreach 东西
$clientxlmonthlywrite = Foreach ($client in $clientlist){
$cstats = $Combinedstats | Where {$_.Group -eq "$client"}
Excelclientstatstemplate -clients $client
}
函数的整个过程
取客户名
打开特定的 excel 工作簿
检查是否有sheet客户名称
如果没有sheet客户名称,创建一个客户名称
用标签填充第一列单元格
用数据填充第二列单元格(数据有效我已经用它们编写了 CSV)
保存并退出
Foreach 变量只是为来自客户列表的每个客户名称执行函数(客户列表没有错)
我是不是搞砸了什么?
感谢您的帮助。
您没有正确调用 .Add()
方法。你错过了它末尾的括号。要修复它,您应该能够简单地将行修改为:
$WS = $WB.worksheets.add()
此外,单元格具有您应该参考的属性,因此我还将修改设置单元格值的部分,如下所示:
# Enter stat labels
$clientws.cells.item(1,1).value2 = "CPU Count"
$clientws.cells.item(2,1).value2 = "RAM"
$clientws.cells.item(3,1).value2 = "Reserved CPU"
$clientws.cells.item(4,1).value2 = "Reserved RAM"
### Put in Values in the next column ###
$clientws.cells.item(1,2).value2 = [int]($cstats.cpuAllocationGHz/2)
$clientws.cells.item(2,2).value2 = [decimal]$cstats.memoryLimitGB
$clientws.cells.item(3,2).value2 = [int]($cstats.rescpuAllocationGHz/2)
$clientws.cells.item(4,2).value2 = [decimal]$cstats.resmemoryLimitGB
我相当确定定义类型毫无意义,因为对于 Excel 它们都是字符串,直到您将单元格的格式设置设置为其他内容。我可能是错的,但这是我观察到的行为。
现在,对于您没有要求的其他评论...不要启动 Excel,打开书,保存书,然后为每个客户关闭 Excel。一开始打开Excel一次,打开书,为每个客户更新,然后保存,关闭。
测试客户端是否有sheet,需要时添加,然后select客户端的sheet后记。如果您必须为该客户添加一个,现在没有什么可以设置的 $clientws
。
添加作品sheet 默认情况下将其置于活动作品sheet 之前。在我看来,这是一个糟糕的设计选择,但事实就是如此。如果是我,我会在工作簿中添加新的 sheets 指定最后一个作品sheet,这将在最后一个之前添加新作品sheet,使其成为第二个上一部作品sheet。然后我将最后一个作品 sheet 移到新作品的前面,有效地将新作品 sheet 添加为最后一个列出的作品。制作时是否可以将新作品sheet添加为最后一个?是的,但对我来说太复杂了。如果您对此感兴趣,请参阅 here。
在测试现有客户端工作时sheet如果它丢失了,就做一个,不要告诉它测试什么,什么也不做,把你想要的一切都放在一个Else
语句。这只会使事情复杂化。综上所述,以下是一些已付诸实践的建议:
function Excelclientstatstemplate ($clients) {
#### Check if Clients worksheet exists, if no then make one with client name ###
if (($clients -notin $($WB.worksheets).Name)){
#Find the current last sheet
$LastSheet = $WB.Worksheets|Select -Last 1
#Make a new sheet before the current last sheet so it's near the end
$WS = $WB.worksheets.add($LastSheet)
#Name it
$WS.name = "$clients"
#Move the last sheet up one spot, making the new sheet the new effective last sheet
$LastSheet.Move($WS)
}
#Find the current client sheet regardless of if it existed before or not
$clientws = $WB.worksheets | where {$_.name -like "*$clients*"}
# Enter stat labels
$clientws.cells.item(1,1).value2 = "CPU Count"
$clientws.cells.item(2,1).value2 = "RAM"
$clientws.cells.item(3,1).value2 = "Reserved CPU"
$clientws.cells.item(4,1).value2 = "Reserved RAM"
### Put in Values in the next column ###
$clientws.cells.item(1,2).value2 = [int]($cstats.cpuAllocationGHz/2)
$clientws.cells.item(2,2).value2 = [decimal]$cstats.memoryLimitGB
$clientws.cells.item(3,2).value2 = [int]($cstats.rescpuAllocationGHz/2)
$clientws.cells.item(4,2).value2 = [decimal]$cstats.resmemoryLimitGB
Start-Sleep -Seconds 1
Echo "$clients excel sheet in monthly summary is done.."
}
$Exl = New-Object -ComObject "Excel.Application"
$Exl.Visible = $false
$Exl.DisplayAlerts = $false
$WB = $Exl.Workbooks.Open($excelmonthlysummary)
$clientxlmonthlywrite = Foreach ($client in $clientlist){
$cstats = $Combinedstats | Where {$_.Group -eq "$client"}
Excelclientstatstemplate -clients $client
}
$WB.save
$Exl.quit()
Stop-Process -processname EXCEL
我正在尝试自动为月度报告类型工作簿excel 中的每个客户名称添加工作sheet(含数据)
我认为它应该是直截了当的……但是我使用的方法不起作用……它甚至没有进入 sheet 制作模式……你能帮我想想吗找出我做错了什么?
下面是我做的函数
function Excelclientstatstemplate ($clients) {
$Exl = New-Object -ComObject "Excel.Application"
$Exl.Visible = $false
$Exl.DisplayAlerts = $false
$WB = $Exl.Workbooks.Open($excelmonthlysummary)
$clientws = $WB.worksheets | where {$_.name -like "*$clients*"}
#### Check if Clients worksheet exists, if no then make one with client name ###
$sheetcheck = if (($clientws)) {} Else {
$WS = $WB.worksheets.add
$WS.name = "$clients"
}
$sheetcheck
$WB.Save
# Enter stat labels
$clientws.cells.item(1,1) = "CPU Count"
$clientws.cells.item(2,1) = "RAM"
$clientws.cells.item(3,1) = "Reserved CPU"
$clientws.cells.item(4,1) = "Reserved RAM"
### Put in Values in the next column ###
$clientws.cells.item(1,2) = [int]($cstats.cpuAllocationGHz/2)
$clientws.cells.item(2,2) = [decimal]$cstats.memoryLimitGB
$clientws.cells.item(3,2) = [int]($cstats.rescpuAllocationGHz/2)
$clientws.cells.item(4,2) = [decimal]$cstats.resmemoryLimitGB
$WB.save
$Exl.quit()
Stop-Process -processname EXCEL
Start-Sleep -Seconds 1
Echo "$clients excel sheet in monthly summary is done.."
}
然后我尝试为它制作一个 Foreach 东西
$clientxlmonthlywrite = Foreach ($client in $clientlist){
$cstats = $Combinedstats | Where {$_.Group -eq "$client"}
Excelclientstatstemplate -clients $client
}
函数的整个过程
取客户名
打开特定的 excel 工作簿
检查是否有sheet客户名称
如果没有sheet客户名称,创建一个客户名称
用标签填充第一列单元格
用数据填充第二列单元格(数据有效我已经用它们编写了 CSV)
保存并退出
Foreach 变量只是为来自客户列表的每个客户名称执行函数(客户列表没有错)
我是不是搞砸了什么?
感谢您的帮助。
您没有正确调用 .Add()
方法。你错过了它末尾的括号。要修复它,您应该能够简单地将行修改为:
$WS = $WB.worksheets.add()
此外,单元格具有您应该参考的属性,因此我还将修改设置单元格值的部分,如下所示:
# Enter stat labels
$clientws.cells.item(1,1).value2 = "CPU Count"
$clientws.cells.item(2,1).value2 = "RAM"
$clientws.cells.item(3,1).value2 = "Reserved CPU"
$clientws.cells.item(4,1).value2 = "Reserved RAM"
### Put in Values in the next column ###
$clientws.cells.item(1,2).value2 = [int]($cstats.cpuAllocationGHz/2)
$clientws.cells.item(2,2).value2 = [decimal]$cstats.memoryLimitGB
$clientws.cells.item(3,2).value2 = [int]($cstats.rescpuAllocationGHz/2)
$clientws.cells.item(4,2).value2 = [decimal]$cstats.resmemoryLimitGB
我相当确定定义类型毫无意义,因为对于 Excel 它们都是字符串,直到您将单元格的格式设置设置为其他内容。我可能是错的,但这是我观察到的行为。
现在,对于您没有要求的其他评论...不要启动 Excel,打开书,保存书,然后为每个客户关闭 Excel。一开始打开Excel一次,打开书,为每个客户更新,然后保存,关闭。
测试客户端是否有sheet,需要时添加,然后select客户端的sheet后记。如果您必须为该客户添加一个,现在没有什么可以设置的 $clientws
。
添加作品sheet 默认情况下将其置于活动作品sheet 之前。在我看来,这是一个糟糕的设计选择,但事实就是如此。如果是我,我会在工作簿中添加新的 sheets 指定最后一个作品sheet,这将在最后一个之前添加新作品sheet,使其成为第二个上一部作品sheet。然后我将最后一个作品 sheet 移到新作品的前面,有效地将新作品 sheet 添加为最后一个列出的作品。制作时是否可以将新作品sheet添加为最后一个?是的,但对我来说太复杂了。如果您对此感兴趣,请参阅 here。
在测试现有客户端工作时sheet如果它丢失了,就做一个,不要告诉它测试什么,什么也不做,把你想要的一切都放在一个Else
语句。这只会使事情复杂化。综上所述,以下是一些已付诸实践的建议:
function Excelclientstatstemplate ($clients) {
#### Check if Clients worksheet exists, if no then make one with client name ###
if (($clients -notin $($WB.worksheets).Name)){
#Find the current last sheet
$LastSheet = $WB.Worksheets|Select -Last 1
#Make a new sheet before the current last sheet so it's near the end
$WS = $WB.worksheets.add($LastSheet)
#Name it
$WS.name = "$clients"
#Move the last sheet up one spot, making the new sheet the new effective last sheet
$LastSheet.Move($WS)
}
#Find the current client sheet regardless of if it existed before or not
$clientws = $WB.worksheets | where {$_.name -like "*$clients*"}
# Enter stat labels
$clientws.cells.item(1,1).value2 = "CPU Count"
$clientws.cells.item(2,1).value2 = "RAM"
$clientws.cells.item(3,1).value2 = "Reserved CPU"
$clientws.cells.item(4,1).value2 = "Reserved RAM"
### Put in Values in the next column ###
$clientws.cells.item(1,2).value2 = [int]($cstats.cpuAllocationGHz/2)
$clientws.cells.item(2,2).value2 = [decimal]$cstats.memoryLimitGB
$clientws.cells.item(3,2).value2 = [int]($cstats.rescpuAllocationGHz/2)
$clientws.cells.item(4,2).value2 = [decimal]$cstats.resmemoryLimitGB
Start-Sleep -Seconds 1
Echo "$clients excel sheet in monthly summary is done.."
}
$Exl = New-Object -ComObject "Excel.Application"
$Exl.Visible = $false
$Exl.DisplayAlerts = $false
$WB = $Exl.Workbooks.Open($excelmonthlysummary)
$clientxlmonthlywrite = Foreach ($client in $clientlist){
$cstats = $Combinedstats | Where {$_.Group -eq "$client"}
Excelclientstatstemplate -clients $client
}
$WB.save
$Exl.quit()
Stop-Process -processname EXCEL